【VBA】配列を使って値の抽出を高速化する【2次元配列を使えば簡単です】
ฝัง
- เผยแพร่เมื่อ 8 ก.พ. 2025
- ■目次
01:01 配列を使って値の抽出を高速化したい
01:44 Cellsで1つずつ値を抽出する
04:45 Cellsを使う方法を「配列」に置き換える
08:30 おわりに
■VBAコードを確認する↓
daitaideit.com...
■関連する動画を確認する↓
・条件一致した値を抽出
• 【VBA】条件一致した値を抽出【For+If...
・複数ブックから条件一致した値を抽出
• 【VBA】複数ブックから値を抽出【Dirでル...
・配列を使って値の抽出を高速化する ←こちらの動画
• 【VBA】配列を使って値の抽出を高速化する【...
・日付でデータを抽出する
• 【VBA】日付でデータを抽出する【AutoF...
・ユーザーフォームで値を抽出
• 【VBA】ユーザーフォームで検索して値を抽出...
・社員名簿から名前で検索して抽出
• 【VBA】社員名簿から名前で検索して抽出する...
・フィルタ結果をコピーする
• 【VBA】フィルタの結果をコピーする【オート...
・連想配列を使って高速で検索
• 【VBA】連想配列を使って高速で値を検索【D...
・連想配列を使って複数条件で検索
• 【VBA】連想配列を使って複数条件で検索【複...
・連想配列で複数項目を取得
• 【VBA】連想配列で複数項目を取得する【配列...
・一致した値を取得する
• 【VBA】一致した値を取得する【VLOOKU...
・複数ブックの一致した値を取得
• 【VBA】複数ブックの一致した値を取得する【...
・条件一致の行を削除
• 【VBA】条件に一致した行を削除【シートをル...
・2つのシートを比較する
• 【VBAとパワークエリ】2つのシートを比較し...
・ForとIfで値の取得、転記、抽出、カウント、加算
• 【VBA】ForとIfを使えば大体自動化でき...
・条件を絞りこんで検索する
• 【VBA】条件を絞りこんで検索をする【部分一...
#ExcelVBA
#値の抽出
#配列
#高速化
メモ
6:04 つみ
2次元目は2列分欲しい
redim
j0☑️
range以降は☑️
実践的な配列の使い方めちゃくちゃ参考になりました!
ありがとうございます!
大変参考になりました。ありがとうございました。一つ質問させて頂きます。抽出の結果を別シートに表示する方法を教えてください。よろしくお願いします。
いつも役に立つ動画をありがとうございます。
またまた質問がございます。
今回の動画のようにまずは”A”を含む値を抽出した後に、”B”を含む値を抽出してどこかに
記載するにはどのようにしたらいいのでしょうか?
ERSE 配列をやってもダメでした、再度 Redimをしてもダメでした。
おそらく配列の何たるかを全く理解できていないからだと思いますが、
解決方法をご教授していただければと存じます。
コメントありがとうございます!
配列を使って、「"A"」と「"B"」を含む値を抽出したい場合は、次のようなVBAコードになります。
Sub TEST1()
Dim A
A = Range("A2:B" & Cells(Rows.Count, "B").End(xlUp).Row)
Dim B
ReDim B(1 To UBound(A, 1), 1 To 2)
j = 0
For i = 1 To UBound(A, 1)
If InStr(A(i, 1), "A") > 0 Then
If InStr(A(i, 1), "B") > 0 Then
j = j + 1
B(j, 1) = A(i, 1)
B(j, 2) = A(i, 2)
End If
End If
Next
Range("D2").Resize(j, 2) = B
End Sub
If文を2回使って、「"A"」と「"B"」を含む値を抽出しているという感じになります。
また、「"A"」を含む値を抽出して、何かしらの操作をしたあとに、「"B"」を含む値を抽出したいという場合は、次のVBAコードが参考になるかと思います。
Sub TEST2()
Dim A
A = Range("A2:B" & Cells(Rows.Count, "B").End(xlUp).Row)
Dim B
ReDim B(1 To UBound(A, 1), 1 To 2)
j = 0
For i = 1 To UBound(A, 1)
If InStr(A(i, 1), "A") > 0 Then
j = j + 1
B(j, 1) = A(i, 1)
B(j, 2) = A(i, 2)
End If
Next
'何かの処理をする
Dim C
ReDim C(1 To j, 1 To 2)
j = 0
For i = 1 To UBound(B, 1)
If InStr(B(i, 1), "B") > 0 Then
j = j + 1
C(j, 1) = B(i, 1)
C(j, 2) = B(i, 2)
End If
Next
Range("D2").Resize(j, 2) = C
End Sub
流れとしては、
・「"A"」を含む値を抽出して配列「B」に格納
・何かしらの操作
・新しく配列「C」を作成
・「"B"」を含む値を配列「C」に格納
・セルに配列「C」を入力
という手順になります。
配列はなかなかとっつきづらい部分がありますけども、うまく使いこなすと、VBAの処理を高速化できるので便利ですよね(^^)
参考になればと思います。
変数名が、「A」とか「B」ですと初心者にはわかりにくいです。変数の「A」?、セル番地の「A」?、抽出文字の「A」?。解説用のコードとはいえもう少しわかりやすくしていただくとありがたいです。
少し質問なのですが、
1列を対象として、データ範囲をヘッダ行+1行と末尾からend(xlup)とかで拾った行の範囲が1行だった場合、つまり結果として範囲が1セルだった場合、範囲.valueを取得すると、配列ではなくてそこに入った値が取得されてしまいますよね?
範囲.Cells.Countで1であればという判断で処理分けしてコードを書いてもいいのですが、なんかしっくり来ません。
処理分けしないで書く方法ってないですか?
質問です。
抽出する条件のところをシート上のセルを参照し、それと一致するものがあった場合にBの配列に格納していくにはどうすればよいでしょうか?
例)sheet1のセルH1に”ABC”という商品名が表示されていたとし、それを参照して配列から商品”ABC”のみのデータを抽出する。
わかりづらかったら申し訳ないです。
教えていただけると幸いです。
コメントありがとうございます!
例えば、「G2」のセルに入力された値を含むデータを抽出するVBAコードは、次のようになります。
Sub TEST3()
Dim A
A = Range("A2:B" & Cells(Rows.Count, "B").End(xlUp).Row)
Dim B
ReDim B(1 To UBound(A, 1), 1 To 2)
j = 0
For i = 1 To UBound(A, 1)
If InStr(A(i, 1), Range("G2")) > 0 Then
j = j + 1
B(j, 1) = A(i, 1)
B(j, 2) = A(i, 2)
End If
Next
Range("D2").Resize(j, 2) = B
End Sub
セルに「ABC」が入力されている場合は、「ABC」を含むデータのみを抽出することができます。
参考になればと思います(^^)
不明点等ございましたら、コメントいただければと思います。
最終的にはとても参考になりますが、しゃべるときの語尾の「~まーす」がけっこう耳について、内容がなかなか頭に入ってきません。個人の感想です。