記事キャッチ画像
 (31) シートが「ワークシート」か「グラフシート」かを判別する方法! 


 1. TypeName 関数はオブジェクトに関する情報を「文字列」で返し、シートの Type プロパティを参照する方法もある 


 2. 親子関係を持つオブジェクトの場合、子オブジェクトのイベントが発生した後で、親オブジェクトのイベントが発生 
  「広告」  
 

 (31) シートが「ワークシート」か「グラフシート」かを判別する方法! 


Excel メニューバーの [ヘルプ] - [更新プログラムのチェック] にて、適用されていないアップデートがあれば行ってください。 

Excel 2016 for Mac 環境での説明となりますので、 Mac版 Excel 2011 では( VBA が利用できますが )同じ結果にならない場合があるかもしれません。

現状、 VBE 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。(テキストエディタからの貼り付けは可能)

( ユーザー定義関数 のVBAコードを含んだ)前回使用した XLSM ファイルを、「マクロを有効」にして開きます。

50

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 関数が用意されており、引数のオブジェクトに関する情報を「文字列」で返す。
 
この文字列が「Worksheet」であればワークシート、「Chart」であればグラフシートで、その他のシートの場合も対応文字列(ほとんどの場合、オブジェクトの型名)が返される。

また、オブジェクトの Type プロパティ 利用でも、少なくとも ワークシートかどうかの区別が付く。
 Excel VBA が用意している定数 xlWorksheet は問題なく使えるが、 Type プロパティ の値が グラフシートの場合複数返り、調べたところ どうやら「グラフの種類」を返すようだ。
だが、ワークシートと「それ以外のシート」を区別するだけなら、全く問題は無い。

名称未設定

上記操作で「グラフシート」を挿入すると…

名称未設定2

Chart の文字列が返される。
なお、ワークブックの NewSheet イベントは 「全てのシート挿入時」に発生するイベントだ。


 2. 親子関係を持つオブジェクトの場合、子オブジェクトのイベントが発生した後で、親オブジェクトのイベントが発生 

イベント名が SheetActivateSheetDeactivate となるが、ワークブックの ActivateDeactivate イベントプロシージャ だ。

復習となるが、必ず 子オブジェクトのイベント発生後に、親オブジェクトのイベントが発生する!
 
今回挿入した Sheet4Chart1 モジュールには VBAコードを一切記述していないので、Sheet1 〜 3 のシート移動で試して頂きたい。
 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


次回も、 Excelブックの まだ説明していないイベント です!


お疲れ様でした!
[command] + [Q] にてExcel を終了時、「作業中のブック」を保存するか確認のダイアログ画面が表示されるため 「保存」しましょう。
現状、 VBE 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。(テキストエディタからの貼り付けは可能)


最後まで読んでいただき、ありがとうございます。
ぜひ、右側の「人気ブログランキング」投票に ご協力ください。
また、お越しくださいませ。
// アタル

  「広告」