Excel For MacでVBAを保守する機会がありましたので、メモしておきます。
MacとWindowsの見分け方
そもそもMacとWindowsで挙動が異なるので、どうしても処理を分ける必要があります。
見分けるために、以下のようなコードを書きました。
Function isMac()
Range("F1").Formula = "=INFO(""osversion"")"
Range("G1").Formula = "=INFO(""system"")"
If InStr(Range("F1").value, "Macintosh") > 0 Or InStr(Range("G1").value, "mac") > 0 Then
isMac = True
Else
isMac = False
End If
End Function
追記:コンパイラ定数を使用した方法はこちらになります。
Function isMac()
#If Mac Then
isMac = True
#Else
isMac = False
#End If
End Function
ファイルパス区切り文字の差分吸収
今回のVBAでは、ファイル出力機能がありました。ご存知の通り、MacとWindowsではファイルパスの区切り文字が
異なるので、普通にやっても動かないです。そのため、以下のような関数を作りました。
追記:単純にファイルパスの区切り文字が欲しい場合は、下記の関数を書かずとも、Application.PathSeparatorプロパティから取得できます。
Function FILE_SEPARATOR()
If isMac() Then
FILE_SEPARATOR = "/"
Else
FILE_SEPARATOR = Chr(92)
End If
End Function
バックスラッシュが入力できない・・・
Excel For MacのVisual Basic Editorでは、パックスラッシュが入力できず、しかも
Windowsマシンで書いたバックスラッシュ(Asciiコードの5C)が表示すらできない、という悲劇がおきました。
表示されない、かつ文字化けすらしていないので、表示上消えているんですが、存在はしている、という状態です。
そのため、プログラム中のバックスラッシュを全てChr(92)に置き換えました。
バックスラッシュをファイル出力した時、文字化けする
Chr(92)をutf-8で出力しようとしたのですが、内部的に5C -> C2A5へと変換されてしまいました。
これを防ぐため、Chr(92)ではなく、ChrW(&H5C)でunicodeで指定することで回避しました。
セル内改行の置換には、vbLfではなくvbCrを使う
If isMac() Then
tmp = Replace(str, vbCr, "new Line")
Else
tmp = Replace(str, vbLf, "new Line")
End If
なぜかMacでは、vbCrのようです。
まとめ
Excel for MacのVisual Basic Editorでは、そもそも、2バイト文字上でキャレットがずれてしまったり、マウスホイールのスクロールが全然効かなかったりなど、Microsoftの嫌がらせかと思うくらいひどかったので、もうやりたくないです。