
PowerPoint VBAでFor Eachを使ったとき、おかしな挙動をします。
例えば、スライド上に適当に図形を3つ挿入します。
そして、それらすべての図形を消去する以下のマクロを書きました。
Sub test()
Dim shp As Shape
For Each shp In ActiveWindow.Selection.SlideRange.Shapes
shp.Delete
Next shp
End Sub
このマクロを実行すると、
本来は1回の操作で全図形が削除されるはずですが、
なぜか図形が1つだけ残ってしまい、2回目のマクロ実行でようやく全図形が消去できます。
症状としては、(Wordの例ですが)以下の記事とまったく同じです。
https://blog.goo.ne.jp/ashm314/e/ce8e78058c256f9 …
なお、消去ではなく、全図形を選択するマクロ(以下)は正常に動作します。
Sub test2()
Dim shp As Shape
For Each shp In ActiveWindow.Selection.SlideRange.Shapes
shp.Select msoFalse
Next shp
End Sub
原因は一体何なのでしょうか?
また、回避策はありますか?
よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
Excelの場合は、For Each ~ Next でもSelectionの処理で順番に
Deleteできますが、WordやPowerPointは最初のループしたときに
Deleteされた時点で順番が狂います。
https://www.relief.jp/docs/powerpoint-vba-select …
回避策として、For ~ Nextで逆順に処理することで対応します。
(逆順でないと、エラーになるので間違えないように)
https://www.relief.jp/docs/powerpoint-vba-delete …
Sub アクティブスライドの図形をすべて削除する()
Dim i As Long
With ActiveWindow.Selection.SlideRange
For i = .Shapes.Count To 1 Step -1
With .Shapes(i)
' If _
' .Type = msoAutoShape Or _
' .Type = msoLine Or _
' .Type = msoGroup Then
.Delete
' End If
End With
Next i
End With
End Sub
Wordの場合
Sub アクティブドキュメントの図形をすべて削除する()
Dim i As Long
With ActiveDocument
For i = 1 To .Shapes.Count
With .Shapes(i)
' If _
' .Type = msoAutoShape Or _
' .Type = msoLine Or _
' .Type = msoGroup Then
.Delete
' End If
End With
Next i
End With
End Sub
ExcelとPowerPointでは、同じコードでも実行結果が異なるのですね。
疑問に思っていたことが解決でき、良かったです。
回避策も示していただき、どうもありがとうございました。
No.4
- 回答日時:
No.3の回答者です。
Wordのマクロの一部に書き間違いがありました。
間違っている部分
For i = 1 To .Shapes.Count
正しくは
For i = .Shapes.Count To 1 Step -1
です。
Wordでの処理を再確認しているときに、書き換えてしまったままで
コピーして回答欄に記載してしまいました。
No.1
- 回答日時:
For Eachの中で、コレクション自体を変化させて大丈夫でしたっけ?
おそらく、コレクションが変化してしまったことで、「次」や「終了判定」が誤動作しているのだと思われます。
VB.Netだとエラーになる操作です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PowerPoint(パワーポイント) ExcelのVBAコードについて教えてください。 3 2022/05/25 14:32
- Excel(エクセル) Excelのマクロについて教えてください。 4 2022/05/31 14:07
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) シート削除のマクロで「deleteメソッドは失敗しました」となります。助けてください! Sub 不要 6 2022/09/08 16:41
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- Visual Basic(VBA) outlook マクロが終了しません。 1 2022/09/02 11:14
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- その他(Microsoft Office) エクセル VBAについて 2 2022/09/21 22:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba Array関数について教えてく...
-
【マクロ】シートの変数へ入れ...
-
【マクロ】並び替えの範囲が、...
-
エクセルのVBAコードと数式につ...
-
エクセルのマクロについて教え...
-
エクセルの改行について
-
【VBA】 結合セルに複数画像と...
-
vbsでのwebフォームへの入力制限?
-
算術演算子「¥」の意味について
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
Vba セルの4辺について罫線が有...
-
vb.net(vs2022)のtextboxのデザ...
-
ダブルクリックで貼り付けた画...
-
VBAの「To」という語句について
-
VBAでユーザーフォームを指定回...
-
VBAでCOPYを繰り返すと、処理が...
-
【マクロ】変数を使った、文字...
-
エクセルのVBAコードについて教...
-
ワードの図形にマクロを登録で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Vba セルの4辺について罫線が有...
-
vbsでのwebフォームへの入力制限?
-
【ExcelVBA】5万行以上のデー...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
【マクロ】並び替えの範囲が、...
-
エクセルの改行について
-
エクセルのマクロについて教え...
-
vb.net(vs2022)のtextboxのデザ...
-
VBAでCOPYを繰り返すと、処理が...
-
VBA ユーザーフォーム ボタンク...
-
エクセルのVBAコードと数式につ...
-
エクセルのVBAコードについて教...
-
[VB.net] ボタン(Flat)のEnable...
-
【マクロ】変数を使った、文字...
-
改行文字「vbCrLf」とは
-
質問58753 このコードでうまく...
-
【マクロ】シートの変数へ入れ...
-
ワードの図形にマクロを登録で...
-
算術演算子「¥」の意味について
おすすめ情報