• ベストアンサー

【ExcelVBA】特定データのセルの行を削除するには?

毎日、行も列も増えるCSVデータを手作業で加工して資料を作成しています。ある列の中でいくつかのセルに入っているデータ(複数)を見つけると、その行は削除しています。VBAで自動化したいのですが、どなたか良い方法を教えて頂けませんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 できれば、もう少し具体的に書いてほしいですね。 「ある列の中でいくつかのセルに入っているデータ(複数)を見つけると」ということが分りません。 ・ある列とは、特定の列を指定するのですか?  例: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

sonans
質問者

お礼

ありがとうございます。 コピーアンドペーストして試してみました。 見事に希望通りのことができました。 擬似アドインにする方法をお教え頂けると幸いです。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

>ある列の中でいくつかのセルに入っているデータ(複 特定の列、たとえば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

sonans
質問者

お礼

ありがとうございます。 試してみます。

  • shkwta
  • ベストアンサー率52% (966/1825)
回答No.1

流れとしてはこんな感じだと思います。 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

sonans
質問者

お礼

ありがとうございます。 試してみます。