オートシェイプの複数選択はSelection.ShapeRange
セルと同様にオートシェイプもVBAで処理することが出来ます。
ただ、セルとは利用するプロパティが異なることから初見では難しく感じることが多いと思います。
セルの場合は範囲選択を表すのにSelectionプロパティを利用しますが、複数のオートシェイプを選択状態を表すのはSelection.ShapeRangeプロパティになります。
以下でSelection.ShapeRangeを使った各種ループ処理の書き方を紹介します。
Selection.ShapeRangeループの書き方
各ループの書き方の見本になります。
ループ内ではセルの文字列をa→A→あ→aの順に置換しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Sub SelectionAutoShapeTest() Dim shp As Shape '// オートシェイプ Dim i '// ループカウンタ '// オートシェイプ未選択時は処理を行わない If VarType(Selection) <> vbObject Then Exit Sub End If '// For Eachでの書き方 For Each shp In Selection.ShapeRange shp.TextFrame.Characters.Text = Replace(shp.TextFrame.Characters.Text, "a", "A") Next '// Forでの書き方 For i = 1 To Selection.ShapeRange.Count Set shp = Selection.ShapeRange.Item(i) shp.TextFrame.Characters.Text = Replace(shp.TextFrame.Characters.Text, "A", "あ") Next '// Doでの書き方 i = 1 Do If (i > Selection.ShapeRange.Count) Then Exit Do End If Set shp = Selection.ShapeRange.Item(i) shp.TextFrame.Characters.Text = Replace(shp.TextFrame.Characters.Text, "あ", "a") i = i + 1 Loop End Sub |
コード説明
オートシェイプ判定
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”)