こんにちは、Ryoです。
VBAで処理する上では対象となるセルを判定する必要も出てきます。
数式が入力されているセルは避ける必要があったり、日付判定だったり、空欄になっているかなどは使用頻度も高いのではないかと思いますので、今回はその方法について解説します。
1.セルの数式有無を判定する
◆サンプルコード
セルA1~A11まで数値や数式が混在して入力されているとして、このサンプルコードを実行すると数式を含むセルを判定、アドレスを把握し最後にメッセージボックスで対象セルを表示するサンプルコードです。
数式有無判定は「オブジェクト.HasFormula」を使います。
数式入力有りは「True」、無しは「False」が返ってきます。
Sub Sample1() Dim Fmu(1 To 11) As String Dim msg As String Dim i, Cnt As Integer For i = 1 To 11 If Cells(i, 1).HasFormula Then 'ここで数式判定 Cnt = Cnt + 1 '数式が含まれていたらセルアドレスを取得 Fmu(Cnt) = Cells(i, 1).Address(RowAbsolute:=False, ColumnAbsolute:=False) End If Next i If Cnt <> 0 Then 'Cntが0以外=数式判定セル有り For i = 1 To Cnt msg = msg & Fmu(i) & vbCrLf '対象セルアドレスを改行処理 Next i MsgBox "数式を含むセルは以下の通りです。" & vbCrLf _ & msg, vbInformation End If End Sub
◆サンプル画面
「実行前」黄色網掛部が数式入力セルになります。
「実行後」
このように数式の含まれるセルを判定することが出来ます。
2.セルの日付判定をする
◆サンプルコード
セルA1~A11の中で日付として扱うことができるセルを判定し、アドレスを把握して最後にメッセージボックスで対象セルを表示するサンプルコードです。
日付判定は「IsDate(expression)」を使います。
扱える場合は「True」、不可は「False」が返ってきます。
Sub Sample2() Dim Dat(1 To 11) As String Dim msg As String Dim i, Cnt As Integer For i = 1 To 11 If IsDate(Cells(i, 1).Value) Then 'ここで日付判定 Cnt = Cnt + 1 '日付として扱えるならセルアドレスを取得 Dat(Cnt) = Cells(i, 1).Address(RowAbsolute:=False, ColumnAbsolute:=False) End If Next i If Cnt <> 0 Then 'Cntが0以外=日付判定セル有り For i = 1 To Cnt msg = msg & Dat(i) & vbCrLf '対象セルアドレスを改行処理 Next i MsgBox "日付として扱えるセルは以下の通りです。" & vbCrLf _ & msg, vbInformation End If End Sub
◆サンプル画面
数式判定と基本的に同様なので実行前は割愛して「実行後」の画面のみとしていますが、結果として以下の様に表示します。
黄色網掛部が日付として入力した箇所なので、実行後に対象セルがメッセージボックスで表示されていますから判定できていますね。
3.セルの空欄を判定する
◆サンプルコード
ここもまた同様にセルA1~A11の範囲で空欄が混在した状態としています。
空欄セルを判定し、アドレスを把握して最後にメッセージボックスで対象セルを表示するサンプルコードです。
空欄判定は「IsEmpty(expression)」を使います。
空欄なら「True」、異なる場合は「False」が返ってきます。
Sub Sample3() Dim Emp(1 To 11) As String Dim msg As String Dim i, Cnt As Integer For i = 1 To 11 If IsEmpty(Cells(i, 1).Value) Then 'ここで空欄判定 Cnt = Cnt + 1 '空欄ならセルアドレスを取得 Emp(Cnt) = Cells(i, 1).Address(RowAbsolute:=False, ColumnAbsolute:=False) End If Next i If Cnt <> 0 Then 'Cntが0以外=空欄判定セル有り For i = 1 To Cnt msg = msg & Emp(i) & vbCrLf '対象セルアドレスを改行処理 Next i MsgBox "空欄のセルは以下の通りです。" & vbCrLf _ & msg, vbInformation End If End Sub
ここで気を付ける点が一つあります。
私も良く使うのですが、セルを空欄にする際にActiveCell = ”” とすることがあります。
この処理をしたセルをIsEmptyで判定すると「False」となり空欄判定されません。
後々空欄判定する必要がある場合はActibeCell = Empty として””は使わないようする必要がありますので、留意ください。
◆サンプル画面
黄色網掛部が見た目の通り空欄ですので、本サンプルコードで判定されています。
4.まとめ
数式有無判定は「オブジェクト.HasFormula」
日付判定は「IsDate(expression)」
空欄判定は「IsEmpty(expression)」
これらを覚えておくと、対象範囲から抽出できるので何かと使える場面が多いです。
空欄判定だけは上述したように使用上やや注意が必要ですので、セルを空欄にする際は留意してもらえれば良いかと思います。
以上がセルを判定する(数式/日付/空欄)についての解説でした。
今回の記事が何かの参考になれば幸いです。
Ryo