こんにちは。お邪魔します。
ちょっと気になることが幾つかあったので、
少し保守寄りのサンプルを一例挙げておきます。
空白セル、というと、数式や定数値が設定されていない
「空のセル」を指しますから、普通は
.Value プロパティではなく、.Formula プロパティを使って、
空白かどうかの判断をします。
これは、=IF(A1<>0,B1/A1,"")のような、よく見かける数式が
設定されたセルで、戻り値が、""であった場合等に、
この数式を書換えてしまうことを避ける意味があります。
「値が空のセル」のような表現であれば、.Value プロパティを使って、
戻り値が""である数式セルを含める、ということになります。
ご質問の意図がどちらであるか判断付きませんが、
こういう違いを意識することを大事にして欲しいです。
InputBox()関数とInputBox メソッドと、似て非なる対話型UIが用意されていますが、
特別選ぶ理由が無い場合は、メソッドを使うことが近年推奨されているようです。
どちらの場合でも、
キャンセルされた場合
何も入力されなかった場合
は、処理を中止するなど、ハッキリと処理を分けるように書くのが基本です。
結合セルについては、
値や数式を設定できるのは、結合セル範囲内の左上のひとつのセルだけです。
For Each ループでセル範囲を総当たりで処理する場合、
「結合範囲内の左上以外のセル」については、値を設定しようとしても、
結果的に無視されることになり無駄になります。
また、For Each ループでは指定した範囲を左上から順番にセルひとつずつ
処理対象にしますから、
If c.MergeArea(1).Formula = "" Then
のように書いて置けば、無駄な処理をしないで済みます。
大きな結合セルが多数ある場合などでは、処理速度にも違いは出るでしょう。
結合セルが無い、または、少ない、小さい、とハッキリとした前提があるなら、
If c.Formula = "" Then
のように省略した方がスッキリ書けますし、寧ろ余計なことをせずに済みます。
ここら辺は、運用とか応用とかいったレベルで、
手にしたサンプルをユーザーさんが書き換えるであろう範疇です。
もしも、セル範囲以外(グラフ等)を選択中だと
Selection はセル範囲ではありませんから、エラーになります。
エラーを避ける方法は幾つかありますが、
If TypeName(Selection) <> "Range" Then
こんな風に処理を中止するように書いて置くのが比較的簡単で一般的です。
こういうのは初級からそろそろ中級といった課程で考えればいいことかも知れませんが、
まぁ、日頃からなるべくエラーを回避できるように書いておきたいですよね、と。
Const 置換候補初期値 = "空白"
の部分はInputBoxに最初に表示しておく値を指定しておきます。
適宜書き換えてください。
固定の値を指定したいとか、頻度の高い値を指定したいとか、
入力を誘導するように
Const 置換候補初期値 = "ココに値を入力してください"
みたいな使い方もありです。
初期値を指定したくない場合は、
Const 置換候補初期値 = ""
です。
難しく考え過ぎてもいけませんが、
何が必要で、どこまでやれば十分か、選んで
書き換えたり書き加えたり消したり、できるように頑張ってください。
以下、一例です。
' ' ==== 標準モジュール専用 ===
Sub Re8758270c()
Const 置換候補初期値 = "空白" ' 空白を埋める値の候補として最初に表示する値を指定
Dim v ' 空白を埋める値
Dim c As Range ' セル範囲総当たりに使うRange型変数
Dim cn As Long ' 空白セルが見つかった数をカウント
' ' もしも、セル範囲以外(グラフ等)を選択中だとエラーになるので
' ' 注意をした上で、処理中止
If TypeName(Selection) <> "Range" Then
MsgBox "マクロ実行出来ません。セル範囲を選択してからやり直して下さい。", vbExclamation
Exit Sub
End If
' ' InputBox メソッドで値を指定します。
' ' 数式文字列、数値、文字列値、論理値、日付値、時刻値、パーセンテージ値、指数値、
' ' 以上の型で入力可。
' ' 通値貨、会計値、分数値、以上の型は入力不可。
v = Application.InputBox( _
Prompt:="【空白セルすべて】に設定する値を指定して[OK]", _
Title:="空白を埋めよう", _
Default:=置換候補初期値, _
Type:=2)
' ' InputBox メソッドがキャンセルされた場合、何も入力されていない場合、処理中止
If VarType(v) = vbBoolean Or v = "" Then
MsgBox "キャンセル", vbInformation
Exit Sub
End If
' ' 選択中のセル範囲総当たり
For Each c In Selection
' ' 各セル(結合セルだった場合は結合セル範囲内の左上のセルだけを対象に)
' ' に数式や定数値が設定されていない="空白セル"である=場合
If c.MergeArea(1).Formula = "" Then
' ' 上記条件判別に該当したセルの値を指定した値に設定する
c.Value = v
' ' 空白セルが見つかった数をカウント
cn = cn + 1
End If
Next
If cn > 0 Then ' 空白セルが見つかった場合のメッセージ
MsgBox "空白セル " & cn & "ヶ所、に値:" & v & " を設定しました", vbInformation
Else ' 空白セルが見つからなかった場合のメッセージ
MsgBox "選択中の範囲に空白セルは見つかりません", vbInformation
End If
End Sub
お礼
回答ありがとうございます。助かりました。