使用情境如下圖,我已經在Excel中做好一串16進字字串,想要輸出成.bin檔(如第二張圖)
最理想是可以直接複製貼上,有一些文字編輯器可以做到,但這樣移植性太差,要分享給其他人用的時候太麻煩了,後來找到這個線上工具 HEX to file(binary) Converter 還不錯用,還會自動濾掉空格、逗號、0x等等多餘的字元,但需要 複製文字→開網頁→貼上→轉換→存檔→開檔 好幾個步驟才能得到結果,還是有點麻煩。
後來注意到網站下面有附上原始碼以及執行檔,於是花了點時間研究如何把它跟Excel對接。這個執行檔的功能是輸入.txt並輸出.bin,無奈功力不夠沒能成功改成直接貼上文字就能運作,於是退而求其次,使用Excel VBA製作一個中繼的文字檔,並操作CMD將文字檔輸入exe,得到我要的檔案並直接開啟。
以下是VBA的程式,製作按鈕及設定巨集的過程不在這邊贅述
Sub 按鈕284_Click()
Dim MYstr As String
For Each c In Range("C3:R18")
MYstr = MYstr + c.Value
Next c
Open ThisWorkbook.Path & "\BINtemp.txt" For Output As #1
Print #1, MYstr
Close #1
CMD = "cmd /k cd " & ThisWorkbook.Path & _
"&& .\hex2bin.exe --i BINtemp.txt --o OUT.bin" & _
"&& del BINtemp.txt" & _
"&& start .\OUT.bin" & _
"&& exit"
Dim myret
myret = Shell(CMD, 1)
End Sub
分成三個部分:
以上
========================= 2023/10/13 更新 =========================
最近發現上面的寫法在碰到路徑名稱有空格時會報錯,解法是在路徑外面加上雙引號「"」,寫法如下:
CMD = "cmd /k cd " & """" & ThisWorkbook.path & """" & _
"&& .\hex2bin.exe --i BINtemp.txt --o OPtable.bin" & _
"&& del BINtemp.txt" & _
"&& start .\OPtable.bin" & _
"&& exit"
其中有2組4個連續的雙引號,前後2個將中間的2個表示為字串(VBA),到了CMD會將中間2個雙引號解釋為1個雙引號,希望下面的說明可以幫助理解:
"cd " & """" & "folder 1/file" & """" <= 完整程式的寫法
cd ""folder 1/file"" <= VBA組出來的字串,也就是傳到CMD的字串
cd "folder 1/file" <= CMD執行的指令,其中路徑有空格,加了雙引號才能正常執行
========================= 2023/11/14 更新 =========================
今天又發現一個bug,原本CMD打開來的路徑是在C槽,若Excel路徑是放在D槽中,原本的程式會cd不到D槽造成路徑錯誤,而修正方法是在 cd之後加上 \d 便可解決,經測試在C槽及D槽下都能正常使用。修改後的指令如下:
CMD = "cmd /k cd /d" & """" & ThisWorkbook.path & """" & _
"&& .\hex2bin.exe --i BINtemp.txt --o OPtable.bin" & _
"&& del BINtemp.txt" & _
"&& start .\OPtable.bin" & _
"&& exit"
沒幾行程式也能有這麼多bug,希望不會再有更新了。
========================= 2024/01/23 更新 =========================
感謝下面大大的建議,多掛一個exe的確蠻麻煩的,直接用VBA解決就好了,結合之後程式碼如下:
Sub 產生BIN檔()
Dim row
Dim col
Dim i
Dim handle As Long
handle = FreeFile
Open ThisWorkbook.Path & "\BIN_File.bin" For Binary As #handle
For i = 0 To 255
row = Int(i / 16)
col = i Mod 16
Put #handle, , CByte("&H" & Range("J3").Offset(row, col))
Next i
Close #handle
CMD = "cmd /k cd /d" & """" & ThisWorkbook.Path & """" & _
"&& start .\BIN_File.bin" & _
"&& exit"
Dim myret
myret = Shell(CMD, 1)
End Sub