エクセルのマクロを使用して以下のことを行いたいです。
(※VBA初心者なので解説を書いていただけるとありがたいです。)
・商品マスタのCSVを読み込む。
30万件以上あるので、エクセルでは表示できません。
・読み込んだ商品マスタに記載されている商品コードを、
商品データ一覧のエクセルファイルに自動で転記したい。
商品データ一覧のエクセルファイルには、「商品番号」「色」「サイズ」があります。
この3条件が商品マスタのものと一致する商品マスタのコードを転記したいです。
量が膨大なうえ、急ぎの作業なため、何卒よろしくお願いいたします。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
>量が膨大なうえ、急ぎの作業なため、
そういう事なら、エクセル2010を買ってきてフィルタオプションでやるか、アクセスでやる事をお勧めします。
2003以前でやるのは、VBA初心者の方には荷が重いと思います。テキストファイルを読みこんで順次照合する様な方法では、原理的には出来ても遅くてやっていられないと予想します。ADOを用いて、テキストファイルから抽出する方法を下記で回答しています。
http://okwave.jp/qa/q7205971.html
#5で回答している試験データに合わせて、1条件分だけですが試してみました。
ADOや、SQLについて調べまくって応用できる様ならご活用下さい。解説はいたしかねます。
☆SQLで抽出する例
Sub test()
Dim CN As Object
Dim RS As Object
Dim mySQL As String
Dim i As Long, dataCount As Long
Dim sh As Worksheet
Dim wbk As Workbook
Const blockSize As Long = 50000
Const adOpenStatic = 3
Const adLockReadOnly = 1
Set wbk = Workbooks.Add
Set CN = CreateObject("ADODB.Connection")
CN.Provider = "Microsoft.Jet.OLEDB.4.0"
CN.Properties("Extended Properties") = "Text;HDR=NO"
CN.ConnectionString = ThisWorkbook.Path & "\"
CN.Open
Set RS = CreateObject("ADODB.Recordset")
mySQL = "SELECT * FROM sample.csv WHERE (([sample#csv].F1 LIKE 'a%') AND ([sample#csv].F3 = '良品') AND ([sample#csv].F4 > 500));"
RS.Open mySQL, CN, adOpenStatic, adLockReadOnly
dataCount = RS.RecordCount
For i = 1 To Int(dataCount / blockSize) + 1
Set sh = wbk.Worksheets.Add(after:=Worksheets(wbk.Worksheets.Count))
With sh
RS.MoveFirst
RS.Move (blockSize * (i - 1))
.Range("A1").CopyFromRecordset RS, blockSize
End With
Set sh = Nothing
Next i
RS.Close
wbk.SaveAs ThisWorkbook.Path & "\" & "extractSample.xls"
Set RS = Nothing
CN.Close
Set CN = Nothing
End Sub
☆全データをメモリ上に読みこんでFilterで絞り込む例
メモリが足りれば速そうに思えるが、1条件だけでは若干遅く感じた。複数条件調べる場合は、都度メモリに読みこむ必要がないので、逆転するかも。
Sub test2()
Dim CN As Object
Dim RS As Object
Dim mySQL As String
Dim i As Long, dataCount As Long
Dim sh As Worksheet
Dim wbk As Workbook
Const blockSize As Long = 50000
Const adOpenStatic = 3
Const adLockReadOnly = 1
Set wbk = Workbooks.Add
Set CN = CreateObject("ADODB.Connection")
CN.Provider = "Microsoft.Jet.OLEDB.4.0"
CN.Properties("Extended Properties") = "Text;HDR=NO"
CN.ConnectionString = ThisWorkbook.Path & "\"
CN.Open
Set RS = CreateObject("ADODB.Recordset")
mySQL = "SELECT * FROM sample.csv;"
RS.Open mySQL, CN, adOpenStatic, adLockReadOnly
RS.Filter = "(F1 LIKE 'a*') AND (F3 = '良品') AND (F4 > 500)"
dataCount = RS.RecordCount
For i = 1 To Int(dataCount / blockSize) + 1
Set sh = wbk.Worksheets.Add(after:=Worksheets(wbk.Worksheets.Count))
With sh
RS.MoveFirst
RS.Move (blockSize * (i - 1))
.Range("A1").CopyFromRecordset RS, blockSize
End With
Set sh = Nothing
Next i
'RS.Filter = "" 'Filter解除
RS.Close
wbk.SaveAs ThisWorkbook.Path & "\" & "extractSample.xls"
Set RS = Nothing
CN.Close
Set CN = Nothing
End Sub
※ワイルドカードは、ADOのSQLの場合は%のみ、フィルターの場合は%でも*でも良さそうです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBA でvlookup エラーなどは削除したい 8 2022/12/30 04:03
- Excel(エクセル) エクセルでのVBA 2 2022/08/03 06:48
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
- Excel(エクセル) 【条件付き書式】countifsで複数条件を満たしたセルを赤くする方法 2 2023/02/09 23:53
- Google Maps エクセルについて 2 2022/11/27 11:00
- Excel(エクセル) Excel関数 情報引用する方法 4 2022/07/31 20:59
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
CSV形式での保存時に”文字列...
-
csvファイル 項目数取得
-
EXCEL|csvで保存→開くcsvを閉じる
-
バッチでCSVを処理する時、空の...
-
csvファイルでの日付設定「yyyy...
-
csvファイルのデータの一部を取...
-
複数のcsvファイルをExcelに一...
-
【C#】パス名で無効な文字
-
Accessでcsvを読み込ませるプロ...
-
エクセル形式のファイルの読み込み
-
VBScriptでcsvファイルの編集は...
-
HTMLのリンク先ページの文字コ...
-
Windowsのバッチファイルについ...
-
csvファイルのデータの間引きを...
-
CSVファイル作成
-
csvファイルを列数ごとに分割す...
-
ACCESS CSVファイルをインポ...
-
「,」区切りのcsvファイルを...
-
Visual C++によるcsvファイルの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
複数のcsvファイルをExcelに一...
-
CSV形式での保存時に”文字列...
-
csvファイル 項目数取得
-
csvファイルでの日付設定「yyyy...
-
マクロから出力されるcsvのダブ...
-
バッチでCSVを処理する時、空の...
-
csvファイルのデータの一部を取...
-
エクセルVBA 大容量CSVファイル...
-
csvファイルを列数ごとに分割す...
-
PHP.laravelについて
-
COBOLでCSVをインプットにして...
-
COBOL85でのCSVファ...
-
複数のCSVファイルのAccessテー...
-
データ解析ソフトRでのファイル...
-
【C#】パス名で無効な文字
-
VBAでcsvファイルを読み込んで...
-
特定文字を入ってるCSVの特定の...
-
CSVファイル作成
-
【エクセル マクロ】読み込ん...
おすすめ情報