2008年11月26日

Sheetオブジェクト

今回のタイトルには、実は大きな間違いがあります。

そう、「Sheetsコレクション」はありますが、「Sheetオブジェクト」などというオブジェクトは存在しないのです。

昨日の記事で、グラフシートを表すChartオブジェクトのTypeプロパティは「シートの種類」を表すものではない、と書きましたが、このことは、たとえば次のようなコードで問題になります。

For Each s In Sheets
  If s.Type = xlWorksheet Then
    処理A
  Else
    処理B
  End If
Next s

作業中のブックの各シートについて、それがワークシートであれば処理Aを、そうでなければ(グラフシートなら)処理Bを実行します。
実際には、定数xlWorksheetに相当する値をChartオブジェクトのTypeプロパティが返すことはないようですが(ざっと調べた限りでは)、もしマクロシートがあった場合などに、問題が発生する可能性はあります。
このようなケースでは、「If TypeName(s) = "Worksheet" Then」のような判定方法のほうが問題は少ないでしょう。
さらにいうと、「Sheets」ではなく「Worksheets」と「Charts」に対してそれぞれFor Eachで処理を実行するのが、より確実な方法だと思います。


上記のコードには、実はもう1つ問題があります。
各シートを表すオブジェクト変数sを、固有オブジェクト型では宣言できないということです。
Sheetsコレクションのメンバーは、WorksheetオブジェクトまたはChartオブジェクトのどちらかであり、これらをまとめて扱えるオブジェクト、つまりSheetオブジェクトは存在しません。
なので、「Dim s As Worksheet」とやっても「Dim s As Chart」とやっても、For Eachの中で「型が一致しません」というエラーが発生する可能性があります。
「Dim s As Object」のように、汎用のオブジェクト型で宣言せざるを得ないのです。

Workbook_SheetChangeなどのイベントプロシージャを作成したとき、自動的に設定される引数が、「ByVal Sh As Object」のようになっているのも、このことが原因です。
このようなオブジェクト変数に対しては、VBEの自動メンバ表示なども的確に機能してくれません。

こういった意味では、やはりWorksheetとChartのどちらも扱えるSheetというオブジェクトを用意するのが一番わかりやすい解決方法だと思うのですが……それはそれで問題があるのでしょうか?

まあ、Sheetオブジェクトを追加する、ということになると割と根本的な修正にはなりそうなので、上記程度の問題点であれば目をつぶってほしい、といったところなのかも。(^^;)
posted by 土屋和人 at 09:18| Comment(0) | TrackBack(0) | Excel
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/23399633
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック