VBAマクロでRange("A1").Value
のようにセルを操作するコードを書いた場合、もしユーザーが「グラフシート」をアクティブにした状態でそのマクロを実行すると、セルが存在しないためエラーになってしまいます。
このようなエラーを未然に防ぐには、処理の実行前に**「現在アクティブなシートは、本当にセル操作が可能なワークシートか?」**を判定するのが有効です。
この記事では、アクティブシートの種類を判別するための2つの基本的な方法を解説します。
目次
方法1:.Type プロパティを使う方法
Sheet
オブジェクトが持つ.Type
プロパティは、そのシートの種類を示す定数を返します。この値がワークシートを示すxlWorksheet
と一致するかどうかで判定します。
コードと解説
Sub CheckSheetType_ByProperty()
' アクティブなシートの種類を判定します
If ActiveSheet.Type = xlWorksheet Then
' ワークシートだった場合の処理
MsgBox "アクティブなのはワークシートです。" & vbCrLf & _
"シート名: " & ActiveSheet.Name, vbInformation
' 例: セルA1に値を入力する
ActiveSheet.Range("A1").Value = Now()
Else
' ワークシートではなかった場合の処理
MsgBox "現在アクティブなのはワークシートではありません。" & vbCrLf & _
"(グラフシートなどが選択されています)", vbExclamation
End If
End Sub
ActiveSheet.Type
: このプロパティが返す値は、シートの種類によって異なります。xlWorksheet
: 通常のワークシートxlChart
: グラフシート- 他にもいくつか種類があります。
If ActiveSheet.Type = xlWorksheet Then
: この条件式で、アクティブなシートがワークシートであるかどうかをTrue
/False
で判断できます。
方法2:TypeName 関数を使う方法(推奨)
TypeName
関数は、引数に渡したオブジェクトの型名を、直接文字列として返してくれる便利な関数です。コードがより直感的で読みやすくなるため、こちらの方法も推奨されます。
コードと解説
Sub CheckSheetType_ByTypeName()
' TypeName関数でアクティブシートの型名を取得します
If TypeName(ActiveSheet) = "Worksheet" Then
' ワークシートだった場合の処理
MsgBox "アクティブなのはワークシートです。(TypeNameで判定)" & vbCrLf & _
"シート名: " & ActiveSheet.Name, vbInformation
Else
' ワークシートではなかった場合の処理
MsgBox "現在アクティブなのは「" & TypeName(ActiveSheet) & "」です。", vbExclamation
End If
End Sub
TypeName(ActiveSheet)
: アクティブなシートがワークシートなら文字列"Worksheet"
を、グラフシートなら"Chart"
を返します。If TypeName(ActiveSheet) = "Worksheet" Then
: 返り値が"Worksheet"
という文字列と一致するかどうかで判定します。
まとめ
アクティブシートの種類を判定するには、2つの方法があります。
方法 | 構文 | 特徴 |
.Type プロパティ | If ActiveSheet.Type = xlWorksheet | VBAの組み込み定数(xlWorksheet など)と比較する方法。 |
TypeName 関数 | If TypeName(ActiveSheet) = "Worksheet" | オブジェクトの型名を直接文字列で取得する方法。コードが直感的。 |
Google スプレッドシートにエクスポート
どちらの方法を使っても結果は同じですが、TypeName
関数の方が「型名が”Worksheet”だったら」と、コードの意図が読みやすくなるため、特に初心者の方にはお勧めです。
セル操作を行うマクロの冒頭でこの判定処理を一つ加えるだけで、予期せぬエラーを防ぎ、より安定したプログラムを作成することができます。