セルの値が0を空に変えるには
シートにある各セルの値の0を消したい場合があります。0が多すぎて分かりにくい場合などです。
Excelでの通常の操作では、検索と置換ダイアログを使って0を空文字列に置換する、という方法になります。
VBAで行う方法には2つ挙げられます。
- セル範囲のセルが0であれば消す。(VBAで対象セル範囲をループして1セルずつ処理する方法)
- Excelの検索と置換ダイアログの機能をVBAで使って0を空に置換する。(検索と置換機能のReplaceメソッドでセル範囲の0を一括で空に置換する方法)
どちらの方法でもいいのですが、2つ目のExcelの検索と置換ダイアログでの方法にはデメリットがあります。そのあたりも含めて後述します。
1. VBAの処理でセルの値の0を消す(おすすめ)
VBAでシートの各セルの値が0かどうかを判定して、0であれば空にする方法のコードが以下になります。
やっているのは、シートの入力セル範囲を示すUsedRangeを使って、1セルずつループして、セルの値が0であれば消す、という内容です。
UsedRangeの詳細については「VBAで入力済みセル範囲を判定する(UsedRange)」をご参照ください。
RangeオブジェクトのValueプロパティを使うと、セルの値が0かどうか判定できます。ただし、「=1-1」のような数式の結果が0の場合もありえるため、数式が設定されている場合は空にしないようにしています。
数式が設定されているかどうかはRangeオブジェクトのHasFormulaプロパティで判定できます。Trueであれば数式が設定されており、Falseであれば数式ではありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub SheetZeroClear1() Dim r As Range '// セル Dim sht As Worksheet '// シート '// アクティブシートを処理対象のシートとして設定する Set sht = ActiveSheet '// 入力されたセル範囲をループ For Each r In sht.UsedRange '// セルの値が0の場合 If r.Value = "0" Then '// セルが数式ではない場合 If r.HasFormula = False Then '// セルに空文字列を設定する r.Value = "" End If End If Next End Sub |
2. Replaceメソッドを使ってセルの値の0を消す
検索と置換ダイアログをVBAで行う場合は、Replaceメソッドを使うことで同じように動作します。ただし、Replaceメソッドには条件によってはデメリットになる挙動があります。デメリットについては後述します。
Replaceメソッドでのコードはとても単純です。
以下のコードはシートの全てのセルで値が0の場合に空にします。数式のセルは空にはしません。
1 2 3 |
Sub SheetZeroClear() Cells.Replace What:="0", Replacement:="", LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2 End Sub |
Replaceメソッドには複数の引数があります。それらの詳細については「VBAでセルの置換を行う(Replaceメソッド)」をご参照ください。
なお、Replaceメソッドにはデメリットがあります。
それは、Replaceメソッドを実行したときの設定内容が、Excel上での検索を行う際の「検索と置換」ダイアログにも反映されてしまう点です。
Excel上で「検索と置換」ダイアログを使った場合、前回の検索条件が引き継がれて初期表示されます。VBAのReplaceメソッドも同様で、Replaceメソッド実行後に、Excelで「検索と置換」ダイアログを表示すると、Replaceメソッド実行時の条件が引き継がれて表示されます。
それは場合によっては利点として考えられるかもしれませんが、一般的にはExcel上の検索条件をVBAで書き換えてほしいとはあまり思わないので、欠点として扱われることの方が多い気がします。