網路城邦
上一篇 回創作列表 下一篇   字體:
[Excel VBA] 誰能搶先說出這個程式在做什麼?
2009/03/27 18:34:53瀏覽3802|回應4|推薦2

這個程式在 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
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
End Sub

( 興趣嗜好電腦3C )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=WayCheng&aid=2788657

 回應文章

Andy
西歐語系問題
2009/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 <-這樣寫應該看得懂吧?

ThisIsTheWay(WayCheng) 於 2009-04-03 13:13 回覆:
我試了一下,Textbox 一直會把那些字母當成中文,
我也想知道這種問題如何解!

Andy
高手啊!
2009/04/01 05:06
目前工作上剛接觸到VBA 不久,所以都是東湊西湊來寫程式,不過用紀錄下來的方式再修改與純粹寫程式真的差蠻遠的,您的blog有許多可以讓我借鏡的地方,希望您能繼續寫作下去喔!
ThisIsTheWay(WayCheng) 於 2009-04-01 22:06 回覆:
謝謝!過獎啦!不敢當 "高手", 只是 "愛現" 罷了!
首頁「推薦連結」裡的那些才是真正的高手。

不知道您 "工作上" 有什麼需要用到 VBA 的?也可以給我一點方向,或許我可以寫,或已有以前累積下來的程式可以優先拿出來分享。





瘦骨
等級:7
留言加入好友
我所看懂得部份
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 是不是有點關係?


ThisIsTheWay(WayCheng) 於 2009-03-29 16:38 回覆:
真高興得到 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) 呢?這不是放反了嗎?

? ? ?



Andy Chiu
呼~
2009/03/27 23:46
看了一下,指知道循環輸出什麼資料到C:\abc.txt
跑了一下就知道答案了,原來這東西要這樣寫啊!
以前在dos時代也看過,Palm上面也有人寫過
沒想到在VBA裡是這樣撰寫,感謝您,受益斐淺啊! ^_^
ThisIsTheWay(WayCheng) 於 2009-03-28 17:53 回覆:
是啊!我以前用 Assembly 和 C 寫過,C 最容易寫這種東西。
因為先前在知識+有人問 VBA 可不可以做到,我才用VBA寫了這個程式。