Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2330 / 13644 ツリー ←次へ | 前へ→

【68672】CreateObjectについて Masa 11/4/4(月) 11:05 質問[未読]
【68677】Re:CreateObjectについて kanabun 11/4/5(火) 7:40 発言[未読]
【68678】Re:CreateObjectについて UO3 11/4/5(火) 11:56 発言[未読]
【68679】Re:CreateObjectについて kanabun 11/4/5(火) 19:29 発言[未読]
【68680】Re:CreateObjectについて Masa 11/4/6(水) 8:30 お礼[未読]

【68672】CreateObjectについて
質問  Masa  - 11/4/4(月) 11:05 -

引用なし
パスワード
   ComboBoxの処理で検索をしましたら[68465]に以下の
記述が見つかりました
まさしく、今自分が処理したいことでしたので
参考にして処理をさせていただきました
しかし、ここでCreateObjectが理解できないのです
Helpでも調べたのですが よくわからないのです
どなたか、やさしく解説していただけないでしょうか
よろしくお願いいたします


Sub ComboBox_Setting()
 Dim Ws As Worksheet
 Dim i As Long, j As Long
 Dim LastRow As Long
 Dim v As Variant, ss As String
 Dim dic(2 To 9) As Object

 For i = 2 To 9
  Set dic(i) =CreateObject("Scripting.Dictionary")
 Next
 
 Set Ws = ActiveWorkbook.Worksheets("Sheet1")
 'LastRow=Noが書かれている最下行
 LastRow = Ws.Range("B7").CurrentRegion.Rows.Count
 For i = 7 To LastRow
  v = Ws.Cells(i, 2).Value
  If Not IsEmpty(v) Then
   If v <> "No" Then
    For j = 3 To 10
     ss = Ws.Cells(i, j).Value
     If Len(ss) > 0 Then
      dic(j - 1)(ss) = Empty
     End If
    Next j
   End If
  End If
 Next i
 For i = 2 To 9
   UserForm1.Controls("ComboBox" & i).List = dic(i).Keys()
 Next
 Erase dic

End Sub

【68677】Re:CreateObjectについて
発言  kanabun  - 11/4/5(火) 7:40 -

引用なし
パスワード
   ▼Masa さん:
>ComboBoxの処理で検索をしましたら[68465]に以下の
>記述が見つかりました
見たことのあるコードですね(^^

>しかし、ここでCreateObjectが理解できないのです

"Scripting.Dictionary" (とか "Scripting.FileSystemObject" など)の
プログラム(コンポーネント)は、ExcelVBAから見ると
「外部ツール」ですよね?
「外部」ツールなので、何らかの方法で呼び出してオブジェクトを作成
してからでないと使えません。

外部ツールを呼び出すひとつの方法がCreateObject関数です。

 Dim dic As Object 'オブジェクト変数の宣言
 Set dic = CreateObject("Scripting.Dictionary")
 ' ↑"Scripting.Dictionary"のオブジェクトを一時的に作成し
   これを変数dic にセットします。以後、Dictionaryの機能が
   利用可能になります。

外部ツールを呼び出すもう一つの方法はあらかじめそのライブラリを
「参照設定」しておく方法です。Dictionaryクラスを例にとると
VBEメニュー[ツール]-[参照設定]から
Microsoft Scripting Runtime ライブラリにチェックを入れておきます。
すると、

 Dim dic As Dictionary
 Set dic = New Dictionary

のようにして、Dictionaryの機能(プロパティ、メソッド)が
プログラム内で利用可能になります。


> Set dic = CreateObject("Scripting.Dictionary")
のような呼び出し方は、プログラムが実行を始めてから(走り出してから)
外部プログラムを呼び出しているので、実行時バインディングと呼ばれてます。
対して
後者の「参照設定」の
> Set dic = New Dictionary
方法は、あらかじめプログラムにDictionaryオブジェクトを仕込んでおく
ので、事前バインディングと呼ばれます。
事前バインディングにより外部プログラムをセットしておくと、
コードを記述するとき、そのオブジェクトのプロパティやメソッドが
(dic. とピリオドを打つと)表示されます。また、あらかじめ仕込んで
あるので、実行時のパフォーマンスも(一般的に)向上します。

【68678】Re:CreateObjectについて
発言  UO3  - 11/4/5(火) 11:56 -

引用なし
パスワード
   ▼Masa さん:

こんにちは

kanabunさんからわかりやすいご説明がありましたね。
私も、実際には、このように理解というか整理して使っています。

以前、別の板で、同じようなことを申し上げたらエキスパートの皆さんから
「厳密に言えば、それは違うよ」と【あたたかくご指導】いただいたことがあります。
混乱させてしまうかもしれませんが、以下のようなことでした。

・事前バインディングか、実行時バインディング(遅延バインディング)かは
 参照設定を行っておくかどうかできまる。
 参照設定を行い、かつCreateObjectでインスタンスを生成するのも「あり」だから
 CreateObjectを使うことが実行時バインディングということではない。

なんだそうです。

h tp://chaichan.web.infoseek.co.jp/vbtips/VBMemo2006120905.htm

ここに、こんな記載がありました。

VBからEXCELを制御するときは、事前バインディングでCreateObject関数が定石のようです
(MSが推奨、以下のURL参照)。
h tp://support.microsoft.com/kb/828550/ja

【68679】Re:CreateObjectについて
発言  kanabun  - 11/4/5(火) 19:29 -

引用なし
パスワード
   ▼Masa さん:

> CreateObjectが理解できないのです

Dictionaryの挙動というか、動作原理については
了解されてますか?

なんだか、そちらのほうが重要な気がしますけど?

【68680】Re:CreateObjectについて
お礼  Masa  - 11/4/6(水) 8:30 -

引用なし
パスワード
   kanabun さんへ
そうでしたkanabun さんからの回答でした
参考になりました

>Dictionaryの挙動というか、動作原理については
>了解されてますか?
>なんだか、そちらのほうが重要な気がしますけど?

たぶん完全には理解していないようなきがします
しかし再度自分なり取り組んでみます
また 解らなくなりましたら教えてください
有難うございました

2330 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free