- 締切済み
特定文字列以下のセル削除
こんにちは。 特定の文字列を含むセルから5行削除するマクロを作りたいのですが、 どのようにするとよいでしょうか。 特定文字列は、各列に1つあり、行の位置はバラバラです。 その特定文字列を含み以下5行分のセルを削除し、上に詰めたいと考えています。 初心者ゆえ、ご指導ください。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- keithin
- ベストアンサー率66% (5278/7941)
>特定文字列は、各列に1つあり、行の位置はバラバラです。 特定文字列が各列に1つしか無い(1つあるだけ=2つ以上はゼッタイにない)ことは保証されているとします。 (まぁ,その保証ができない=やっぱり2つ以上有るかもしれないなら,どーしたいのかあなたの方で決めて,各列に幾つあるか調べて適切に対処するマクロにするだけですけどね) それからいわずもがなですが「セルを削除する」のであって,行を削除したりはしないものとします。 作成例: sub macro1() dim c as range set c = cells.find(what:="あ", lookin:=xlvalues, lookat:=xlpart) do until c is nothing c.resize(5, 1).delete shift:=xlshiftup ’# set c = cells.find(what:="あ", lookin:=xlvalues, lookat:=xlpart) loop end sub #大概こういう所が曖昧なんですが >その特定文字列を含み以下5行分のセルを削除 縦に5つのセルを削除して上に詰めるとしますが,もし違うなら適切に応用して下さい。
- tsubuyuki
- ベストアンサー率45% (699/1545)
お望みのように、 > 特定文字列を含み以下5行分のセルを削除し、上に詰めたい と言う処理をマクロ化するのはそんなに難しい話ではなさそうです。 が、私はあえて安易に提案するのはやめておきます。 具体的に理由を申し上げると、 可能性の問題ではあるのですが、例えばデータが・・・ いわし あじ さんま かつお さけ まぐろ ぶり かんぱち ぼら たい とあったとします。 特定の文字列「さ」を含む行とその下4行(正味で5行)を削除して上に詰めましょう。 人間の目で見ると「さ」を含むモノは「さんま」「さけ」ですので、 「さんま」から5行、「さけ」から5行を削除した形 いわし あじ たい が正解のような気がします。 エクセル(VBA)では、通常の場合は1行ごとに削除していくものですから、 (1)上から見に行くとして まずヒットするのが「さんま」です。 じゃぁ、さんまから下、合計5行削除しましょう。 いわし あじ かんぱち ぼら たい 「さけ」も削除されてしまったので、こんな結果が返ってきます。 (2)下から見に行くと この場合は「さけ」が先にヒットしますので、5行削除すると いわし あじ さんま かつお たい こうなりますね。 さらに検索は続きますので、今度は「さんま」がヒットしますので これを含む5行を削除しちゃいます。 よって、最終的な結果は いわし あじ しか残りません。 (1)のケースでは「さけ」から5行を削除すると言う条件が適用されませんし、 (2)のケースでは「たい」は本来の削除対象では無いのに削除されてしまいますね。 このように > 特定文字列を含み以下5行分のセルを削除し、上に詰めたい と単純にやると必ず「矛盾」が生じてしまいます。 これのどちらを「求める結果」とするのか、 あるいはどちらでもなく、当初の「目で見た結果」が欲しいのか。 マクロを組む時はこのあたりも重要なポイントの一つです。
- K Kazz(@JazzCorp)
- ベストアンサー率31% (549/1751)
Option Explicit Sub RowsDelete() Const xHeads = 1 Const xKey = "*特定の文字列*" Dim xText As Range Dim kk As Long Dim nn As Long Dim xMatchRow(1 To 100) As Long kk = 1 For Each xText In ActiveSheet.UsedRange If xText.Value Like xKey Then xMatchRow(kk) = xText.Row kk = kk + 1 End If Next '下から For kk = kk - 1 To 1 Step -1 nn = xMatchRow(kk) If (nn <> 0) Then Rows(nn & ":" & nn + 4).Delete Shift:=xlUp End If Next End Sub
- tom04
- ベストアンサー率49% (2537/5117)
No.1です! たびたびごめんなさい。 投稿後に思ったのですが、 前回のコードでは、仮に5行以内に「特定の文字列」が複数あった場合は 必要な行まで削除されてしまいます。 もしそのような状況があれば別の方法を考える必要があると思います。 例えば 「特定の文字列」があれば一気に5行を削除するのではなく一旦5行分のデータをクリアし、 最後に空白行を削除する! といったような具合に・・・ とりあえずはこの程度で! どうも失礼しました。m(_ _)m
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! >特定の文字列を含むセル とありますので、そのセルが完全一致ではない!というコトですよね? あるセルに「あ」を含む文字列がある場合の一例です。 Sub test() 'この行から Dim i As Long Dim j As Long For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1 j = Cells(i, Columns.Count).End(xlToLeft).Column If WorksheetFunction.CountIf(Range(Cells(i, 1), Cells(i, j)), "*あ*") Then Rows(i & ":" & i + 4).Delete End If Next i End Sub 'この行まで ※ ある文字部分「あ」は実状に合わせて変更してください。 ※ 質問では最終列が判断できないので、各行ごとに最終列を取得するようにしてみました。 こんなんではどうでしょうか?m(_ _)m