エクセルVBA C列に特定の文字列を含む行のみを抽出し、一つのExcelにまとめたい。
現在使用している、VBAの一部に、複数のCSVファイルを一つのエクセルにまとめる作業をする箇所があります。
しかし、CSVのファイルサイズが大きいと読み込みにどうしても時間がかかってしまうということで、抽出する行を限定したいと考えております。
以下は現在使用しているVBAの一部(抽出のみ)なのですが、
C列にA or B or Cと入っている場合のみ、その行ごとエクセルに取り込みたいと考えております。
VBAに詳しい方、どうぞご教授ください。
宜しくお願いします。
----現在使用しているもの--------------------------------------------------------
Sub LoadFiles() 'CSVファイルの読み込み
Dim CsvFileName As Variant
Dim Li As String
Dim Bf() As String
Dim r As Long
Dim ShMain As Worksheet
Dim FlNo As Integer
Dim FFlNo As Integer
Worksheets("Sheet1").Activate
With ThisWorkbook 'シート&パスの設定
Set ShMain = .Worksheets("Sheet1")
ChDrive .Path
ChDir .Path
End With
'複数のファイルの選択を可に設定
CsvFileName = Application.GetOpenFilename _
(filefilter:="CSVファイル(*.csv),*.csv", _
Title:="CSVファイル選択", MultiSelect:=True)
' If VarType(CsvFileName) = vbBoolean Then Exit Sub 'キャンセル時の処置
If VarType(CsvFileName) = vbBoolean Then End 'キャンセル時終了
r = 1 '行の初期値
For FlNo = 1 To UBound(CsvFileName) 'ファイル数分ループ
FFlNo = FreeFile '---使用可能なファイル番号取得
Open CsvFileName(FlNo) For Input As #FFlNo
Do Until EOF(FFlNo) '最終行までループ
Line Input #FFlNo, Li '一行読み込み
Bf = Split(Li, """,""") 'カンマで分割し配列に代入
If UBound(Bf) >= 0 Then '空白行の処理を飛ばす
With ShMain '1行分のデータをセルに出力
.Range(.Cells(r, 1), Cells(r, UBound(Bf) + 1)).Value = Bf
End With
End If
r = r + 1
Loop
Close #FFlNo
Next FlNo
End Sub
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
こんにちは
>If UBound(Bf) >= 0 Then '空白行の処理を飛ばす
で空白行を除いているのと同様に、条件に合わない行は記入処理をしなければ良いのではないでしょうか。
>C列にA or B or Cと入っている場合のみ、
が、該当条件なので「上の条件かつ空白行でなければ」という条件に変えれば良さそうです。
C列の値は配列の3番目なので、
Bf(LBound(Bf) + 2)
で取得できますが、このままいきなり実行すると、元のデータがB列で終わっていたりするとエラーになってしまいますので、まず、C列にデータが存在することをチェックしておく必要がありますね。
ということで、例えばC列の値を、一旦、変数cvに代入するとして
cv = ""
If LBound(Bf) + 2 <= UBound(Bf) Then cv = bf(LBound(Bf) + 2)
で取得できます。(値が無い場合は、空白文字列になる)
>C列にA or B or Cと入っている場合のみ
といのが「"A"または"B"または"C"が入っている場合」という意味なのか、「"A or B or C"が入っている場合」という意味なのか曖昧ですが、とりあえず前者と考えて、「cvが"A"か"B"か"C"で、かつ、空白行でなければ」という条件にすればよいことがわかります。
一方、空白行の場合は、cvを取得する際にcv=""となりますので、結局、cvの値のチェックだけで良いことになります。
長々と書きましたが、
>If UBound(Bf) >= 0 Then '空白行の処理を飛ばす
の部分を
cv = ""
If LBound(Bf) + 2 <= UBound(Bf) Then cv = bf(LBound(Bf) + 2)
If (cv = "A" Or cv = "B" Or cv = "C") Then
の3行に置き換えれば良いのではないでしょうか。
話は変わりますが…
ご提示の方法ではcsvをテキストとして1行ずつ読み込む方法をとっていますが、csvデータはエクセルで直接シートに読み込むことが可能なので、方法としては大分異なりますが、
1)csvデータを読み込む(エクセルがシートに展開)
2)シート上で不要なデータを削除
3)残ったデータを、所定のセル範囲へコピペ
のような手順の方が扱いやすいのではないかと思います。
ご提示の方法でも結局は全部のデータを走査していますので、ScreenUpdatingをオフにしておけば、処理時間が大幅に変わることはないのではないでしょうか。(速くなる可能性もあると思います)
No.1
- 回答日時:
念の為の確認ですが、目的は時間を短縮するためでしょうか?
それでしたら1行ごと判断して1行ごとの挿入になるので返って時間はかかります。
エクセルの場合まとめての処理の方が圧倒的に早くなりますよ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
【VBA】特定の値が入った行をコピーして別シートに貼り付ける方法をおしえていただきたいです。
Excel(エクセル)
-
エクセルVBAで、ある指定した文字を含む行だけを選択したいのですが、、 例えば、1〜20行目までに"10138524"
Excel(エクセル)
-
【ExcelVBA】300万件越えCSVから条件を満たす行だけ抽出するには?
Visual Basic(VBA)
-
-
4
エクセルVBAで、ある文字を含んでいたら別シートに抽出したい
Excel(エクセル)
-
5
別のシートから値を取得するとき
Visual Basic(VBA)
-
6
指定した文字があった場合、その行を削除するマクロが欲しいです
Excel(エクセル)
-
7
特定の文字がある行以外を削除するマクロ
その他(Microsoft Office)
-
8
VBAで特定の文字が入力されたセルを選択
Excel(エクセル)
-
9
エクセルVBAでセルに入力したパスでブックを開く
Excel(エクセル)
-
10
特定の文字列が含まれている行のみ抜き出して、別シートに書き出す方法(Excel 2007)
Excel(エクセル)
-
11
VBAで一覧表から特定の条件の行を抽出する
Excel(エクセル)
-
12
【VBA】特定列に文字が入っていたらそのセル行をコピーしてマスターブックの同じ行に貼り付けたい
その他(Microsoft Office)
-
13
【EXCEL VBA】Range(A:A").Find(What:="キーワード")の1行目について"
Visual Basic(VBA)
-
14
エクセルで特定の文字を含むセルをコピーしたい
Excel(エクセル)
-
15
エクセル VBA 特定文字がある行を別シートに移動
Visual Basic(VBA)
-
16
【Excel】複数の列を参照して、特定の文字列を含む行全体を別シートに抽出する関数
Excel(エクセル)
-
17
【VBA】テキストファイルから特定の文字列を抽出して、エクセルに出力する
Excel(エクセル)
-
18
VBA 数値を文字列として貼付したい
Excel(エクセル)
-
19
VBAで重複データを合算したい
Excel(エクセル)
-
20
VBAでワークシートを引数としてサンプル関数に渡したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで日付から日にちを削...
-
Excelで2つのデータの突合せを...
-
エクセルで1列に500行並んだデ...
-
Excelで2行単位のソートの出来...
-
excel:別シートの値を飛び飛び...
-
複数の条件に合う行番号を取得...
-
Excelの30個ずつの平均値の出し方
-
エクセルで、重複データを除外...
-
Countifよりも早く重複数をカウ...
-
エクセル2016にて、行挿入&コピ...
-
エクセルで横並びの複数データ...
-
VBA 数式を最終行までコピー
-
エクセルで時刻だけを抜き出す...
-
エクセルのデータの整理
-
エクセルの切り取り、挿入に関して
-
Excel 列データのランダムな並...
-
Excel エクセル 2003 セル内...
-
エクセルで1つの会社名に対して...
-
【エクセル】1列内に複数ある同...
-
EXCELでの重複データカウント方...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで1列に500行並んだデ...
-
複数の条件に合う行番号を取得...
-
エクセルで日付から日にちを削...
-
Excelで2つのデータの突合せを...
-
Excelで2行単位のソートの出来...
-
excel:別シートの値を飛び飛び...
-
エクセルで、重複データを除外...
-
Excelの30個ずつの平均値の出し方
-
Countifよりも早く重複数をカウ...
-
VBA 数式を最終行までコピー
-
エクセルVBA C列に特定の文字列...
-
エクセルで横並びの複数データ...
-
VBA 大きなtxtテキストファ...
-
エクセル~空白のセルのある行...
-
エクセル2016にて、行挿入&コピ...
-
500行の中から、多い順に抽出す...
-
エクセルで1つの会社名に対して...
-
Excel VBA 【QueryTables.Add】...
-
Excelでデーターが多いので、平...
-
Excelで社員の本名をニックネー...
おすすめ情報
コメントありがとうございます。
読み込む量が多いとパソコンのスペックによって、途中でVBAが止まってしまうことが多々ありましたので、時間というよりも読み込む量の少なさを重視したいと考えております。
もちろん早いに越したことはありません。
ありがとうございます。
うまく実行できたのですが、取り込んだデータの最初の方の行に空白(おそらくC列が空白で処理を飛ばした分の行)が出来てしまいました。
原因がちょっとわかりません....