31
28

More than 5 years have passed since last update.

MacでVBAを書く時の注意

Last updated at Posted at 2018-12-20

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の嫌がらせかと思うくらいひどかったので、もうやりたくないです。

31
28
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
28