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

POSTED COMMENT

  1. アバター おたま より:

    ずっと困っていたことについて書いてくださって本当にありがとうございました!
    とても有益な情報でありがたいです。

    すみません。少し合わせてご教示くださいませ。
    今回の記事でご提示いただいたコードですが、既存のコードがある場合どの部分に付け足したら良いのでしょうか。
    マクロ初心者なため、基本的なことも理解していないことが多く、申し訳ございません。

    ご教示いただければ幸いです。
    よろしくお願い申し上げます。

    • lenoco-2021 lenoco-2021 より:

      コメントありがとうございます!お役に立ってよかったです^^*
      ③の「target = Dir(folderPath & Chr(92) & “*.txt”)」がMacで保存後、Windowsでも正しく動く状態です。
      既存コードがあるとのことなので、「\」(円マーク)の部分を「Chr(92)」としていただければ大丈夫かと思います。
      ※改めて投稿を自分で読んで、少しわかりづらかったかなと思いました。すみません。
      また不明点などあればコメントください!

  2. アバター おたま より:

    ご返信ありがとうございます!
    御礼遅くなり失礼いたしました。

    ご教示いただいた内容でトライしてみたいと思います! :)

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です