クラスの罠

この前、書いた通りクラスを作ってレコードをDictionary(辞書)に突っ込むコード。 できたので、Dictionary からキーで引いてみると正しいレコードが引けないことが分かった。 生成AIと相談しながら、やっと解決できた。 Dictionary に突っ込むとき、インスタンスを New して突っ込んでるんだけど、その変数の定義位置が原因だった。 ダメな方のコードも生成AIに教えててもらったんだけどね。

■ ダメなコード Dim iRow As Long Dim iLastRow As Long Dim dictProduct As Object ' Scripting.Dictionary ' 辞書を作る Set dictProduct = CreateObject("Scripting.Dictionary") ' ワークシートを変数に仕舞っておく Set wsSource = Wb.Worksheets(1) iLastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row For iRow = 2 To iLastRow ' インスタンスを作る Dim recordData As New ProductCategoryRecord ' A列 CONT_HIN_CD 品目コードをキーとする key = wsSource.Cells(iRow, 1).value If key = "" Then Exit For ' レコード情報の読み込みと構造体への格納 recordData.ContHinCD = key ' CONT_HIN_CD recordData.ShouhinDiv = wsSource.Cells(iRow, 2).value ' SHOHIN_DIV recordData.Course = wsSource.Cells(iRow, 3).value ' COURSE . . . ■ おっけーなコード Dim iRow As Long Dim iLastRow As Long Dim dictProduct As Object ' Scripting.Dictionary Dim recordData As ProductCategoryRecord ' 辞書を作る Set dictProduct = CreateObject("Scripting.Dictionary") ' ワークシートを変数に仕舞っておく Set wsSource = Wb.Worksheets(1) iLastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row For iRow = 2 To iLastRow ' インスタンスを作る Set recordData = New ProductCategoryRecord ' A列 CONT_HIN_CD 品目コードをキーとする key = wsSource.Cells(iRow, 1).value If key = "" Then Exit For ' レコード情報の読み込みと構造体への格納 recordData.ContHinCD = key ' CONT_HIN_CD recordData.ShouhinDiv = wsSource.Cells(iRow, 2).value ' SHOHIN_DIV recordData.Course = wsSource.Cells(iRow, 3).value ' COURSE . . .

--
はれ

No comments: