質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Q&A

解決済

2回答

2141閲覧

VBAのコレクションのitemメソッド

roku28632

総合スコア36

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

0グッド

0クリップ

投稿2020/04/18 07:38

編集2020/04/18 08:28

下記のようなコードで、独自のクラスを使って、collectionを作って、取り出したいです。
イメージではitem(1)で1レコード分の情報を表示できる(?)のかなと思っているのですが、
エラーになります。
使い方がまずいのでしょうか?

エラー 438 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
エラーは「Debug.Print persons.Item(1)」の部分で発生します

(最終的には、例えば「名前」をキーとして、対象レコードを取得してエクセルに反映したりしたいです。
調べるとitemメソッドが利用できるように思いました)

よろしくお願いします

lang

1 2Enum 列 3 名前 = 1 4 住所 5 TEL 6 誕生日 7 性別 8End Enum 9 10Dim persons As New Collection 11 12Sub main() 13 14 Call データを取得する 15 Call データを取り出す 16 17End Sub 18 19Sub データを取得する() 20 21 Dim sh As Worksheet 22 Set sh = ThisWorkbook.Sheets("データ1") 23 24 Dim i As Long 25 26 Dim endRow As Integer 27 endRow = Cells(4.1).End(xlDown).Row 28 29 Dim endColumn As Integer 30 endColumn = Cells(3, 1).End(xlToRight).Column 31 32 For Each value In Range(Cells(4, 1), Cells(endRow, endColumn)) 33 34 With New Person 35 36 .名前 = sh.Cells(value.Row, 列.名前) 37 .住所 = sh.Cells(value.Row, 列.住所) 38 .電話番号 = sh.Cells(value.Row, 列.TEL) 39 .誕生日 = sh.Cells(value.Row, 列.誕生日) 40 .性別 = sh.Cells(value.Row, 列.性別) 41 persons.Add .self 42 End With 43 44 Next 45 46End Sub 47 48Sub データを取り出す() 49 50 Debug.Print persons.Item(1) 51 52End Sub 53 54

lang

1Public 名前 As String 2Public 住所 As String 3Public 電話番号 As String 4Public 誕生日 As String 5Public 性別 As String 6 7Public Property Get 年齢() As Integer 8 9 年齢 = DateDiff("yyyy", 誕生日, Date) 10 11End Property 12 13Public Property Get self() As Person 14 15 Set self = Me 16 17End Property

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/04/18 07:50

念のため、どこで止まってるかデバッグして追記してもらって良いですか?
meg_

2020/04/18 07:55

クラス定義の部分も掲載してください。
roku28632

2020/04/18 08:28

すいません。 色々情報がありませんでした。
meg_

2020/04/18 08:40

Excel2013だと「endRow = Cells(4.1).End(xlDown).Row」のところで、「オーバーフローしました」のエラーが発生します。質問者さんのエクセルのバージョンは何でしょうか?
roku28632

2020/04/18 09:04

すいません。 入力データとして、表があります。 そのコードは4行1列目が開始行で表の最終行を取得しています。 入力データがないので、エクセルの最終行1048576に行ってしまいオーバーフローになったのだと思います。 dictonaryの生成はできており、あとはそれを参照したいという状態です。 ちなみにバージョンは2016です。
guest

回答2

0

Dim persons As New Collection

こうやっても、クラスモジュールの実体化が出来てるわけではないので、
やってることとやりたいことが違うのでは?

クラスモジュールの中でコレクションを作らなきゃだめなのかな?

dictonaryの生成はできており

Collectionとdictonaryは別物ですよ?
この辺も再認識された方がよいかと思います。

あと、この例題だと、関数作るくらいで十分なので、
クラスモジュールの練習にはあんまり向いてないかも?
dictonaryオブジェクトの練習にはいいかもしれません。
まぁ、練習なのでやってみてもいいかもしれませんが、
それぞれの違いを再認識されることをお勧めします。

あと、セル範囲は、
行のコレクションであり、
列のコレクションであり、
セルのコレクションです。(矩形のコレクションという見方もありますが)
敢えて独自のコレクションを作る必要がないということも、
認識しておいてください。

知ってるけど、練習なので、敢えてやってる、ということならば、
無視して結構です。


あ、クラスモジュールで、
dictionaryオブジェクトと同じような機能を作ってみてるということでしょうか?

投稿2020/04/18 14:06

編集2020/04/18 14:47
mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

roku28632

2020/04/18 15:39

collectionと書こうと思って間違えて、dictonaryと書いてしまいました。 混乱させてしまってすいません。 表を扱うのにcollectionにオブジェクトを突っ込む方法を取りたかったのです。 別の方の回答がズバリやりたかったことでした。
mattuwan

2020/04/18 15:46

名前でなく、番号だけど? 番号でいいなら、 対象セル範囲.rows(1) でいいんじゃ?
roku28632

2020/04/18 15:50

>>名前でなく、番号だけど? これはどの部分の話でしょうか
mattuwan

2020/04/19 01:36

〉最終的には、例えば「名前」をキーとして、対象レコードを取得してエクセルに反映したりしたいです。
mattuwan

2020/04/19 01:38

〉Debug.Print persons.Item(1)
roku28632

2020/04/19 02:48

検索したいkeyをaddする時に指定してやればいけました。 persons.Add .self, sh.Cells(value.Row, 列.名前) あと、コメントにいただいていたクラスモジュールの実体化は途中のforeachの中でnewしていますよ。
mattuwan

2020/04/19 06:36

あー。そうでしたか。 こちらも、よく見てなかったですが、 クラスの名前の説明もないし、addメソッドも、提示されてないし、 で、やりたいことは、 msgbox persons.get年齢(¨田中一郎¨) というような感じで年齢などを取得したいと言うことではなくて? それとも、 msgbox persons.item(¨田中一郎¨).年齢 というような形にしたいのかなと思ったんですが、 違いましたか。 ああー。なんか勘違いでしたら失礼しました。
roku28632

2020/04/19 06:57

いえいえ、わざわざコメント付き合っていただきありがとうございました。^^
guest

0

ベストアンサー

persons.Item(1)はPersonオブジェクトです。
Debug.Print persons.Item(1)ではなく、例えばDebug.Print persons.Item(1).住所とすれば住所が出力されます。

投稿2020/04/18 12:35

meg_

総合スコア10579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

roku28632

2020/04/18 15:40

回答いただいたのが、やりたかったことです。 ありがとうございます。 Debug.Print persons.Item(1)でレコードごと出力されるのかと思ってましたが、プロパティの指定が必要でしたね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問