EXCEL-VBAを使ってワークシートのデータ整形をしています。
ある文字列を検索し、その文字列を含む行とその前後の行を削除するロジックを記述したいのですがうまくできません。
例:検索文字列「合計」、"合計"の入っているセル「B120」のとき、B119~B121の3行分の行削除をしたい。
おそらく検索された文字列を含むセルの行番号を取得してその番号-1と+1の行を選択して削除すればよいのではないかと思ってるのですが、もっと良い方法があるのでしょうか?
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

マクロを書いてみました。


検索する文字を入力します。シートの中であるだけ削除してしまいます。

削除する行が2行以上離れている保証があれば簡単なのですが、連続して削除対象、1行飛んで削除対象も考慮するのに考え込んでしまいました。解決方法として、最初に削除するセルに『削除する行です』と書き込んで、後から『削除する行です』と書いた行を削除しています。(多分うまくいくと思います)
削除なので、コピーを取って実行して下さい。(保存しなければいい?)

標準モジュールに貼り付けます。

Public Sub Kensaku_Delete2()
  Dim sch_Moji As String '検索する文字
  Dim sch_rg As Range '検索したセル
  Dim sch_RowNo As Long '検索したセルの行番号

  sch_Moji = InputBox("検索する文字を入力して下さい。")
    If sch_Moji = "" Then
      Exit Sub
    End If

  Application.ScreenUpdating = False
  '削除する行に印を付ける
  Range("A1").Select
  Set sch_rg = Cells.Find(sch_Moji)
  While Not (sch_rg Is Nothing)
    If sch_rg.Row <> 1 Then
      sch_rg.Offset(-1, 0) = "削除する行です" '前の行に印をつける
    End If
    sch_rg.Offset(1, 1) = "削除する行です" '次の行に印をつける(1つ右)
    sch_rg.Offset(0, 0) = "削除する行です" '探した行に印をつける

    Set sch_rg = Cells.FindNext(ActiveCell)
  Wend

  '印を付けた行を削除する
  Range("A1").Select
  Set sch_rg = Cells.Find("削除する行です")
  While Not (sch_rg Is Nothing)
    Rows(sch_rg.Row).Delete

    Range("A1").Select
    Set sch_rg = Cells.FindNext(ActiveCell)
  Wend
  Application.ScreenUpdating = True
End Sub
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q[Excel] ある列にある文字列を含む場合にその文字列を削除する方法

UFJ東京三菱銀行の明細をDownloadできないので、コピペしています。

しかしながら、金額に"円"という文字を含むため、そのセルは通貨ではなく、文字列として認識してしまいます。ですのでそのセルに含まれる
特定の文字列"円"をワンアクションで削除していきたいのですが、
どのように関数(マクロ?)を組んでいいかわかいません。
ご助言をお願いします。

Aベストアンサー

「編集」-「置換」で円を""に置換する作業を、「マクロの記録」で記録します。
次回からは、そのマクロを呼び出すことで、同じ処理が実行できます。
ボタンなどに、マクロを登録しておけば、ボタンを押すだけ(ワンアクション)でよくなります。

QExcelで、sheet全てを含む形で、文字列の検索を行い、該当する文字列のあるsheetへ自動的に飛ぶにはどうしたらよいでしょうか?

環境:Excel2003
状態:Excelのsheet毎に「ア行」「カ行」・・・と作り、10sheet作成。
   それぞれ「ア行」のsheetなら、「あ行」の氏名を、
   「カ行」のsheetなら、「か行」の氏名を記載しています。
【検索したいこと】
例えば、「明本」と検索sheet上などで検索をした場合、自動的に「ア行」sheetの「明本」のセルに飛ぶようにしたい。

※通常の「検索」「オプション」の方法以外に何かありましたら、お教えいただければと思います。

※マクロについては初心者なので、もしマクロでの方法がありましたら詳しく教えていただきたく思います。

すみませんが、宜しくお願い致します。

Aベストアンサー

「検索」「オプション」で検索場所をシートからブックに変更すれば、全体のシートから目的の単語で検索できます

マクロでも出来ると思いますが、難しそうなのでこの方法が一番簡単ではないでしょうか?

QExcelVBA。行を検索してセルに文字が入っていたら、その行を残して他の行を削除したい。

ExcelVBAに関する質問です。(カテ違いで質問したためこちらで再度質問します)
部課ごとに研修管理表.xlsx(共有)を作成しています。

A列:№
B列:研修内容
C列:備考欄
D列~AD列:氏名

9行目~100行目あたりまで、B列に研修内容が記載されています。
D~AD列に書かれた個人が、研修を受けたいセルに自分で○印をつけます。
(氏名の記載は、D8~AD8にあります。 ※ADを超える場合も想定しています。)

