8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Mac版ExcelでVBAのDictionaryを使えるようにするまで

Last updated at Posted at 2020-01-09

Mac版のExcelを使ってVBAを開発していると使えない機能があって嫌になることが投げ出したくなることが、VBAの勉強を初めて1週間で、すでに2回もありました。(いやもっとあったけど、Macに限る話じゃないからカウントしません。)

1つ目は、ユーザーフォームを開発できない
これ致命的じゃないでしょうか?マイクロソフトさん。2011年のMac版Excelでは使えていたみたいですけど、2016年版くらいから使えなくなったという、後のバージョンで使えなくなるというマイクロソフトさんお得意の、機能を減らして新バージョンを購入させる戦法ですね。。

2つ目は、Mac版ではDictionaryが使えないということ。これも致命的というか、もうVBAはMacで開発できない、動かないと言っているようなもの。ユーザーフォームが使えないのは妥協しても流石に根幹的な機能であるDictionaryが使えないのは、許せなかったので(というかそれくらいで勉強をやめてしまっては勿体無いので)少し調べてみたら、案外簡単にできました。簡単だったと言っても少し手こずったのでやったことまとめてみました。

1、StackoverflowでDictionary.clsとKeyValuePair.clsをダウンロードする
2、以上の2つのファイルをプロジェクトのimportする
3、使う。ただし、For EachでValueを取り出すときは一手間必要

まず1はStackoverflowのこのページへ飛んでVBA (Excel) Dictionary on Mac?
sysmodさんの回答からZipファイルをもらってください。(または直接貼っておきますダウンロード

そして2はプロジェクトを選択して、2つの.clsをimport
(この際、.clsファイルの中のattribute等は一切変更しなくて大丈夫です。)

最後に3ですが、あとはクラスからインスタンス作って、ドット以降自動で候補を上げてくれるようになるんですが、For Each でValueを取り出す時にコンパイルエラー Compile error: ByRef argument type mismatch が出てしまうので一作業が必要。

まず直接変数をItem()の引数にすると上記のエラーが出るので、一度別の変数に格納してから、その変数をItem()の引数として渡せばうまく動くようになります。

For Each vKey In vKeys Dim k As String: k = vKey Debug.Print k & " = " & dict.Item(k) Next

以上、Mac版ExcelでVBAのDictionaryを使えるようにするまででした。
将来的にはユーザーフォームなども開発してみたいので、いずれにしてもWindow環境を検討していますが、しばらくの間はMacで開発できるところまで頑張ってみたいと思っています。

8
3
4

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
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?