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テーブルリンク エクセルの4行目を先頭行にしたい

エクセルのデータをアクセスにテーブルリンクしたいのですが
エクセルの先頭行が4行目から始まります。
なおかつA1に文字が入ります。
(画像参照)

このエクセルデータをアクセスの
「テーブルのリンク」→ファイルを選ぶ
→ワークシートリンクウィザードが表示され、次のページに進み、
「先頭行をフィールド名として使う」にチェックを入れたいのですが、先頭行は4行目です。

この場合、どうすればエクセルの4行目を
アクセスのテーブルリンクの先頭行にできるのでしょうか?

エクセルのA1の文字を消去すれば自動的に4行目がアクセスで先頭行になりますが
エクセルの方は決まったフォーマットなのでA1の文字を消去することはできません。

ご回答よろしくお願いします。

Aベストアンサー

#1です

Excel ファイル側に手を入れられるのなら、#2さんの方がお勧めです。

なお、範囲名部分が行方向に増えるのなら、(Excel側で範囲を再設定)
何もせずに Access 側から変更を含めて値を得ることが出来るようですが、
列方向に範囲が広がった場合、 リンクの更新(RefreshLink)が必要みたいです。

嘘を言ってるかも知れないので、裏取りはしっかりとしてください。

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

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

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

Aベストアンサー

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

Qエクセルで、条件を指定した行数のカウントについて

エクセルにて、条件に合致する行数のカウントを行うことは出来ますでしょうか。

添付画像のようなエクセルファイルにて、各日毎に「AAA」を含む行は何行あり、「BBB」を含む行は何行あるかをカウントしたいです。

添付のエクセルであれば、A列が「10月1日」でB列に「AAA」を含む行は○行という条件でカントが出来れば実現可能とは思いますが、
こういったカウントの仕方がそもそもエクセルで出来るのかどうか知りたいです。

もし、エクセル以外の方法で可能なのであれば、その方法も教えていただけるとありがたいです。

Aベストアンサー

SUMPRODUCT関数などを使った場合にはデータ数が多くなった場合には計算が重くなります。
作業列を使った方法がよいでしょう。
お示しのデータがシート1に有るとしてC列を作業列としてC2セルには次の式を入力して下方にオートフィルドラッグします。

=IF(A1="","",IF(COUNTIF(B1,"AAA*"),A1&"AAA",IF(COUNTIF(B1,"BBB*"),A1&"BBB","")))

次にお望みの表を別のシートに表示させるとしたら別のpシートのB1セルにはAAAと入力しC1セルにはBBBと入力します。
A2セルから下方には例えば10月1日からの日付を入力します。
B2セルには次の式を入力してC2セルまでオートフィルドラッグしたのちに下方にもオートフィルドラッグします。

=IF($A2="","",COUNTIF(Sheet1!$C:$C,$A2&B$1))

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

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

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

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

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

Aベストアンサー

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

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

Qテキストファイルから必要な項目(行)をエクセルの行に移行させるには

テキストファイルから必要な項目(行)をエクセルの行に移行させる簡単な方法を教えて下さい。
1テキスト=エクセルの1行

Aベストアンサー

コピーアンドペーストでうまくいく気がします。
テキストファイルを、ノートパッドなどで開いて、全文をコピーし、エクセルに貼り付けるだけです。エクセルは、左上端のセル一つだけが選択された状態にしておきます。複数のセルを選択しているとサイズが合わないと文句を言われるかもしれません。

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)
と入れると検出された項目がまとめてスペースで区切られて同一セルに出てきます。

Qエクセルの行の幅について

 エクセルの行幅を立ち上げ時点から太くしたいと思います。
 エクセルの行の幅は、立ち上げると12.75という高さになっているようです。しかし、これでは少々見づらいので15くらいにしたいと思います。
 もちろん、「行の高さ」で変更できるのは分かるのですが、毎回、修正するのが煩雑です。従って、立ち上げた初期段階から行の高さを変更することはできないでしょうか。

