🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

3865閲覧

VBA Dictionary 格納した配列を一括入力する際に、アプリケーション定義またはオブジェクト定義のエラーとなる

Cabriolet

総合スコア3

VBA

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/12/06 00:46

編集2020/12/06 02:47

前提・実現したいこと

VBA初心者です。初めて当サイトを利用します。
至らない部分もあるかと思いますが、お助けいただければ幸いです。

Vlookupの代替として、Dictionaryを使用したいです。
セル参照回数を減らす為に配列へ格納し、配列から一括入力する際にエラーが出てしまいます。

実行時エラー'1004
アプリケーション定義またはオブジェクト定義のエラー

検索結果の出力先 : Book_bのSheet_cのAQ列
検索値 : Book_bのSheet_cのJ列
検索範囲 : Book_dのSheet_eのC~H列 '検索値はC列です
列番号 : 6
検索方法 : 完全一致

補足

・配列からの一括入力時、途中までは正しく入力されます。
・エラーで止まった検索値は、検索範囲に含まれている値です。

イメージ説明

発生している問題・エラーメッセージ

格納した配列からの一括入力時にエラー

c.Range(c.Cells(1, 1), c.Cells(hsaigo, 43)) = buff

実行時エラー'1004
アプリケーション定義またはオブジェクト定義のエラー

該当のソースコード

Dim b , d As String
Dim c , e As Worksheet

Dim hsaisho, isaigo As Long
Dim dir As Dictionary
Dim buff As Variant

Dim name_b, name_c As Long

