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

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

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

変数は、プログラミングにおいて値や文字列などのデータを保持できる仕組みを指します。自由に名前を付けることができるため、管理しやすくなるのが特徴です。プログラムで変数の宣言を行い、値を代入して利用。保持したデータが通用する範囲でローカル変数とグローバル変数に分けられます。

VBA

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

配列

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

Q&A

解決済

2回答

1437閲覧

ExcelVBAの配列について

slis1536

総合スコア1

変数

変数は、プログラミングにおいて値や文字列などのデータを保持できる仕組みを指します。自由に名前を付けることができるため、管理しやすくなるのが特徴です。プログラムで変数の宣言を行い、値を代入して利用。保持したデータが通用する範囲でローカル変数とグローバル変数に分けられます。

VBA

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

配列

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

0グッド

0クリップ

投稿2021/06/15 09:18

ExcelVBAの配列についてです。

VBAの勉強を始めたばかりの初心者なので、コードとともに、その意味も一緒に教えていただきたいです。 2つのブックは全く同じ書式です。ただし、各列の7行目から最終行までの行数は異なり、セルの値は同じものもあれば違うものもあります。

そこで、2つのブックのD列のみを比較します。
比較方法は、(1)マクロを実行するブック(ThisWorkbook)ではD列7行、8行、9行、...最終行
(2)比較対象として開くブック(Openファイル)はD列全体
つまり、(1)D列7行と(2)D列全体、(1)D列8行と(2)D列全体、(1)D列9行と(2)D列全体、... (1)D列最終行と(2)D列全体
というように、For...Nextでループさせています。

比較後、(1)ブックのセルの値が一致した行のI列に、(2)ブックのI列のセルの値を上書きし、さらに、(1)ブックのJ列に〇を付けるという処理をしています。

Dim ws as Worksheet
Dim wb As Workbook

Set ThisWorkbook.Worksheets(1)

'Openの()内にはGetOpenFilenameで取得済なので気にしないでください。
Set wb = Workbooks.Open()

Dim a As Long

a =
ws.Cells(Rows.count, 4).End(xlUp).Row

Dim rng1 As Range
Dim rng2 As Range

For b = 7 To a

Set rng1 = ws.Cells(b, 4)

Set rng2 =
wb.Worksheets(1).Cells(6, 1).CurrentRegion.colmns(4)

Set rng1 =rng2.Find(what:=rng1.Value, LookAt:=xlWhole)

If Not rng1 Is Nothing Then

ws.Cells(b, 9) = rng1.Offset(0, 5)
ws.Cells(b, 10) = "〇"

End If
Next

これで処理は完結しているのですが、配列を使えば高速処理が可能みたいなので試行錯誤してみましたが難しくてよくわかりませんでした。
配列にするにはどうすればよいのでしょうか。
静的配列?動的配列?
一次元配列?二次元配列?
また、ここらへんの用語についても詳しく説明していただけるとありがたいです。

それと、WorksheetFunction→Match関数での処理やUnion関数で処理するのも速いと見ました。
とにかく、Findメソッドを遅いとのことで勉強ついでに色々知りたいです。

他に、処理を高速化するものがあれば知りたいです。

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

セル範囲の値を二次元配列として取り込みつつ、
Dictionary型を使ってブック2の値を参照するようにしたサンプルです。

VBA

1Sub sample() 2 3 Dim ws As Worksheet 4 Dim wb As Workbook 5 6 Set ws = ThisWorkbook.Worksheets(1) 7 Set wb = Workbooks.Open("book2.xlsx") 8 9 '処理するセル範囲をRange型でセット 10 Dim a As Long 11 Dim rng1 As Range 12 Dim rng2 As Range 13 a = ws.Cells(Rows.Count, 4).End(xlUp).Row 14 Set rng1 = ws.Range(ws.Cells(7, 4), ws.Cells(a, 10)) 15 Set rng2 = wb.Worksheets(1).Cells(6, 1).CurrentRegion.Columns(4).Resize(, 6) 16 17 18 '配列に格納(Variant型の変数にRangeオブジェクトの.Valueを代入すると二次元配列になる) 19 Dim arr1 As Variant, arr2 As Variant 20 arr1 = rng1.Value 21 arr2 = rng2.Value 22 23 'Book2の値を辞書に格納 24 Dim dic 'As Scripting.Dictionary 25 Set dic = CreateObject("Scripting.Dictionary") 26 Dim i 27 For i = LBound(arr2, 1) To UBound(arr2, 1) 28 dic(arr2(i, 1)) = arr2(i, 6) 29 Next 30 31 '辞書を確認した結果を配列にセット 32 Dim j 33 For j = LBound(arr1, 1) To UBound(arr1, 1) 34 If dic.Exists(arr1(j, 1)) Then 35 arr1(j, 6) = dic(arr1(j, 1)) 36 arr1(j, 7) = "〇" 37 End If 38 Next 39 40 '配列をセル範囲に出力 41 rng1.Value = arr1 42 43End Sub 44

テストしてないのでおかしかったら適宜直してください。

投稿2021/06/15 10:32

jinoji

総合スコア4592

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

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

0

「Findメソッド」、「配列」、「Dictionary」の3つを使用した検索方法の速度を検証したサイトがありますので参考にしてください。

Excel VBA 膨大なデータを高速で検索する方法と速度検証

扱うデータ量を考慮して適切な手段を用いることになります。

投稿2021/06/15 09:35

TanakaHiroaki

総合スコア1063

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問