VBAの勉強を始めてみた

色々試しています。

参照設定なしでインスタンスを生成する

よくよく考えれば、マクロを使う前に参照設定をして下さい・・・と言うのは、家に来られたお客様に「お茶はセルフサービスです」といっているようなものです。これからは参照設定しなくても使えるコードを掲載していきます。

 

お客様が参照設定しなくても(参照設定について考えなくても)マクロを使用できるようにするには以下が考えられます。
・参照設定を自動で行うコードを追記する
・参照設定なしでインスタンスを生成する(CreateObject)

まず最初に思い浮かんだのが、一つ目の「参照設定を自動で行うコードを追記する」ですが、これをやるためには、事前にマクロのセキュリティから、「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」にチェックをつけておく必要があります。せっかく、手間無くマクロを使えるようにしようとしているのに、新たな手間が発生してしまいますね・・・。「お茶は入れてあげるけど、茶葉は来る途中で買ってきて☆」と言っているのと同じようなもんです。

で、残されるのは2つめです。
通常は、

Dim myLib As XX
Set myLib = New XX

 

のようにインスタンスの生成を行いますが
代わりに、

Dim myLib As Object
Set myLib = CreateObject("XX")

 

という記述をします。XXにはオブジェクトの「アプリケーション名.オブジェクトタイプ」が入ります(例えば「Scripting.FileSystemObject」のように)。CreateObjectで「アプリケーション名.オブジェクトタイプ」が使えないものは代わりに「GUID」を指定します。(GUIDについては別途記載しようと思います)
この方法で参照設定せずに外部ライブラリのオブジェクトをインスタンス化することができます。

前者は事前バインディング、後者は遅延バインディング(実行時バインディング)と呼ばれるそうです。じゃあぜんぶ、参照設定の要らない遅延バインディングでいいんじゃね?と思うかもしれません。・・・が、マイクロソフトのヘルプによると
「可能な場合は、事前バインディングされたオブジェクトを使用してください。これによって、コンパイラは、アプリケーションをより効率的にする重要な最適化を実行できます。事前バインディングされたオブジェクトは遅延バインディングされたオブジェクトよりも処理が高速です。また、使用されているオブジェクトの種類が明確になるため、コードがより読みやすくなり、保守も簡単になります。事前バインディングのその他の利点として、自動コード補完やダイナミックヘルプなどの便利な機能が有効になります。」
なのだそうです。
しかし・・・お客様にマクロを手間無く使ってもらいたいので、処理時間としてどれくらい違うのか、事前バインディングと遅延バインディングでそれぞれ時間計測してみようと思います。そのうえで処理時間に違いがないようであれば、ブログに掲載するコードについてはすべて遅延バインディングにしたいと思います。

 

クリップボードのデータを結合セルへ貼り付け
を1万データを対象に処理時間を計ってみます。(コードの始まりと終わりにTime関数を入れて引き算します)

事前バインディングにした場合

f:id:kouten0430:20171019233828j:plain

 

遅延バインディングにした場合

f:id:kouten0430:20171019233828j:plain

 

画像の使いまわしではありません。何回やっても、どちらも0~1秒程度であります(`_´)ゞ。実運用上問題ないと判断・・・。