(31) シートが「ワークシート」か「グラフシート」かを判別する方法!
1. TypeName 関数はオブジェクトに関する情報を「文字列」で返し、シートの Type プロパティを参照する方法もある
2. 親子関係を持つオブジェクトの場合、子オブジェクトのイベントが発生した後で、親オブジェクトのイベントが発生
「広告」
(31) シートが「ワークシート」か「グラフシート」かを判別する方法!
Excel メニューバーの [ヘルプ] - [更新プログラムのチェック] にて、適用されていないアップデートがあれば行ってください。
Excel 2016 for Mac 環境での説明となりますので、 Mac版 Excel 2011 では( VBA が利用できますが )同じ結果にならない場合があるかもしれません。
現状、 VBE 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。(テキストエディタからの貼り付けは可能)
( ユーザー定義関数 のVBAコードを含んだ)前回使用した XLSM ファイルを、「マクロを有効」にして開きます。
ThisWorkbook モジュールの末尾に、以下のコードを入力するかそのままコピーして貼り付ける。(緑色の部分はコメントのため、省略可)
以前に説明した通り、Object 型を用いるのは、Worksheet や Chart 等複数のシートオブジェクトが対象となるため。
'--------------------------------
' Event: Workbook_SheetActivate()
'--------------------------------
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
MsgBox "Workbook's Event(Activate) " & Sh.Name
End Sub
'--------------------------------
' Event: Workbook_SheetDeactivate()
'--------------------------------
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
MsgBox "Workbook's Event(Deactivate) " & Sh.Name
End Sub
'--------------------------------
' Event: Workbook_NewSheet()
'--------------------------------
Private Sub Workbook_NewSheet(ByVal Sh As Object)
MsgBox TypeName(Sh)
If Sh.Type = xlWorksheet Then
MsgBox "This sheet is Worksheet!"
End If
End Sub
1. TypeName 関数はオブジェクトに関する情報を「文字列」で返し、シートの Type プロパティを参照する方法もある
今回は、「ワークシート」や「グラフシート」等の シートを区別する方法 を説明する。
VB (Visual Basic) には TypeName 関数が用意されており、引数のオブジェクトに関する情報を「文字列」で返す。
VB (Visual Basic) には TypeName 関数が用意されており、引数のオブジェクトに関する情報を「文字列」で返す。
この文字列が「Worksheet」であればワークシート、「Chart」であればグラフシートで、その他のシートの場合も対応文字列(ほとんどの場合、オブジェクトの型名)が返される。
また、オブジェクトの Type プロパティ 利用でも、少なくとも ワークシートかどうかの区別が付く。
Excel VBA が用意している定数 xlWorksheet は問題なく使えるが、 Type プロパティ の値が グラフシートの場合複数返り、調べたところ どうやら「グラフの種類」を返すようだ。
だが、ワークシートと「それ以外のシート」を区別するだけなら、全く問題は無い。
また、オブジェクトの Type プロパティ 利用でも、少なくとも ワークシートかどうかの区別が付く。
Excel VBA が用意している定数 xlWorksheet は問題なく使えるが、 Type プロパティ の値が グラフシートの場合複数返り、調べたところ どうやら「グラフの種類」を返すようだ。
だが、ワークシートと「それ以外のシート」を区別するだけなら、全く問題は無い。
2. 親子関係を持つオブジェクトの場合、子オブジェクトのイベントが発生した後で、親オブジェクトのイベントが発生
イベント名が SheetActivate ・ SheetDeactivate となるが、ワークブックの Activate ・ Deactivate イベントプロシージャ だ。
復習となるが、必ず 子オブジェクトのイベント発生後に、親オブジェクトのイベントが発生する!
復習となるが、必ず 子オブジェクトのイベント発生後に、親オブジェクトのイベントが発生する!
今回挿入した Sheet4 と Chart1 モジュールには VBAコードを一切記述していないので、Sheet1 〜 3 のシート移動で試して頂きたい。
Activate ・ Deactivate イベントは、それぞれ ワークシートのイベント発生後に ワークブックのイベントが必ず発生する。
最後に、ブック保存時に「グラフシート」名も表示したいのであれば、以下のように修正する必要がある。
・複数のシートオブジェクトを扱えるよう、 Dim sh As Object のように変数宣言を修正。
・ActiveWorkbook.Worksheets → ActiveWorkbook.Sheets に変更。
次回も、 Excelブックの まだ説明していないイベント です!Activate ・ Deactivate イベントは、それぞれ ワークシートのイベント発生後に ワークブックのイベントが必ず発生する。
最後に、ブック保存時に「グラフシート」名も表示したいのであれば、以下のように修正する必要がある。
・複数のシートオブジェクトを扱えるよう、 Dim sh As Object のように変数宣言を修正。
・ActiveWorkbook.Worksheets → ActiveWorkbook.Sheets に変更。
'--------------------------------
' Event: Workbook_BeforeSave()
'--------------------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim sh As Object
Dim n As Integer
n = 0
MsgBox "BeforeSave Event ! "
If MsgBox("Save the Workbook ?", vbYesNo) = vbNo Then
ActiveWorkbook.Saved = True
Cancel = True
Else
For Each sh In ActiveWorkbook.Sheets
n = n + 1
MsgBox " (" & n & ")" & " Save [" & sh.Name & "] !"
Next sh
End If
End Sub
お疲れ様でした!
[command] + [Q] にてExcel を終了時、「作業中のブック」を保存するか確認のダイアログ画面が表示されるため 「保存」しましょう。
現状、 VBE 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。(テキストエディタからの貼り付けは可能)
「広告」amazon WINTER SALE
最後まで読んでいただき、ありがとうございます。ぜひ、右側の「人気ブログランキング」投票に ご協力ください。
また、お越しくださいませ。
// アタル
「広告」
コメント