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

解決済みの質問

セルの値が0はクリアするマクロ

エクセル2003です。

ある集計表において
4行目のH列からAM列まで
数値データがあります。
最終行は常に変化します

この表内にてセルの値が0のセルは
セル内を空白にしたいです。
以下のマクロを作成しましたが

If Cells(処理行, 8).Value = 0 Then
Cells(処理行, 8).ClearContents

をあと(処理行, 13)から(処理行,31)
まで記述しなければなりません。
構文的にも処理的にも不利?
と思うので、なにかいい方法を教えてください。

Sub 数字0クリア()

'2012年2月3日節分

Dim 最終行

'最終列をG列で求めます
最終行 = Cells(Rows.Count, 7).End(xlUp).Row
Application.ScreenUpdating = False

For 処理行 = 4 To 最終行

If Cells(処理行, 8).Value = 0 Then
Cells(処理行, 8).ClearContents
End If

If Cells(処理行, 9).Value = 0 Then
Cells(処理行, 9).ClearContents
End If

If Cells(処理行, 10).Value = 0 Then
Cells(処理行, 10).ClearContents
End If

If Cells(処理行, 11).Value = 0 Then
Cells(処理行, 11).ClearContents
End If

If Cells(処理行, 12).Value = 0 Then
Cells(処理行, 12).ClearContents
End If

If Cells(処理行, 13).Value = 0 Then
Cells(処理行, 13).ClearContents
End If
Next 処理行

Application.ScreenUpdating = True

MsgBox "終了しました"

End Sub

投稿日時 - 2012-02-03 09:20:30

QNo.7282485

困ってます

質問者が選んだベストアンサー

'列の分のFor~Nextを追加してやれば1箇所分だけ記述するだけで済みます。

Sub 数字0クリア()

'2012年2月3日節分

Dim 最終行

'最終列をG列で求めます
最終行 = Cells(Rows.Count, 7).End(xlUp).Row
Application.ScreenUpdating = False
For i = 8 To 39
For 処理行 = 4 To 最終行

If Cells(処理行, i).Value = 0 Then
Cells(処理行, i).ClearContents
End If
Next 処理行
Next i
End Sub

'For i = 8 To 39で列の変数を設定してやる(H列からAM列まで)
'For 処理行 = 4 To 最終行の処理が終わるとiが8、9、10と変化していきます。

投稿日時 - 2012-02-03 12:10:49

お礼

For Next
の中でもう1回
For Next
をまわすんですね。
うまく出来ましたね。
ありがとうございました。

投稿日時 - 2012-02-06 08:23:15

ANo.3

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

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

回答(5)

ANo.5

No4です。失礼しました
Columns("H:M").Replace "0", "", xlWhole
で試してみてくださいね。

Columns("H:M").Replace "0", ""
なら、30 とかの 0まで消えてしまいますので。

投稿日時 - 2012-02-04 17:12:34

お礼

Columns("H:M").Replace "0", "", xlWhole

はい、これは気がついていました。
データ内には
1.04
とか0.05
とか400とかありますので。
ありがとうございました。

投稿日時 - 2012-02-06 08:34:08

ANo.4

既に回答が出ていますが、
For(繰り返し)の勉強なら
縦方向の繰り返しの中に横方向の繰り返しを加えることになりますね。

ただ、やりたい内容を
H~M列に含まれる 0 を空白に置き換える
と考えると(たぶん、最終列の取得も不必要では?)

Columns("H:M").Replace What:="0", Replacement:=""

の一行で済むのではないでしょうか?

それで足りるかどうかは
マクロの記録で
H~M列の選択 置き換え の実行で
試してみてください。

投稿日時 - 2012-02-04 16:02:06

お礼

システムから吐き出されたデータは
列AMまでしかないので
Columns("H:AM").Replace What:="0", Replacement:=""
で行いました。
NO.5で月頂いた件はきがついていましたので
Columns("H:AM").Replace "0", "", xlWhole
で行いました。
ありがとうございました。

投稿日時 - 2012-02-06 08:36:55

ANo.2

わざわざVBAでクリアする必要があるのでしょうか?
事前にセルの書式設定で0を非表示するだけで十分の様な気がします。
ユーザ定義で「G/標準;-G/標準;」で設定で如何でしょうか

投稿日時 - 2012-02-03 10:07:31

お礼

教えていただいた方法でできました。
最初に説明しなくてすいません。
確かに非表示ですが
セル内にデータが0として存在しているので
まずいです。
この表はシステムから毎夜夜間バッチで出力されるので
毎日、この作業が必要でして
マクロ化を考えました。
ありがとうございました。

投稿日時 - 2012-02-03 16:58:14

ANo.1

「置換」機能を使うのが、簡単だと思います。

Sub 数字0クリア()

'2012年2月3日節分

Dim 最終行

'最終列をG列で求めます
最終行 = Cells(Rows.Count, 7).End(xlUp).Row
Application.ScreenUpdating = False

'0のセルを置換で消す
Range(Cells(4, 8), Cells(最終行, 13)).Replace 0, "", xlWhole

Application.ScreenUpdating = True

MsgBox "終了しました"

End Sub

投稿日時 - 2012-02-03 09:48:09

お礼

Range(Cells(4, 8), Cells(最終行, 13)).Replace 0, "", xlWhole

Range(Cells(4, 8), Cells(最終行, 39)).Replace 0, "", xlWhole

であっという間に完了しました。

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

投稿日時 - 2012-02-03 19:23:12

あなたにオススメの質問