- ベストアンサー
【ExcelVBA】特定データのセルの行を削除するには?
毎日、行も列も増えるCSVデータを手作業で加工して資料を作成しています。ある列の中でいくつかのセルに入っているデータ(複数)を見つけると、その行は削除しています。VBAで自動化したいのですが、どなたか良い方法を教えて頂けませんでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 できれば、もう少し具体的に書いてほしいですね。 「ある列の中でいくつかのセルに入っているデータ(複数)を見つけると」ということが分りません。 ・ある列とは、特定の列を指定するのですか? 例:3列目 ・複数のデータのどれかが、セルに該当するということですか? 例:AAAかBBBか もし、そういうことでしたら、以下のような内容になるかと思います。通常、Excelにインポートしてから処理するのですが、私は、テキスト処理のままで行ってしまうコードを考えました。そのほうが速いからです。このマクロは、擬似アドインとして、ブックは開いて、そのブックのマクロをのみを使うことにすると便利かと思います。 このマクロは、バックアップが出来ますので、元に戻したいときは、新しくできたファイルを削除して、$のついた名前のファイルの名前から、$を取ると、元に戻ります。 '<標準モジュール> Option Explicit Option Compare Text '大文字小文字などを別けない Sub CsvFindDel() Dim Fname As String, Oldname As String Dim inFno As Integer, outFNo As Integer Dim TextLine As String Dim myWdAr() As String, i As Integer, flg As Boolean, s As Integer Dim LineAr() As String ' 'ユーザー設定 '=================================================== '検索語は、イコール(=")の後に、「,コンマ」区切りで入れる。 Const myWord As String = "AAA,BBB" '調べる列 列数をイコール(=)の後に入れる Const myCol As Integer = 3 '=================================================== 'ユーザー定義のチェック If Len(myWord) = 0 Then MsgBox "検索語が入っていません。", 16: Exit Sub If myCol < 1 Or myCol > 256 Then MsgBox "不適当な列数が入っています。", 16: Exit Sub ' myWdAr = Split(myWord, ",") 'ファイルオープンダイアログ Fname = Application.GetOpenFilename("CSV ファイル(*.csv),*.csv") If Fname = "False" Then Exit Sub End If s = InStrRev(Fname, "\") 'バックアップを取る Oldname = Mid$(Fname, 1, s) & "$" & Mid$(Fname, s + 1) Name Fname As Oldname '入力ファイル inFno = FreeFile Open Oldname For Input As #inFno '出力ファイル outFNo = FreeFile Open Fname For Output As #outFNo ' Do Until EOF(inFno) Line Input #inFno, TextLine If Len(TextLine) > 1 Then '空行は出力しない '検索 For i = LBound(myWdAr) To UBound(myWdAr) LineAr() = Split(TextLine, ",") If LineAr(myCol - 1) Like myWdAr(i) & "*" Then flg = True Exit For End If Next i If flg = False Then '検索語がヒットしなければ、 Print #outFNo, TextLine 'テキスト出力 Else flg = False 'フラグを戻す End If End If Loop 'ファイルを閉じる Close #inFno Close #outFNo MsgBox "終了しました。" End Sub
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
>ある列の中でいくつかのセルに入っているデータ(複 特定の列、たとえばD列とI列の場合は、同じ文字列が別行に入っていると 下の方の行を削除したいということでしょう? VBAも削除プログラムを作ったとして、起動は操作者がやらないとなりません。 イベントプロシージュアもありますが、満足できるものがない。精緻にやるにはスキルがいります。 それで、入力規則や条件つき書式でダブりの表示にとどめ、終わるときなどに一括して、CTRLを押しながら行を指定して、削除売ればよいと思いますがどうですか。 VBAも参考に A列のダブり行を削除する例 Sub test07() d = Range("A65536").End(xlUp).Row For i = d To 1 Step -1 n = Application.WorksheetFunction.CountIf(Range(Cells(1, 1), Cells(i, "A")), Cells(i, "A")) If n >= 2 Then Cells(i, "a").EntireRow.Delete End If Next i End Sub
お礼
ありがとうございます。 試してみます。
- shkwta
- ベストアンサー率52% (966/1825)
流れとしてはこんな感じだと思います。 Dim 行, ある列, 行数 As Long Dim 対象シート As Worksheet Set 対象シート = Sheets("・・・") ある列 = ・・・ 行数 = 対象シート.UsedRange.Rows With 対象シート 行 = 1 Do While 行 <= 行数 If .Cells(行, ある列) = 《問題のデータ》 Then .Rows(行).Delete 行数 = 行数 - 1 Else 行 = 行 + 1 End If Loop
お礼
ありがとうございます。 試してみます。
お礼
ありがとうございます。 コピーアンドペーストして試してみました。 見事に希望通りのことができました。 擬似アドインにする方法をお教え頂けると幸いです。