精選
[Excel VBA] 誰能搶先說出這個程式在做什麼?
2009/03/27 18:34
瀏覽4,032
迴響4
推薦2
引用0
這個程式在 Word, Excel, Powerpoint 都可以執行,誰能說出它在做什麼?
請利用 "回應" 寫出您的解讀。
Option Base 1
Sub DoSomething()
Dim bytes(9) As Byte
Dim byteno As Long, wordcnt As Long, low As Long, high As Long
Dim byteno As Long, wordcnt As Long, low As Long, high As Long
fnum = FreeFile
byteno = 1
wordcnt = 1
Open "C:\ABC.txt" For Binary As #fnum
For high = &H81 To &HFE
For low = &H40 To &HFE
If Not ((high = &HA3) And (low >= &HC0)) Then
If (low <= &H7E) Or (low >= &HA1) Then
bytes(1) = Asc(Mid(Hex(high), 1))
bytes(2) = Asc(Mid(Hex(high), 2))
bytes(3) = Asc(Mid(Hex(low), 1))
bytes(4) = Asc(Mid(Hex(low), 2))
bytes(5) = Asc(" ")
bytes(6) = high
bytes(7) = low
If (wordcnt Mod (8)) <> 0 Then
bytes(8) = Asc(" ")
bytes(9) = Asc(" ")
Else
bytes(8) = 13
bytes(9) = 10
End If
Put #fnum, byteno, bytes
wordcnt = wordcnt + 1
byteno = byteno + 9
End If
End If
Next low
Next high
Close fnum
byteno = 1
wordcnt = 1
Open "C:\ABC.txt" For Binary As #fnum
For high = &H81 To &HFE
For low = &H40 To &HFE
If Not ((high = &HA3) And (low >= &HC0)) Then
If (low <= &H7E) Or (low >= &HA1) Then
bytes(1) = Asc(Mid(Hex(high), 1))
bytes(2) = Asc(Mid(Hex(high), 2))
bytes(3) = Asc(Mid(Hex(low), 1))
bytes(4) = Asc(Mid(Hex(low), 2))
bytes(5) = Asc(" ")
bytes(6) = high
bytes(7) = low
If (wordcnt Mod (8)) <> 0 Then
bytes(8) = Asc(" ")
bytes(9) = Asc(" ")
Else
bytes(8) = 13
bytes(9) = 10
End If
Put #fnum, byteno, bytes
wordcnt = wordcnt + 1
byteno = byteno + 9
End If
End If
Next low
Next high
Close fnum
End Sub
你可能會有興趣的文章:
迴響(4) :
- 4樓. Andy2009/04/02 17:45西歐語系問題
最近有遇到這樣的問題,我已經放上MSDN的討論區,但是還沒有人回答
http://social.msdn.microsoft.com/Forums/zh-TW/805/thread/ba15d89d-2321-4743-93a8-f6244e9daa13
這部份的問題,我想已經超出VBA的範圍了,應該是Office本身設計問題所造成的
只是目前還不知道怎麼解決。
遇到這個問題的原因,是最近幫公司採購部門建立了一個完整的UserForm要輸入單子
由原本的一串資料改成UserForm表單方式,果然效率高出許多
但可惜的是要輸入特殊字元就必須放棄,因為打不出來..
VBA程式的部份,最近在看Windows API的應用,感覺可以做出很多東西
但是對Windows API也不是很熟,還在摸索中,有機會可以一同討論
我的聯絡方式 ie321 at hotmail.com <-這樣寫應該看得懂吧?
- 3樓. Andy2009/04/01 05:06高手啊!
目前工作上剛接觸到VBA 不久,所以都是東湊西湊來寫程式,不過用紀錄下來的方式再修改與純粹寫程式真的差蠻遠的,您的blog有許多可以讓我借鏡的地方,希望您能繼續寫作下去喔!
謝謝!過獎啦!不敢當 "高手", 只是 "愛現" 罷了!
首頁「推薦連結」裡的那些才是真正的高手。
不知道您 "工作上" 有什麼需要用到 VBA 的?也可以給我一點方向,或許我可以寫,或已有以前累積下來的程式可以優先拿出來分享。
ThisIsTheWay 於 2009/04/01 22:06回覆 - 2樓. 瘦骨2009/03/29 00:09我所看懂得部份
line 2: 程式名稱: DoSomething
line 9-10: 用兩個 for loop 定義兩組16進位碼的所有組合
第一組16進位碼由 "81" 開始,稱為 "hight"
第二組16進位碼由 "40" 開始,稱為 "low"
line 12: 設定極限值: hight不大於 A3, low 不大於 C0,在此範圍內排出hight-low 組合
line 13-16: 在迴圈內部執行的部份:先以 mid() 擷取局部的字串,例如 for loop 的第一圈 high=81 low =40,
bytes(1)到 bytes(4) 的傳回值各 為8, 1, 4, 0, 以 ASCII code 標出
linr 17: byte(5) 為空字串
line 18-19: byte(6) 和 byte(7) 為 high 和 low 的組合碼
line 20: 每滿八筆結果,依 line 21-25 作填空字串或換行動作
line 21-22: byte (8) (9) 為空字串
line 24-25: 若high, low 的值在設定極限之外,指byte (8) (9)定其值為 13 和 10
line 27: 寫入結果到c:\ABC.txt 內
line 28-29: 累計 word 和 byte 總數
line 30-34: if 條件與for loop 迴圈控制碼
-----------------------------------------------------------------------------
我猜,這是將雙位元碼列出來的程式,我不是很懂雙位元碼列的細節,這些碼和用來定義中文的 Big5 碼,或是 Unicode 是不是有點關係?
真高興得到 Andy 和瘦骨的迴響。兩位都好棒!
Andy 把程式實際跑過,看了 ABC.TXT 的內容,就知道 "這東西" 是 『Big5 內碼表』。
瘦骨兄更用心地幫我把程式的註解都寫好了!
如瘦骨兄所說的 "這是將雙位元碼列出來的程式",Big5碼是由兩個bytes所組成,所以在這個程式裡我用了 Byte 這種型別的陣列,把迴圈的索引值 high 和 low 兩個變數值填入陣列中相鄰的兩個元素:Byte(6) 和 Byte(7),這兩個位元組就構成一個中文 Big5碼。
維基百科中對 BIG5 碼的說明在這兒:http://zh.wikipedia.org/w/index.php?title=%E5%A4%A7%E4%BA%94%E7%A2%BC&variant=zh-hant
節錄其中關於 "字節結構" 的描述:
「Big5碼是一套雙位元組字符集,使用了雙八碼儲存方法,以兩個字節來安放一個字。第一個字節稱為「高位字節」,第二個字節稱為「低位字節」。 「高位字節」使用了0x81-0xFE,「低位字節」使用了0x40-0x7E,及0xA1-0xFE。」
所以,程式裡用 if ...then 把不屬 Big5 碼的值濾掉,若你去看維基百科,關於字節結構的描述裡有一個表,說明Big5裡有三個區段是保留給使用者造字的,還有一個保留的區段沒有開放給使用者造字,那就是 &HA3C0~&HA3FE,所以程式裡特別把這一段濾掉。
比較了解 Byte 這個資料型別的人就知道,以 bytes 這個陣列而言,元素 bytes(1) 的記憶體位址最低,bytes(9) 的記憶體位址最低。那為何把 high 放在 bytes(6) 而 low 放在 bytes(7) 呢?這不是放反了嗎?
? ? ?
ThisIsTheWay 於 2009/03/29 16:38回覆 - 1樓. Andy Chiu2009/03/27 23:46呼~
看了一下,指知道循環輸出什麼資料到C:\abc.txt
跑了一下就知道答案了,原來這東西要這樣寫啊!
以前在dos時代也看過,Palm上面也有人寫過
沒想到在VBA裡是這樣撰寫,感謝您,受益斐淺啊! ^_^
是啊!我以前用 Assembly 和 C 寫過,C 最容易寫這種東西。
因為先前在知識+有人問 VBA 可不可以做到,我才用VBA寫了這個程式。
ThisIsTheWay 於 2009/03/28 17:53回覆