
EXCEL VBAにて
Dictionaryオブジェクトを利用しようと思い
ネット検索して調べていると・・・
1)Dim MyDic As Object
Set MyDic=CreateObject("Scripting.Dictionary")
2) Dim MyDic As Scripting.Dictionary
Set MyDic = New Scripting.Dictionary
3) Dim MyDic
Set MyDic=CreateObject("Scripting.Dictionary")
4) Dim myDic As New Scripting.Dictionary
上記の4パターンが出てきました。
いずれも「連想配列」を使うものなのですが、
オブジェクト型、バリアント型、Newキーワードで宣言・・・
4つの違いがイマイチ理解できません。
違いを教えてください。
No.2ベストアンサー
- 回答日時:
1)Dim MyDic As Object
Set MyDic=CreateObject("Scripting.Dictionary")
参照設定無しで扱う場合
2) Dim MyDic As Scripting.Dictionary
Set MyDic = New Scripting.Dictionary
有りで・・
3) Dim MyDic
Set MyDic=CreateObject("Scripting.Dictionary")
無しで
4) Dim myDic As New Scripting.Dictionary
有りで
だけでは分からないので、用途・環境の面で考えてみました。
今回の場合は、Scripting.Dictionary なのでWindows2000の頃からバージョンは変わっていないので
説明しやすくするために、AccessからExcelをオートメーションで扱う例で説明します。
Scripting.Dictionary → Excel.Applicationです。
Excelに参照設定を行う場合はバージョンによって、Microsoft Excel xx.x Object Libraryの
xx.x が変わってくるのはご存知かと思います。
参照設定を行ってコーディングすれば、Excelのプロパティなどが自動表示されるので非常に楽ちんです。
Excelの定数もそのまま使えます。
ただ、2003に参照設定して作成したものを2010がインストールされている環境で使おうとした時など
参照設定不可になりますので、改めて設定しなおす必要があります。
一方無しでコーディングするのは上記お助け機能が使えないので手間ですが
バージョンが異なってもある程度は差異を吸収してくれます。
なので不特定のPCで使う場合は、有りで作成し、最終的に無しで動くように変更しています。
自身で使われるだけでしたら、2)で良いかとも思います。
(Scripting.Dictionary自体Windows2000?の頃から変わっていないし)
3)については、VBScript がこのパターンです。
(元々変数の型宣言ができないので。)
VBAではVariant型で宣言したものを再度Setでやり直しているので二度手間です。
4)は2)を1行にまとめたものですが
2)の場合は、Set・・した時点でインスタンスが作成されますが
4)は参照しに行って初めて作成されます。
また、Set ・・ Nothing で 2)は解放され以後は使えなくなりますが
4)はNothingした後でも参照しに行けばゾンビのごとく新たに立ち上がります。
以下のをローカルウィンドウかウォッチウィンドウで確認しつつ実行してみてください。
1行目と2・3行目のコメントアウトを入れ替えてみた場合も。
Sub DicTest()
Dim myDic As New Scripting.Dictionary
'Dim myDic As Scripting.Dictionary
'Set myDic = New Scripting.Dictionary
Stop
myDic.Add 0, "zero"
myDic.Add 1, "one"
Debug.Print "count1=" & myDic.Count
Debug.Print myDic(1)
Set myDic = Nothing
Stop
Debug.Print "count2=" & myDic.Count 'ゾンビ?復活
Stop
End Sub
余計わけわかんなくなったらゴメン。
基本的に不特定多数のPC、かつExcelのバージョンも違うんで
個々で参照設定はしない(出来ていない)前提で
作りたいと思っていました。
>なので不特定のPCで使う場合は、有りで作成し、最終的に無しで動くように変更しています。
すみません、ちょっと具体的な手法が解らなくなりました
参照設定なしの状態ならば・・・1)が一番、無難でしょうか?
No.4
- 回答日時:
No.3
- 回答日時:
具体的な手法も何もありません。
参照設定しておいて問題なく機能するのを確認後に
参照設定のチェックを外して
Dim myDic As New Scripting.Dictionary
↑コメントアウト ↓コメントを外す
'Dim myDic As Scripting.Dictionary
'Set myDic = New Scripting.Dictionary
コンパイルや実行時エラーが出ないようにチマチマと修正。
・・・と私はやっています。
Dictionaryなら修正の必要はなさそうですね。
>参照設定なしの状態ならば・・・1)が一番、無難でしょうか?
1)しかありません。
すみません。
コメントをつけたり、はずしたりする意味だったんですね
1)しかないですよね。
本当にありがとうございました。
今からコーディングに励みます
No.1
- 回答日時:
> 1)Dim MyDic As Object
実行時バインド
> 2) Dim MyDic As Scripting.Dictionary
事前バインド
> 3) Dim MyDic
実行時バインド
(Variant型のvtメンバがVT_DISPATCH)
> 4) Dim myDic As New Scripting.Dictionary
事前バインド
(参照セット時のもたつきがある)
速度的には
2 - 4 - 1 - 3
の順かなと。
事前バインドの 2 と 4 はメソッドやプロパティの呼び出し時には差がありませんが、実行時バインドの 1 と 3 は理論上、明確な差があります。
(体感出来る程でないにしても)
バイディングがイマイチ整理できてなかったので
とても参考になりました
>Variant型のvtメンバがVT_DISPATCH
これについては、勉強不足で・・・
ちょっと調べてみましたが、すぐに理解できず・・・
頑張って勉強します
ありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数のExcelファイルをマージす...
-
vbsでのwebフォームへの入力制限?
-
Vba セルの4辺について罫線が有...
-
Excelマクロで使うVBAコードを...
-
エクセルのマクロについて教え...
-
ExcelVBAでパワポを操作したい
-
(EXCEL超初心者)EXCELの関数(ま...
-
Excelのマクロについて教えてく...
-
Vba Array関数について教えてく...
-
【マクロ】シートの変数へ入れ...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
vb.net(vs2022)のtextboxのデザ...
-
エクセルのVBAコードと数式につ...
-
【マクロ】変数を使った、文字...
-
エクセルのVBAコードについて教...
-
ワードの図形にマクロを登録で...
-
【マクロ】切取りの場合、形式...
-
改行文字「vbCrLf」とは
-
testファイル内にある複数のpng...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでネットワーク上のバッ...
-
ASP AccessDBオープン出来ない
-
VBS でユーザ名からそのユーザ...
-
管理者権限のないユーザーだと...
-
IIS7.5 Excel ファイルオープ...
-
PowerDVD15のデバイス&ホーム...
-
権限取得方法
-
googlスライドの編集権限について
-
ユーザーアカウント制御について
-
XAMPPのメニュー画面までたどり...
-
EXCEL「Dictionaryオブジェクト...
-
Eclipse の設定ができません。
-
ActiveXをダウンロードさせてた...
-
ASP.NETのユーザー権限について
-
ASPで、IISの設定がうまくいき...
-
VC++からのoracle接続方法
-
「Quick Homepage Maker(openQH...
-
LogonUser関数が ERROR_PRIVIL...
-
IISでサービスに命令可能にする...
-
カスペルスキーのオンラインス...
おすすめ情報