まりふのひと

Excel家計簿77のバグで知ったWorkSheets/Sheetsの違いと“Sheets(i).Type = xlWorksheet”

 iPS77 でバージョンを 0.36c にアップし、検証してもらったら‥‥

複数台の PC で「グラフデータ作成に失敗しました」が...

  • 引数が「費目データ」となっているので、「歩数血圧」以前の状態だ...
  • デバッグしても、おかしなコードを見つけられない...
  • 行き詰って、家計簿77 以外のシートを全て削除したら‥‥ エラーは出ない。



 自宅に戻り、再現用のデータを作成した。

  1. For i = 1 To Sheets.Count
  2. If Worksheets(i).Name = argシート名 Then Exit Function
  3. Next
  4. Worksheets.Add before:=Worksheets(1)
  5. ActiveSheet.Name = argシート名
  • エラーが出る場所は、上記コードの No.2。
  • argシート名(引数)は“費目データ”。
  • Sheets.Count は 3
  • i が 3 の時、エラーになる。


 マルチウィンドウで、ワークシートを監視していたら、i=3 は[Graph1]シート(グラフシート)であることが判った。


  • アクティブシートがワークシートかグラフかを判定するVBAのコード (インストラクターのネタ帳)
    ワークシートかどうかを判定するサンプルマクロ
     アクティブなシートが、ワークシートかそうでないかという判定なら以下のマクロでもOKです。
     If ActiveSheet.Type = xlWorksheet Then
      msg = "ワークシートです。"
     Else
      msg = "ワークシートではありません。"
     End If

    • し、しかし、これでは解決しなかったぁ〜〜〜

  • SheetsとWorksheetsって何が違うの? (Office TANAKA)
    シートはワークシートだけじゃない
     一般に、ワークシートのことをシートと呼ぶことが多いです。しかし、Excelにはいろいろなシートが存在します。
    • たとえばグラフシートです。
    • ほかにもあります。Excel 4.0のマクロを記述するためのモジュールシート。
    • Excel 5.0/95時代のマクロで使用していたダイアログシート。
    • そして、最も使う機会の多いワークシート。
    これらは、すべてシートです。
     VBAで、シートはSheetオブジェクトとして操作します。そのSheetオブジェクトの集合体がSheetsコレクションです。
    • し、知りませんでした... 



 完成したコード

  1. For i = 1 To Sheets.Count
  2. If Sheets(i).Type = xlWorksheet Then
  3. If Sheets(i).Name = argシート名 Then Exit Function
  4. Next
  5. Worksheets.Add before:=Worksheets(1)
  6. ActiveSheet.Name = argシート名


 インストラクターのネタ帳 および Office TANAKA には、何時もながら大変お世話になりました。 
今の悩みは、家計簿77 でバグが続発する懸念がある‥‥ ということだ。