みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

excel 空白のセルがある行を削除するマクロ

A列に、みかん りんご バナナ 肉 などと入力されており、
B1に=if(countif(A1,"*みかん*")+countif(A1,"*りんご*")+countif(A1,"*バナナ*"),"fruit","")
という感じで、fruit か 空白 を返す関数が入力されており、オートフィルでB列に数式をコピーするマクロを実行します。
その次に、B列で空白のセルがある場合、その行を削除するというマクロを下記のように入力しましたが、削除されません。

Dim lastRow As Long
Dim i As Long
lastRow =Range("B"&Rows.count).End(xlup).Row
For i =lastRow To 5 Step -1
If Cells(i,"B").Value="" Then
Rows(i).Delete XlShiftUp
End If
Next i

間違いをどなたか教えてください。

ちなみに、B列が関数では無く、ただの文字列の場合("fruit")ではマクロが実行できました。
関数の値からマクロを実行することは不可能なのでしょうか?
解答、宜しくお願い致します。

投稿日時 - 2011-08-04 21:03:35

QNo.6921683

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

マクロは正しいと思いますが、お示しのマクロではB5セルより下行のセルに空白がある場合に削除されますね。
おっしゃっているのはB列で空白の行が削除されないとのことですがマクロでは5行目以下での空白行の削除ですから勘違いをされていませんか?

投稿日時 - 2011-08-06 07:24:25

お礼

解決しました。ありがとうございました!

5行目まで下から順に削除したかったのですが、全く削除されなかった為、
何行目までとかにはあまり重点をおいておらず、説明の記載不足になってしまい、
すみませんでした。。。

投稿日時 - 2011-08-08 23:52:54

ANo.4

No.1 KURUMITOさんの案
If Cells(i,"B").Value <> "fruit" Then
でもNGとは不思議です。

文字数で判定すればどうなるでしょうか?
Dim lastRow As Long
Dim i As Long

lastRow = Range("B" & Rows.Count).End(xlUp).Row
For i = lastRow To 1 Step -1
If Len(Cells(i, "B").value) = 0 Then
Rows(i).Delete xlShiftUp
End If
Next i

シート名を明記するとか
Dim lastRow As Long
Dim i As Long

lastRow = Worksheets("Sheet1").Range("B" & Rows.Count).End(xlUp).Row
For i = lastRow To 1 Step -1
If Worksheets("Sheet1").Cells(i, "B").value = "" Then
Worksheets("Sheet1").Rows(i).Delete xlShiftUp
End If
Next i

他に
該当シートのB列固有の問題なのかどうか
数式を他の列に入れるとか、新しいシートでやってみるとか
色々試してください。

投稿日時 - 2011-08-06 06:47:53

お礼

解決しました。

当方の記載漏れだったのですが、実際のデータではオートフィルの部分を
Selection.AutoFill Destination:=Range("B1:B65536"), Type:=xlFillDefault
と記入しており、一番下の65536行目から順に削除されていた為、
時間がかかりすぎたり、実行されずに終了してしまうことがわかりました。

オートフィルの指摘を頂き、新しいシートでデータの行を20行ぐらいに減らして
実行してみたら、難なく削除され、理由が判明しました。
様々なアドバイス有り難うございました!

投稿日時 - 2011-08-08 23:41:06

ANo.3

動き、削除されましたが
B1セルの式は(手動で)
=IF(COUNTIF(A1,"*みかん*")+COUNTIF(A1,"*りんご*")+COUNTIF(A1,"*バナナ*"),"fruit","")
Sub Macro4()
Range("B1").Select
Selection.AutoFill Destination:=Range("B1:B20"), Type:=xlFillDefault
lastRow = Range("B" & Rows.Count).End(xlUp).Row
MsgBox lastRow
For i = lastRow To 5 Step -1
If Cells(i, "B").Value = "" Then
Rows(i).Delete xlShiftUp
End If
Next i
End Sub

投稿日時 - 2011-08-05 13:27:15

お礼

有り難うございます。

関数の部分は実際は、
=if(countif(RC[-1],""*みかん*"")+countif(RC[-1],""*りんご*"")+countif(RC[-1],""*バナナ*""),""fruit"","""")
となっていました。

B列をコピーして、C列に値だけ貼付けて、
C列の値で行を削除するマクロを実行という
やり方であれば、実行できました。
この方法でやってもいいかなと思いましたが、
データの行が多すぎると時間がかかり過ぎてしまうという、
問題に当たってしまいました…。

投稿日時 - 2011-08-05 22:54:31

ANo.2

当方Excel2007では問題なく実行されました。

数式は間違いないですか?
数式の戻り値は正しく、""となっていますか?
数式をフィル入力するマクロを拝見できないでしょうか。

投稿日時 - 2011-08-04 22:36:29

お礼

有り難うございます。
遅くなり申し訳ございません。

数式をフィル入力するマクロは、
no.3の方が書いて下さった通りでございます。
関数の部分は実際は、
=if(countif(RC[-1],""*みかん*"")+countif(RC[-1],""*りんご*"")+countif(RC[-1],""*バナナ*""),""fruit"","""")
となっていました。

B列をコピーして、C列に値だけ貼付けて、
C列の値で行を削除するマクロを実行という
やり方であれば、実行できました。
この方法でやってもいいかなと思いましたが、
データの行が多すぎると時間がかかり過ぎてしまうという、
問題に当たってしまいました…。

投稿日時 - 2011-08-05 22:44:32

ANo.1

If Cells(i,"B").Value="" Then

を次のように変更してみてはいかがでしょう。

If Cells(i,"B").Value<>"fruit" Then

投稿日時 - 2011-08-04 21:20:47

お礼

アドバイス有り難うございます。

If Cells(i,"B").Value<>"fruit" Then
としても、削除できませんでした (;;)

投稿日時 - 2011-08-05 22:13:57

あなたにオススメの質問