Aベストアンサー

う~ん。

確か、エクセルの初期設定で変更できるのは、
「シート数」「フォントの書体」「フォントの大きさ」
くらいだったと思います。
行の幅を、立ち上げ時から指定の幅にする事は出来なかったような…。

私自身、エクセルを結構利用するのですが、行の幅を変更するときは、
「全選択(画面左上の行(1)の上、と列(A)の左、の長方形の部分をクリック)」して、
行(1)と、行(2)の間にある線をドラッグして一気に全ての行の幅を変えています。

もし、それすらも煩雑と感じるほどにエクセルを新規で立ち上げているのであれば、
以下の方法はどうでしょうか?

1.行の幅を15に設定した「白紙のエクセル」をデスクトップに保存する。
2.新規で利用したい場合は、1で保存したエクセルをデスクトップ上でコピー(Ctrl + C)&ペースト(Ctrl + V)
3.ペーストしたエクセル(白紙で行幅15)を立ち上げる。

こうすれば、毎回行幅を変更する事なく、立ち上げ時から行幅15のエクセルが使用できますよ♪

ただ、全選択して一気に行幅を変える前者のやり方の方が簡単な気もしますが…。(汗

う~ん。

確か、エクセルの初期設定で変更できるのは、
「シート数」「フォントの書体」「フォントの大きさ」
くらいだったと思います。
行の幅を、立ち上げ時から指定の幅にする事は出来なかったような…。

私自身、エクセルを結構利用するのですが、行の幅を変更するときは、
「全選択(画面左上の行(1)の上、と列(A)の左、の長方形の部分をクリック)」して、
行(1)と、行(2)の間にある線をドラッグして一気に全ての行の幅を変えています。

もし、それすらも煩雑と感じるほどにエクセルを新規で立...続きを読む

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エクセルの行の幅がずれる

エクセルで表を作っているのですが
行の高さを25にして確かめてみると
どうしても24.5というように25の幅になっていません。
どうすればきっちり自分の設定した行の高さになるのでしょうか教えてください。
エクセルは2000を使っています。

Aベストアンサー

セルの高さの単位はなんでしょう?
ポイントという単位なのですが、1ポイントは約0.35mmでポイントは文字の大きさの単位と同じです。エクセルでは11ポイントの場合標準の高さが13.5、14ポイントでは17.5と変化します。
エクセルの標準フォントの高さを基準にしています。(これはオプションで変更できます。)

ピクセルと言う基準があって、これをポイントと言う単位に直しているので、25と言う端数のない数値にならない事がある。

例えば、幅はどうでしょう、これは標準フォントの文字数を表しています。(規定があるのですが省略)

と言う事で、出来ません。
25の右にあるピクセルと言う単位を基本に使うようにしたらいかがでしょう。
例えば列幅とも100ピクセルを選択するとセルは正方形になります。(ピクセルは列幅とも同じ物です。)
この併記はエクセル2000から始まったようですが。(単位が違うので、合わせるためみたいです。)

Qエクセルである列に重複する文字列があるとき、その文字列の右の列の「数値」の合計がしりたい

電話対応者、A、Bがいます。それぞれの対応時間がエクセルで、下記のようにセルで並んでいます。
A a秒
A b秒
B c秒
A d秒
B e秒
B f秒
A g秒

A、B、それぞれの総電話対応時間を集計したいのですが、
エクセルではどうすればいいのでしょうか?

Aベストアンサー

回答番号:No.1です
こんな時間に意外と回答が付きますね...ちょっとびっくり

では、こんな方法もありますよっ てことで
やはり、フィールド名が必要で、対応時間は数値です

1. 電話対応者で並び替える(昇順、降順どちらでも良い)
2. データ - 集計
3. グループの基準 電話対応者
4. 集計方法 合計
5. 集計するフィールド 対応時間
6. [OK]


人気Q&Aランキング