2009年10月01日

作業グループのRangeオブジェクト

久しぶりのExcel VBAネタです。

以前からずっと疑問に思っていて、いまだに解決していないことがあります。
複数のワークシートの同じセルに一括で同じデータを入力したい場合、その複数のシートを選択し(作業グループ)、目的のセル、たとえばB2ならB2を選択して、データを入力します。

この操作をVBAで行うには、まずWorksheetsコレクションのインデックスに配列を指定するか、SelectメソッドをReplace:=Falseで実行して複数シートを選択し、目的のセルを選択したうえで、ActiveCellプロパティで取得したRangeオブジェクトに対して入力操作を行います。
ActiveCellの代わりにSelectionプロパティも使用可で、この場合はセル範囲にも一括入力できます。
入力だけでなく、書式設定の変更などの操作も同様です。

ただし、ActiveCellやSelectionを使わず直接「Range("B2")」などのように指定したのでは、たとえ作業グループの状態であっても、アクティブシートのB2セルだけに入力され、他のシートには入力されません。

このとき、「ActiveCell」で取得したRangeオブジェクトと「Range("B2")」で取得したRangeオブジェクトとでは、いったい何が違っているのでしょうか?

試しにそれぞれのRangeオブジェクトをオブジェクト変数にセットしてローカルウィンドウで見てみても、違いがあるのはわかるのですが、どこがポイントなのかはよくわかりません(ActiveCellのほうが「Rangeクラスの○○プロパティを取得できません」が多い、という程度)。
「Parent」や「Worksheet」を見ても、いずれのRangeオブジェクトも単独のワークシートを返します。

どこが違うのかという疑問もさることながら、私が知りたいと思っているのは、作業グループ状態のRangeオブジェクトを直接取得する方法はないのか、ということです。
いちいちSelectする操作をVBAのコードとして書くのは、ちょっと抵抗もあります。
(作業グループではなくループで処理すればいい、というのは置いておいて)

ちなみに、作業グループ状態のActiveCellやSelectionをオブジェクト変数にセットした後、ワークシートを1つだけ選択し直して作業グループの状態を解除しても、このオブジェクト変数に対して、複数シートの同一セルへの一括入力を行うことは可能です。
ただし、これも入力操作に限れば、という話で、まだ検証不足なので詳しくは書きませんが、書式設定の変更などではいろいろと問題が出てくるようです。

作業グループ状態のRangeオブジェクトの正体や、直接取得の方法をご存知の方は、ぜひお教えいただけるとありがたいです。
posted by 土屋和人 at 07:07| Comment(0) | TrackBack(0) | Excel
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


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

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