表題のエラーを解消できません。
また、エラーを単に解消する事が目的ではなく、
問題の本質を解決したいです。
例えば、扱えないモノがあるなら代わりのモノでどの様に代用するのか
など。
エラーの切り分けやトレースの手法が合っているのか
を含めてご指摘願えたらと思います。
エラー内容:オブジェクトが必要です
エラー箇所:areaName.Add extractedData(d, 1).Value, i
エラー時の変数の値:i=1,d=1
【エラートレース】
オブジェクトが必要だという事は該当するステートメントの
関連する変数や型に問題がある
1:extractedDataはこれ(エラー箇所)より上のFor文にて問題なく回せていた
であれば、代入される側のareaNameに問題がある
※切り分け作業です
2:まず、基本構文が合っているのかを確認。
→Dictionaryのadd構文については問題ない。
→次に
Dim areaName As Object
Set areaName = CreateObject("Scripting.Dictionary")
の宣言の方法に問題があるのか。
構文は以下。
Dim 連想配列名 As Object
Set 連想配列名 = CreateObject(“Scripting.Dictionary”)
上記構文から宣言する構文にも問題がないように思える
4:では、そもそも1の切り分けに問題があるのか。
extractedDataでデータを拾えてきていない可能性があるのではないか。
値を確認。
→格納されている
5:そもそもエラー内容について公式のQ&Aに該当するか。
しない。読み取り専用プロパティに代入している訳でもない。
6:そもそもVBAのオブジェクトについてしっかりと理解していない可能性がある
オブジェクトが階層構造であることから、ドットを付けて特定のオブジェクトを指定する必要があるのか…?
だとしても、extractedDataはこのプロシージャの中では別階層に存在しない一意の変数だからそんなはずはない…
7:今はココです。
可変型配列のものを固定型配列に突っ込もうとしているからエラーが出ている…?
だとするならDictionaryのaddメソッドは固定型配列のみでしか使えない…?
仮にそうだとするならどんなもので代用できるのか。
【コード】
VBA
1 2 3Sub DuplicateCalculation() 4 5Dim lineNum As Integer 6 lineNum = WorksheetFunction.CountA(Range("A4", Range("A" & Rows.Count))) 7 8 9 'データをExcelから取得 10 ReDim extractedData(1 To lineNum, 1 To 14) As Variant 11 ReDim Preserve extractedData(1 To lineNum, 1 To 14) As Variant 12 13 Dim i, j, c 14 For j = 1 To lineNum 15 c = 1 16 For i = 1 To 15 'A列~O列まで 17 If i <> 3 Then 'C列以外 18 extractedData(j, c) = Cells(j + 3, i) 19 c = c + 1 20 End If 21 Next 22 Next 23 24 25 26 27 '取得してきたデータを条件処理 28 Dim areaName As Object 29 Set areaName = CreateObject("Scripting.Dictionary") 30 Dim numericalValue() As Variant 31 32 33 For i = 1 To lineNum 34 35 For j = 1 To 14 36 d = 1 37 'キーがまだ存在してないのなら値を配列に追加/常にキー列(A列)を取得するので列固定 38 If Not areaName.Exists(extractedData(d, 1)) Then 39 'A列を配列に追加 要素のiは外部キー 40 areaName.Add extractedData(d, 1).Value, i 41 42 'B列とD列~O列の動的配列の入れ物作成 43 ReDim Preserve numericalValue(1 To j, 1 To i) 44 'B列追加、D列~O列追加 45 numericalValue(j, i) = extractedData(i, j).Value 46 Else 47 'キーが既に存在しているならここのルートを通る 48 'j<>2の時、すなわちB列でないなら、合算する 49 If j <> 2 Then 50 '住民税を合算 51 areaName(extractedData(i, j)) = areaName(extractedData(i, j)) + extractedData(i, j + 1) 52 Else 53 'B列ならこのルートを通る 54 '加算しない 同じデータは配列に入れない 55 '入れる配列の番号はそのまま、参照しているセルを次に進める 56 d = d + 1 57 End If 58 End If 59 Next 60 Next 61 62'データを新規シートへ出力 63 64End Sub
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/06/08 03:05