Excel VBA

【Excel VBA】【マクロ】【Tips】Excel for Macで保存するとコードの「¥」が消える!?

こんにちは!Lenocoです。本日も見てくださりありがとうございます。

前回に引き続き実案件の話をしたいと思います!
今回はExcel for Macについてです。

WindowsとMacどちらでも使えるマクロを作る際の注意点

MacでExcel?

普段Windowsしか使わないわたしにはMacは未知の領域ですが、
MacでもExcelっぽいものが使えるというのはうっすらと知っていました。
調べてみたところ、Microsoftが提供している「Office Online」(フリーだけど機能制限あり)や、
Microsoft 365を購入するなどいくつか方法があるみたいです。

詳しくはMicrosoftのページを見てみてくださいね

WindowsとMacのExcel VBAには違いがある

やっかいなのは、WindowsとMacではVBAの挙動に違いがあるということです。
たとえば、ファイル取得で使用するDir関数、Macでは使用できないようです。
また、フォルダ指定に使うFileDialogオブジェクトもMacには対応していませんでした。
パスの区切もWindowsとMacでは異なり、Windowsでは「\」、Macでは「/」となっています。
今回実装したマクロで、「フォルダ指定→ファイル取得」という動作があったので、
Windows用に作成したマクロがMacで全く動かずとても苦戦しました・・・!

Windows、Macどちらでも動くマクロにしたい

クライアントの依頼として、Windows、Macどちらでも動くマクロにしてほしいということだったので、
まずはWindowsに対応したものを作成し、
クライアント側のMacで動作確認してもらい動かない部分を修正していく、という対応をしていました。

Lenoco側にはMac環境がないので・・

WindowsとMacで動作を分岐する方法はとても簡単で、以下のコードを使用しました。

If Application.OperatingSystem Like "*Windows*" Then
    'Windowsの処理
ElseIf Application.OperatingSystem Like "*Mac*" Then
    'Macの処理
End If

こんな簡単に区別できるのはとても助かりました。
動かない部分はネットで調べて別のコードに置き換えてみたり、試行錯誤を重ねました。
そしてやっと完成したマクロを最終確認してもらったところ、
なんとMacではなくWindowsでマクロが動かないとのこと(´;ω;`)ウゥゥ
全く動かないわけではなく、ファイル取得部分がうまく動いていないという感じでした。

動かない原因は、保存?

こちらの環境(Windows)では動いているのに、なぜ・・TTと思い、
クライアント側で動かないマクロを送付してもらい、動くものとコードを比較してみたところ、
違いがありました!
なんと、Windowsのコード内の「\」が消えてしまっていました。

えぇぇぇーーーー!!?

ファイル取得の処理内で、パスを生成するために「\」を使っていたのですが、
これが消えてしまってはファイルを取得することができません。

クライアントに確認したところ、Macでファイルを保存→Windowsで動作確認を行ったとのこと。
まさかコードが変わってしまうとは、想定外でした。。

対応策

結論としては、Chr関数を使い、「\」に対応する文字コードに置き換えました。
Chr関数は、指定した文字コードに対応する文字を返してくれます。
「\」の文字コードは92番です。
↓変数folderPathには、すでにパスが入っていると想定してください。

コード

If Application.OperatingSystem Like "*Windows*" Then
    'Windowsの処理
    'テキストファイルを探す
    target = Dir(folderPath & "\*.txt")             '①最初の状態
    '-----------------------------------
    target = Dir(folderPath & "*.txt")              '②Macで保存されたあと(ファイルが取得できない)
    '-----------------------------------
    target = Dir(folderPath & Chr(92) & "*.txt")    '③「\」をASKIIコードで置換(ファイルが取得できる!)
    
ElseIf Application.OperatingSystem Like "*Mac*" Then
    'Macの処理
End If

説明

①の状態では、Windowsで動くのですが、
Macで保存することによって②の状態となり、「\」が消えてしまいます。
②でも動きそうな感じがするのですが、ファイル取得ができませんでした。
③で、「\」が消えてしまわないようChr(92)に置き換えることで、
Macで保存したあともWindowsで正しく動作してくれました。

さいごに

手元でデバッグできない分、かなり手ごたえがありましたが、
Macの環境では挙動がいろいろ異なるということがわかり、とても勉強になった案件でした。
たくさん検索しましたが、Excel for Macについての記事は少なかったです。
この記事が困っている人の目に触れますように!

Lenoco

COMMENT

メールアドレスが公開されることはありません。