下記のようなコードで、独自のクラスを使って、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
Excel2013だと「endRow = Cells(4.1).End(xlDown).Row」のところで、「オーバーフローしました」のエラーが発生します。質問者さんのエクセルのバージョンは何でしょうか?
すいません。
入力データとして、表があります。
そのコードは4行1列目が開始行で表の最終行を取得しています。
入力データがないので、エクセルの最終行1048576に行ってしまいオーバーフローになったのだと思います。
dictonaryの生成はできており、あとはそれを参照したいという状態です。
ちなみにバージョンは2016です。
回答2件
あなたの回答
tips
プレビュー