D9~AD100に○印が入力されている行のみ残し、入力されていない行を削除したく、
色々調べて以下のようなコードをみつけたので修正したうえで記述してみました。
実行結果は、○印のある行を抽出することはできましたが、○印のない行を削除できません。
○印の開始はD9ですが、最終はAD列以降になる可能性もあります。(人が増えたら)
また、研修内容も100行以降増えないと思いますが、増えてもいいようにしたいです。
VBAに精通しているかた、どうぞよろしくお願いします。



Sub sample()
Dim a As Range
Dim r As Range
Dim c As Range
Dim f As Range

Set a = Range("D9:AD100")
Set c = a.Find(what:="○", lookat:=xlWhole)
If c Is Nothing Then
MsgBox "処理すべきものがありません"
Exit Sub
End If

Set f = c

Do
If r Is Nothing Then
Set r = c.EntireRow
Else
Set r = Union(r, c.EntireRow)
End If
Set c = a.FindNext(c)
Loop While c.Address <> f.Address
MsgBox "以下の行を残して他の行を削除します" _
& vbLf & Join(Split(r.Address, ","), vbLf)
r.Delete
End Sub

ExcelVBAに関する質問です。(カテ違いで質問したためこちらで再度質問します)
部課ごとに研修管理表.xlsx(共有)を作成しています。

A列:№
B列:研修内容
C列:備考欄
D列~AD列:氏名

9行目~100行目あたりまで、B列に研修内容が記載されています。
D~AD列に書かれた個人が、研修を受けたいセルに自分で○印をつけます。
(氏名の記載は、D8~AD8にあります。 ※ADを超える場合も想定しています。)

D9~AD100に○印が入力されている行のみ残し、入力されていない行を削除したく、
...続きを読む

Aベストアンサー

こんな感じでしょうか。

Sub sample()
Dim I As Long
For I = Cells(Rows.Count, "A").End(xlUp).Row To 9 Step -1
If WorksheetFunction.CountIf(Range(Cells(I, "D"), Cells(I, Columns.Count)), "○") = 0 Then
Rows(I).Delete Shift:=xlUp
End If
Next
End Sub

Qエクセルで、文字列を検索し、その文字を含んだセルの内容を別のシートに表示する。

SHEET1のA列に文字列を含むデータがあります。
これをデータベースとして、
SHEET2のセルA1に「ある特定の文字列」を含むSHEET1のセルの内容を表示させたい場合、どのような関数を使ったら良いでしょうか。

具体的には、SHEET1に特許明細の各項目が、A1~A100くらいまであります。
各項目には、例えば、出願人、出願日、効果、請求項などの文字列が含まれます。

そこでSHEET2のA1に「請求項」と入力すると「請求項」という文字列を検索し、その文字列を含んだセルの内容を表示させたいのです。そのセルは一つとは限りません。

以上のような事は、関数で可能でしょうか。

Aベストアンサー

すいません式の訂正です。
INDEX(SHEET1!$A$1:$A$100,SMALL(IF(SHEET1!$B$1:$B$100>=1,SHEET1!$C$1:$C$100),),C1),0)
でした。
配列数式がややこしいならSHEET1のB列に=COUNTIF(A1,"=*"&SHEET2!$A$1&"*")といれ、B100までコピーしたあと、次にC列に=IF(B1=1,A1&" ","")といれ、C100までコピーしていきます。SHEET2に
=CONCATENATE(SHEET1!C1,SHEET1!C2,------SHEET1!C100)
と入れると検出された項目がまとめてスペースで区切られて同一セルに出てきます。

QExcelのVBAでテキストファイルのAの文字列がある行とCの文字列がある行の間にBを追記したい

以下のプログラムを実行してs.txtを作成します。

Sub test()
Open "C:\s.txt" For Output As #1
Print #1, "A"
Print #1, "C"
Close #1
End Sub

これで1行目がA、2行目がCのテキストファイルが作成されます。

この作成したテキストファイルのAがある行とCがある行の間にBを追記し、

1行目 A
2行目 B
3行目 C

このようにするにはどうすればよいのでしょうか?

使用OS:Windows XP
使用ソフト:Microsoft Excel 2003

ご存知の方がおられましたらご回答をよろしくお願いします。

Aベストアンサー

質問者の意図をそのまま実行するなら、
配列に読み込んで、ずらしてから書き込む。
昔、シーケンシャルファイルをよく扱ったことがあったが。

Sub test2()
Dim s(20) as string,r as integer 'サイズは適当に合わせる
Open "C:\s.txt" For Input As #1
r = 0
Do While Not EOF(1)
r = r + 1
Line Input #1, s(r)
If s(r - 1) = "A" And s(r) = "C" Then
s(r + 1) = s(r)
s(r) = "B"
r = r + 1
End If
Loop
re = r
Close #1
Open "C:\s.txt" For Output As #1
For r = 1 To re
Debug.Print r, s(r)
Print #1, s(r)
Next
Close #1
End Sub


人気Q&Aランキング

おすすめ情報