11月07日
Excel for mac(2011) VBAの内部コードはSJIS?
Excel for mac のVBA でexecShell
StackoverflowにVBAでpopenを使った呼び出し方法がありました。
http://stackoverflow.com/questions/6136798/vba-shell-function-in-office-2011-for-mac
dllの代わりにdylibの関数も呼び出せるんですね。
Private Declare Function system Lib "libc.dylib" (ByVal command As String) As Long
Private Declare Function popen Lib "libc.dylib" (ByVal command As String, ByVal mode As String) As Long
Private Declare Function pclose Lib "libc.dylib" (ByVal file As Long) As Long
Private Declare Function fread Lib "libc.dylib" (ByVal outStr As String, ByVal size As Long, ByVal items As Long, ByVal stream As Long) As Long
Private Declare Function feof Lib "libc.dylib" (ByVal file As Long) As Long
popenで呼び出すことができるメリット
内蔵されているShell関数は、コマンドを実行することができますが、
そのコマンドが標準出力等へ出力した結果を直接得ることができません。
popenを使うことで、
osxのシェル系コマンドを呼び出して、コマンドの実行結果をVBA内で得ることが
できます。
VBAでpopen
早速、execShellの呼び出しを確認してみます。
execShell("pwd", exitCode)の結果は、/(root)でした。
execShell("locale", exitCode)の結果は、C (英語圏)でした。
execShell("echo あいうえお", exitCode)とすると”あいうえお"がイミディエイトに出力されます。
ふと、ここで疑問が・・Windows系のVBA、標準文字コードはUnicodeと言われていますが
Macでは?
execShellでVBA(mac)の文字コードを確認
execShell("echo ""あいうえお"">/tmp/a.txt", exitCode)
として実行し、odコマンドで出力されたコードを確認します。
$ od -x /tmp/a.txt
0000000 a082 a282 a482 a682 a882 000a
0000013
Unicodeの「あ」は、U+3042(http://ja.wikipedia.org/wiki/Unicode一覧_3000-3FFF)ですが、
a082
IntelCPUを使っているのでリトルエンディアンなので、
実際のコードは、82a0=Shift_JISっていうことになります。
本当にSJISなのか?
String型をByte型に変換して、中身を確認してみます。
Sub Test2()
Dim b() As Byte
Dim s As String
s = "1234567890あいうえお"
b = s
For i = LBound(b) To UBound(b)
Debug.Print i & ": " & Hex(b(i))
Next i
End Sub
結果は、4230 -> 3042でUnicodeの「あ」です。
0: 42
1: 30
???
VBAから呼び出したpopenで渡される「あ」は、SJIS。
VBA内の「あ」は、Unicode。
[ACC2000] Unicode と文字列操作関数の留意点 のANSI形式で保持されていて、VBAのObjectを経由するとUnicodeになっているってことなんでしょうか・・
もう少し、学習が必要そうです。
コメントシステムを利用したくない方は お問い合わせ からお願いします。
2013.8.19 DISQUS(外部コメントサービス)の利用を開始しました。
Facebook, google, Twitter等のアカウントで投稿可能です。