d = Application.GetOpenFilename(",*.xlsx") d = Mid(d, InStrRev(d, "\") + 1) If b <> "False" Then Workbooks.Open d Set e = Workbooks(d).Worksheets("Sheet1") Else MsgBox "キャンセルしました" End If b = Application.GetOpenFilename(",*.XLSX") b = Mid(b, InStrRev(b, "\") + 1) If b <> "False" Then Workbooks.Open b Set c = Workbooks(b).Worksheets("Sheet1") Else MsgBox "キャンセルしました" End If Set dir = New Dictionary isaigo = e.Cells(Rows.Count, 3).End(xlUp).row hsaisho = c.Cells(Rows.Count, 43).End(xlUp).row + 1 hsaigo = c.Cells(Rows.Count, 8).End(xlUp).row MsgBox isaigo MsgBox hsaigo For name_c = 4 To isaigo If dir.Exists(e.Cells(name_c, 3).Value) = False Then dir.Add Key:=e.Cells(name_c, 3).Value, Item:=e.Cells(name_c, 6).Value End If Next name_c '▼セル参照回数を減らす為に配列へ格納 buff = c.Range(c.Cells(1, 1), c.Cells(hsaigo, 43)) For name_b = hsaisho To hsaigo buff(name_b, 43) = dir.Item(CStr(buff(name_b, 10))) Next name_b '▼配列からまとめて入力 c.Range(c.Cells(1, 1), c.Cells(hsaigo, 43)) = buff

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

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

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

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

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

guest

回答3

0

今回のエラーとは関係ないかも知れませんが、いろいろ気になる部分があるので、修正してみました。
修正部分はコメントで理由を説明してますので、参考にしてください。

簡単にサンプルを作成して動作確認しましたかエラーなく動作しました。

vba

1Public Sub test() 2 Dim b As String, d As String '型は一つずつ指定する、省略するとVariantになる 3 Dim c As Worksheet, e As Worksheet '型は一つずつ指定 4 5 Dim hsaisho As Long, hsaigo As Long, isaigo As Long '型は一つずつ指定 6 Dim dic As Dictionary 'Dir関数と被るのでdirをdicに変更 7 Dim buff As Variant 8 9 Dim name_b As Long, name_c As Long '型は一つずつ指定 10 11 d = Application.GetOpenFilename(",*.xlsx") 12' d = Mid(d, InStrRev(d, "\") + 1) 不要 Workbooks.Open にはフルパスで指定する、ファイル名だけだとカレントディレクトリ 13 14 If d <> "False" Then ' b を d に変更 15 16 With Workbooks.Open(d) 'ブックを開いて、Withで対象にする 17 Set e = .Worksheets("Sheet1") 18 End With 19 Else 20 21 MsgBox "キャンセルしました" 22 23 Exit Sub 'キャンセルしたなら処理終了しないと後でエラーになる 24 End If 25 26 b = Application.GetOpenFilename(",*.XLSX") 27' b = Mid(b, InStrRev(b, "\") + 1) 不要 28 29 If b <> "False" Then 30 31 With Workbooks.Open(b) 'ブックを開いて、Withで対象にする 32 Set c = .Worksheets("Sheet1") 33 End With 34 Else 35 36 MsgBox "キャンセルしました" 37 Exit Sub 'キャンセルしたなら処理終了しないと後でエラーになる 38 End If 39 40 Set dic = New Dictionary 41 42 isaigo = e.Cells(Rows.Count, 3).End(xlUp).Row 43 hsaisho = c.Cells(Rows.Count, 43).End(xlUp).Row + 1 44 hsaigo = c.Cells(Rows.Count, 8).End(xlUp).Row 45 46 MsgBox isaigo 47 MsgBox hsaigo 48 49 For name_c = 4 To isaigo 50 51 If dic.Exists(e.Cells(name_c, 3).Value) = False Then 52 dic.Add Key:=CStr(e.Cells(name_c, 3).Value), Item:=e.Cells(name_c, 6).Value 'キーをCStrで文字列に 53 End If 54 Next name_c 55 56 '▼セル参照回数を減らす為に配列へ格納 57 buff = c.Range(c.Cells(1, 1), c.Cells(hsaigo, 43)).Value '配列として取得するならValueを付けた方かいい 58 59 For name_b = hsaisho To hsaigo 60 61 buff(name_b, 43) = dic.Item(CStr(buff(name_b, 10))) 62 63 Next name_b 64 65 '▼配列からまとめて入力 66 67 c.Range(c.Cells(1, 1), c.Cells(hsaigo, 43)) = buff 68End Sub

投稿2020/12/06 03:54

hatena19

総合スコア34073

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

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

Cabriolet

2020/12/06 04:10

分かり易くアドバイス頂きありがとうございます。 ご活用させて頂きます!!
guest

0

DictionaryKeyが無いケースを考慮してみてはどうでしょう。

VBA

1'▼セル参照回数を減らす為に配列へ格納 2buff = c.Range(c.Cells(1, 1), c.Cells(hsaigo, 43)) 3 4For name_b = hsaisho To hsaigo 5 If dir.Exists(CStr(buff(name_b, 10))) Then 6 buff(name_b, 43) = dir.Item(CStr(buff(name_b, 10))) 7 End If 8Next name_b 9'▼配列からまとめて入力 10c.Cells(1, 1).Resize(UBound(buff, 1), UBound(buff, 2) - LBound(buff, 2) + 1) = buff

投稿2020/12/06 01:50

編集2020/12/06 02:50
sazi

総合スコア25327

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

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

Cabriolet

2020/12/06 02:27

ご回答頂きありがとうございます。 検索値は検索範囲にある値なのですが、エラーになってしまいます。 配列から一括入力した際に、途中までは正しく入力されるのですが...。
sazi

2020/12/06 02:54 編集

後はbuffの大きさで上書きしてみるとどうでしょう。 (追記しました) ※質問のコードはマークダウンして下さいね。
Cabriolet

2020/12/06 04:07

本件に関しては、当方が使用しているデータに問題がありました。 ご回答頂きありがとうございました。
guest

0

自己解決

本件に関しては、当方の使用データに問題がありました。

buff = c.Range(c.Cells(1, 1), c.Cells(hsaigo, 43))
上記のA列からAQ列迄の中に1つだけ "=" が使用されている値がありました。(例 =aaabbbccc" )

c.Range(c.Cells(1, 1), c.Cells(hsaigo, 43)) = buff
その為、一括入力時にエラーが出ておりました。

皆様、丁寧にご回答頂きありがとうございました。
今後とも宜しくお願い致します。

投稿2020/12/06 04:06

Cabriolet

総合スコア3

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

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

sazi

2020/12/06 04:16

後学者の役に立てるかもしれませんので、そのデータについて回避したコードを載せておくと良いです。
Cabriolet

2020/12/06 06:57

sazl様 当サイトの活用法までアドバイス頂きありがとうございます。 今回は、"="が悪さをしていたので、単純に"="のみ手動で削除致しました。 ですので、回避コード等は作成できておりません。 今後は、書式の自動型変換によるエラーを留意したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問