プロが教えるわが家の防犯対策術!

こんにちは。

特定の文字列を含むセルから5行削除するマクロを作りたいのですが、
どのようにするとよいでしょうか。
特定文字列は、各列に1つあり、行の位置はバラバラです。
その特定文字列を含み以下5行分のセルを削除し、上に詰めたいと考えています。

初心者ゆえ、ご指導ください。

A 回答 (5件)

>特定文字列は、各列に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つのセルを削除して上に詰めるとしますが,もし違うなら適切に応用して下さい。
    • good
    • 0

お望みのように、


> 特定文字列を含み以下5行分のセルを削除し、上に詰めたい
と言う処理をマクロ化するのはそんなに難しい話ではなさそうです。
が、私はあえて安易に提案するのはやめておきます。


具体的に理由を申し上げると、
可能性の問題ではあるのですが、例えばデータが・・・
  いわし
  あじ
  さんま
  かつお
  さけ
  まぐろ
  ぶり
  かんぱち
  ぼら
  たい
とあったとします。
特定の文字列「さ」を含む行とその下4行(正味で5行)を削除して上に詰めましょう。
人間の目で見ると「さ」を含むモノは「さんま」「さけ」ですので、
「さんま」から5行、「さけ」から5行を削除した形
  いわし
  あじ
  たい
が正解のような気がします。

エクセル(VBA)では、通常の場合は1行ごとに削除していくものですから、
(1)上から見に行くとして
  まずヒットするのが「さんま」です。
  じゃぁ、さんまから下、合計5行削除しましょう。
     いわし
     あじ
     かんぱち
     ぼら
     たい
  「さけ」も削除されてしまったので、こんな結果が返ってきます。

(2)下から見に行くと
  この場合は「さけ」が先にヒットしますので、5行削除すると
     いわし
     あじ
     さんま
     かつお
     たい
  こうなりますね。
  さらに検索は続きますので、今度は「さんま」がヒットしますので
  これを含む5行を削除しちゃいます。
  よって、最終的な結果は
     いわし
     あじ
  しか残りません。

(1)のケースでは「さけ」から5行を削除すると言う条件が適用されませんし、
(2)のケースでは「たい」は本来の削除対象では無いのに削除されてしまいますね。
このように
> 特定文字列を含み以下5行分のセルを削除し、上に詰めたい
と単純にやると必ず「矛盾」が生じてしまいます。


これのどちらを「求める結果」とするのか、
あるいはどちらでもなく、当初の「目で見た結果」が欲しいのか。
マクロを組む時はこのあたりも重要なポイントの一つです。
    • good
    • 0

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
    • good
    • 0

No.1です!


たびたびごめんなさい。

投稿後に思ったのですが、
前回のコードでは、仮に5行以内に「特定の文字列」が複数あった場合は
必要な行まで削除されてしまいます。

もしそのような状況があれば別の方法を考える必要があると思います。

例えば
「特定の文字列」があれば一気に5行を削除するのではなく一旦5行分のデータをクリアし、
最後に空白行を削除する!

といったような具合に・・・

とりあえずはこの程度で!
どうも失礼しました。m(_ _)m
    • good
    • 0

こんにちは!



>特定の文字列を含むセル

とありますので、そのセルが完全一致ではない!というコトですよね?

あるセルに「あ」を含む文字列がある場合の一例です。

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
    • good
    • 0

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