オートシェイプの複数選択はSelection.ShapeRange

セルと同様にオートシェイプもVBAで処理することが出来ます。

ただ、セルとは利用するプロパティが異なることから初見では難しく感じることが多いと思います。

セルの場合は範囲選択を表すのにSelectionプロパティを利用しますが、複数のオートシェイプを選択状態を表すのはSelection.ShapeRangeプロパティになります。

以下でSelection.ShapeRangeを使った各種ループ処理の書き方を紹介します。

Selection.ShapeRangeループの書き方

各ループの書き方の見本になります。

ループ内ではセルの文字列をa→A→あ→aの順に置換しています。

 

コード説明

オートシェイプ判定

5行目からのIf文は選択している個所がオートシェイプかどうかの判定を行っています。

セル用の処理とオートシェイプ用の処理では利用するプロパティが異なるためプログラムの書き方も変わってきます。

一般的にはセル用の処理を書く方が多いとは思いますので、あえてこのような判定処理を入れています。

1. For Eachでの書き方

For Eachは一番使いやすく簡単に書ける方法です。私もほとんどこの書き方で書いてます。

利点として、1行でオートシェイプのShapeオブジェクトを取得できることと、ループの終了条件を書く必要がないことが挙げられます。

2. Forでの書き方

Forで書く場合はループカウンタが必要になります。

そのループカウンタの初期値は1にしています。この理由はSelection.ShapeRangeの場合はItemプロパティが1から開始するためです。配列などの一般的なループの場合に0に初期化するのと異なります。

3. Doでの書き方

終了条件をループ内に書くことになります。その際にセル数をSelection.ShapeRange.Countプロパティで取得します。あとはForでの書き方と考え方は同じです。

実行結果

上のコードを実行した場合の移り変わりは以下になります。

0. 対象のオートシェイプを選択します。

1. For Eachでの変換後(”a” → “A”)

2. For での変換後(”A” → “あ”)

3. Do での変換後(”あ” → “a”)