VBAのクラスオブジェクトについて

このQ&Aのポイント
  • VBAのコレクションオブジェクトについての質問です。
  • コレクションオブジェクトの一般的な説明と、自分で作成するコレクションオブジェクトについての疑問があります。
  • Collectionオブジェクトを使うと、文字列、数値、オブジェクトを要素とする独自のオブジェクトを作成できるのでしょうか?
回答を見る
  • ベストアンサー

VBAのクラスオブジェクト

VBAのコレクションオブジェクトについての質問です。 一般的な説明では、 ・コレクション(Collection)とは、同じ種類のオブジェクトの集合体をいいます。 となっているのですが、  以下のような自分で作成するコレクションオブジェクトもあるみたいです。 この場合、同じ種類ではないオブジェクトでコレクションを作れるのでしょうか?それともこの場合も、同じ種類のオブジェクトでないといけないのでしょうか? ・Collectionオブジェクトを使うと、文字列、数値、オブジェクトを要素とする独自のオブジェクトを作成できます。   Dim colTest As New Collection 

  • ouou2
  • お礼率66% (24/36)

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

 Excel VBAで説明すると、  Excel.WorkBookクラスのWorkSheetsプロパティに設定されているオブジェクトがExcel.WorkSheetオブジェクトのコレクションオブジェクトとなるね。この場合、「コレクション」という言葉は一般的な「集まり(コレクション)」という意味だ。  この時、WorkSheetsプロパティの実体はExcel.WorkSheetsクラスのインスタンスであり、WorkSheetsクラスはWorkSheetクラスのオブジェクトの集合を保持している。WorkSheetsクラスのソースが無いので分からないが内部ではCollectionクラスで管理しているのかもしれない。  これに対し、  Dim colTest As New Collection  はCollectionというクラスのインスタンスを作成しているのであり、コレクションはCollectionクラスを指している。このCollectionクラスはAddやRemoveなどのメソッドを持っており、引数がObjectなので文字列も数値も何らかのオブジェクトも要素とできる。基本はこいつを内包したクラス(AddやRemoveを特定のクラスを引数にして用意する)を作成する事になる。

ouou2
質問者

お礼

お礼が遅くなり申し訳ありませんでした。おかげさまで理解する事ができました。 有難うございます。

関連するQ&A

  • オブジェクトとインスタンスはそれぞれあってますか?

    オブジェクトとインスタンスはそれぞれあってますか? vbaで Sub test() Dim CN As ADODB.Connection 【1】 Set CN = New ADODB.Connection  【2】 ・・・ それぞれ 【1】オブジェクトの作成 【2】インスタンスの作成 であってますか?逆ですか? 動作の名称を教えてください。

  • VBAでオブジェクトの配列を使用するには?

    Access2000のVBAでプログラムをしています。 VBAでクラスを作成し、プロシージャの呼び出しの引数に使用しています。あるプロシージャで、クラスの配列を作成し、呼び出し元へ返したいと思っていますが、うまくいきません。これは、できないものなのでしょうか? ---(呼び出し側) Dim objA as clsA, aryB as variant ' 「aryB as Object」でもダメ procB objA, aryB Dim objTemp as Variant ' 「objTemp as Object」でもダメ For Each objTemp In aryB ' ここでエラー「オブジェクトが必要です」 MsgBox objTemp.AAA Next --- --- (プロシージャ側) Public Sub procB(ByRef objA as clsA, ByRef aryB as Variant) Dim aryRet() as clsB, lngI as long For lngI = 0 To 10 Redim Preserve aryRet(lngI) Dim objTemp as clsB Set objTemp = New clsB Set aryRet(lngI) = objTemp Next aryB = aryRet End Sub やりたいことは、プロシージャ側でオブジェクトの配列を作成し、呼び出し側に渡して、呼び出し側で、「For Each・・・Next」で回したいと思っています。 どのようにしたら実現できるか、知っている方、よろしくお願いします。

  • スライド内のオブジェクトを消すマクロ

    PowerPointのVBAマクロで、スライド中にspaceという文字列のみのテキストボックス以外のオブジェクトを消すマクロを以下のように作成したのですが、このマクロを実行しても、いくつかのオブジェクトが残ってしまいます。 Sub foo()  Dim f As Boolean  Dim sl As Slide  Dim sh As Shape   For Each sl In ActivePresentation.Slides    For Each sh In sl.Shapes     If sh.HasTextFrame Then         If sh.TextFrame.TextRange.Text <> "space" Then             sh.Delete         End If     End If    Next   Next End Sub コレクションをFor eachで回しているので、漏れはないはずなのですが、どなたか原因・対策をご教示いただけないでしょうか?

  • VBAでgetElementByTagName

    VBAでIEを動かそうとしている初心者です。 For Each a In ie.Document.getElementByTagName("A") で実行時エラー'438':オブジェクトは、このプロパティまたはメソッドをサポートしていません となるのですがなぜでしょうか Dim ie As Object Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True '画面へ移動する ie.Navigate "http://www.forest.impress.co.jp/" waitNavigation ie Dim a As Object Dim urls As New Collection For Each a In ie.Document.getElementByTagName("A") urls.Add a.href Next

  • EXCEL「Dictionaryオブジェクト」宣言

    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つの違いがイマイチ理解できません。 違いを教えてください。

  • VBAのオブジェクトブラウザの見方

    VBAのオブジェクトブラウザの見方がよくわからないので教えてください。 たとえば、オブジェクトブラウザから「countif」を見ているのですが、   Function CountIf(Arg1 As Range, Arg2) As Double の部分の見方がよくわかりません。 (1)先頭の「Function」は、ワークシート関数だからFunctionと付いているのでしょうか? (2)「Arg1 As Range, Arg2」となっていますが、なぜ、Arg2の後に「As Range」がつかないのでしょうか? セルの範囲ではなく、VBAで指定できるからですか? (3)「 As Double」は何を指しているのでしょうか? 戻り値ですか? 数値で返ってくるからDoubleなのですか? 以上です。よろしくお願い致します。

  • Excel collectionについて VBA

    Dim Mydata As New Collection Dim i As Long Dim EndNumber As Long On Error Resume Next 'データを登録する間、エラーを無視する For i = 2 To EndNumber '2行目から最終行までチェック Mydata.Add Range("J" & i).Value, Range("J" & i).Value 'J列のデータ取得 Next i On Error GoTo 0 i = 1 For Each A In Mydata Worksheets("Sheet1").Range("A" & i).Value = A i = i + 1 Next A 現在見ているシートの重複しない項目を 別シートに書き込みしているプログラムになります。 様々なサイトを参考にさせて頂き、 上記のような結果になり、 文字列は取得できるようになりました。 しかし、もとになるデータがある位置に(例は、J列) 数値が入っていると上手くコレクションに入ってくれません。 J列に文字列(りんご、ごりらなど)が入っている場合は 重複しない項目がコレクションに格納されていきます。 J列に文字列(0,1)が入っていた場合、 重複しない項目もなにも無く、 ローカルのMydataの中には<変数無し>とありました。 このプログラムの何処を直せば、数値をコレクションとして取得できますか? ちなみに、EndNumberには最終行の数値が入っています。 >Mydata.Add Range("J" & i).Value, Range("J" & i).Value 'J列のデータ取得 .valueを.stringにしても効果はありませんでした。 回答よろしくお願いいたします。

  • EXCEL VBA COLLECTIONオブジェクトについて教えてください。

    教えてください。 EXCELで3万件の商談情報があり、その情報に顧客情報をセットするようにマクロを作成しています。 顧客情報にある顧客コードをキーにしてCollectionオブジェクトを作成し、商談情報にある顧客コードを元にセットしているのですが、この顧客コードが英数の大文字と小文字が混在しています。 例えば、60000AABBと60000AaBbは違う顧客コードということになり、Collectionオブジェクトのキーに指定するとエラーとなります。 Collectionオブジェクトのキーを大文字・小文字を区別する方法はありますか? もし、区別する方法がなければ、Collectionオブジェクト以外に何か良い方法はありますか?

  • VBAでの配列について

    VBA で、 Dim pow(23) As String Dim temp As Double temp = WorksheetFunction.Average(pow) としたいのですが、状況に応じて、powには、文字列が入ったり、0や空白だったりもします。 0や空白の場合、平均値に影響させたくありません。 現状、文字列等が入ると、 平均できません 見たいなエラーが出ます。 どういう風にするのが良いでしょうか

  • 【VBA】"オブジェクトが必要です"メッセージ出力

    VBAを使用し、A列に日付、B列に数量、C列に単価、D列に金額を入力し、 数量*単価にて、金額を求めるVBAを作成しています。 そこまでは上手くいくのですが、D列で求めた金額を最終行で合計する事で 躓いてしまっています。 行は常に追加され可変の為、最終行を「Cells(Row.Count, 1).End(xlUp).Row」 にて引っ張ってこようと思っております。以下のようなVBAを記載しましたが、 「オブジェクトが必要です」とのメッセージがでて、処理が上手くいきません。 どのような問題があるのか、お分かりの方、ご回答頂けますと幸いです。 ■環境  Windows7  Excel2010 ■VBA Sub test() Dim i As Long Dim j As Long Dim k As Long For i = 2 To Cells(Row.Count, 1).End(xlUp).Row Cells(i, 4) = Cells(i, 2) * Cells(i, 3) Next j = Cells(Row.Count, 1).End(xlUp).Row + 1 k = Cells(j, 1).End(xlUp).Row Cells(j, 4) = WorksheetFunction.Sum(Cells(2, 4), Cells(k, 4)) End Sub

専門家に質問してみよう