
エクセル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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセルVBAで、ある指定した文字を含む行だけを選択したいのですが、、 例えば、1〜20行目までに"10138524"
Excel(エクセル)
-
【VBA】特定の文字が入っている行の一部を抽出して別シートコピーするには
Visual Basic(VBA)
-
特定の文字列が含まれている行のみ抜き出して、別シートに書き出す方法(Excel 2007)
Excel(エクセル)
-
-
4
指定した文字があった場合、その行を削除するマクロが欲しいです
Excel(エクセル)
-
5
【ExcelVBA】300万件越えCSVから条件を満たす行だけ抽出するには?
Visual Basic(VBA)
-
6
条件にマッチする行を抽出するVBAを教えてください
経営情報システム
-
7
【Excel VBA】複数ある特定の文字列を含む行を削除
Excel(エクセル)
-
8
エクセルVBAで、ある文字を含んでいたら別シートに抽出したい
Excel(エクセル)
-
9
ある文字列を含む行の抽出
Excel(エクセル)
-
10
【VBA】特定列に文字が入っていたらそのセル行をコピーしてマスターブックの同じ行に貼り付けたい
その他(Microsoft Office)
-
11
エクセルVBAで、条件に一致するセルへ移動
Excel(エクセル)
-
12
スクロールしてもボタンを常に表示させたい。Excel2002
Excel(エクセル)
-
13
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
14
特定の文字がある行以外を削除するマクロ
その他(Microsoft Office)
-
15
VBAで特定の文字が入力されたセルを選択
Excel(エクセル)
-
16
【至急】エクセルで複数のファイルから文字列を検索、行全てを抽出する
Excel(エクセル)
-
17
エクセルで特定の文字が入ってる列を削除方法
Excel(エクセル)
-
18
EXCEL VBA で指定した範囲に入力があるかどうか?
Visual Basic(VBA)
-
19
VBAで条件が一致する行のデータを別シートに抽出
Excel(エクセル)
-
20
今日の日付が入った行のデータを取得するマクロ
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで2行単位のソートの出来...
-
エクセルで日付から日にちを削...
-
Countifよりも早く重複数をカウ...
-
複数の条件に合う行番号を取得...
-
エクセルで1列に500行並んだデ...
-
excel:別シートの値を飛び飛び...
-
VBA 数式を最終行までコピー
-
エクセルで、重複データを除外...
-
エクセルで横並びの複数データ...
-
Excel VBA 空白セル以下のデー...
-
Excelの30個ずつの平均値の出し方
-
不要な行を消したい
-
本日の日付を超えているものを...
-
VBA 大きなtxtテキストファ...
-
500行の中から、多い順に抽出す...
-
エクセルで1つの会社名に対して...
-
A1セルに入力したら、入力時間...
-
Excelの入力規則で2列表示したい
-
複数の文字列のいずれかが含ま...
-
EXCELで○ヶ月を○年○ヶ月に変換...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで日付から日にちを削...
-
Excelで2行単位のソートの出来...
-
複数の条件に合う行番号を取得...
-
エクセルで1列に500行並んだデ...
-
Countifよりも早く重複数をカウ...
-
excel:別シートの値を飛び飛び...
-
エクセルで、重複データを除外...
-
Excelの30個ずつの平均値の出し方
-
不要な行を消したい
-
VBA 数式を最終行までコピー
-
【エクセル】1列内に複数ある同...
-
EXCELでsheet1のデータをsheet2...
-
【VBA】A列にある連続したデー...
-
重複するデータの一部だけを抽...
-
エクセルで横並びの複数データ...
-
Excelで社員の本名をニックネー...
-
エクセルVBA C列に特定の文字列...
-
エクセル2016にて、行挿入&コピ...
-
本日の日付を超えているものを...
-
エクセルの集計方法について
おすすめ情報
コメントありがとうございます。
読み込む量が多いとパソコンのスペックによって、途中でVBAが止まってしまうことが多々ありましたので、時間というよりも読み込む量の少なさを重視したいと考えております。
もちろん早いに越したことはありません。
ありがとうございます。
うまく実行できたのですが、取り込んだデータの最初の方の行に空白(おそらくC列が空白で処理を飛ばした分の行)が出来てしまいました。
原因がちょっとわかりません....