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

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

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

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

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

Q&A

解決済

1回答

4580閲覧

オブジェクトが必要です VBA

退会済みユーザー

退会済みユーザー

総合スコア0

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

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

0グッド

0クリップ

投稿2021/06/08 02:32

編集2021/06/08 03:01

表題のエラーを解消できません。
また、エラーを単に解消する事が目的ではなく、
問題の本質を解決したいです。
例えば、扱えないモノがあるなら代わりのモノでどの様に代用するのか
など。

エラーの切り分けやトレースの手法が合っているのか
を含めてご指摘願えたらと思います。

エラー内容:オブジェクトが必要です
エラー箇所: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

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず、
extractedDataはRangeではなくVariant()なので、
extractedData(d, 1).Value ではなく extractedData(d, 1) としましょう。

投稿2021/06/08 03:00

jinoji

総合スコア4592

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

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

退会済みユーザー

退会済みユーザー

2021/06/08 03:05

ありがとうございます。 もう少し、細かく分解して真偽を確かめるべきでした。 ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問