Help us understand the problem. What is going on with this article?

MacでVBAを書く時の注意

More than 1 year has passed since last update.

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした