半角チルダ

ExcelVBA、その他。
覚え書きや、補足資料などのスクラップブック。
end-u(1037781)

■(Shapes)SelectionのLoopについて

2010-08-11 22:00:00 | 雑記
きっかけは
現在、エクセルで、選択したグラフの大きさや縦横軸を統一するマクロを作成... - 教えて!goo
このスレッドだったんですが、ちょっと追加検証してみました。
(下記コードの内容)
新規シートにShapeを3コ追加します。
順番に名前をRect1、Rect2、Rect3、とつけます。
Rect2、Rect1、Rect3、の順番で選択して、選択した順番を保持するかどうかテストしてみます。

Sub test1()
  Dim i As Long
  Dim s As Object

  With Sheets.Add
    For i = 1 To 3
      .Shapes.AddShape(msoShapeRectangle, 100, 100 * i, 100, 50).Name = "Rect" & i
    Next

    .Shapes("Rect2").Select
    .Shapes("Rect1").Select False
    .Shapes("Rect3").Select False

    Debug.Print vbLf & "For To 1回目"
    For i = 1 To Selection.Count
      Debug.Print Selection.Item(i).Name
    Next

    Debug.Print vbLf & "For To 2回目"
    For i = 1 To Selection.Count
      Debug.Print Selection.Item(i).Name
    Next

    .Shapes("Rect2").Select
    .Shapes("Rect1").Select False
    .Shapes("Rect3").Select False

    Debug.Print vbLf & "For Each 1回目"
    For Each s In Selection
      Debug.Print s.Name
    Next

    Debug.Print vbLf & "For Each 2回目"
    For Each s In Selection
      Debug.Print s.Name
    Next

  End With
End Sub



そのままSelectionをLoopした場合、

【Excel2003 test1】
For To 1回目
Rect2
Rect2
Rect3

For To 2回目
Rect1
Rect2
Rect3

For Each 1回目
Rect2
Rect1
Rect3

For Each 2回目
Rect1
Rect2
Rect3

【Excel2007 test1】
For To 1回目
Rect1
Rect2
Rect3

For To 2回目
Rect1
Rect2
Rect3

For Each 1回目
Rect2
Rect1
Rect3

For Each 2回目
Rect2
Rect1
Rect3

こんな結果です。
期待するのはRect2、Rect1、Rect3、なんですが、どうにも不思議な結果です...

Selectionを一旦変数に受けたらどうなるか。

Sub test2()
  Dim i As Long
  Dim s As Object
  Dim ss As Object

  With Sheets.Add
    For i = 1 To 3
      .Shapes.AddShape(msoShapeRectangle, 100, 100 * i, 100, 50).Name = "Rect" & i
    Next

    .Shapes("Rect2").Select
    .Shapes("Rect1").Select False
    .Shapes("Rect3").Select False
    Set ss = Selection

    Debug.Print vbLf & "For To 1回目"
    For i = 1 To ss.Count
      Debug.Print ss.Item(i).Name
    Next

    Debug.Print vbLf & "For To 2回目"
    For i = 1 To ss.Count
      Debug.Print ss.Item(i).Name
    Next

    .Shapes("Rect2").Select
    .Shapes("Rect1").Select False
    .Shapes("Rect3").Select False
    Set ss = Selection

    Debug.Print vbLf & "For Each 1回目"
    For Each s In ss
      Debug.Print s.Name
    Next

    Debug.Print vbLf & "For Each 2回目"
    For Each s In ss
      Debug.Print s.Name
    Next

  End With
  Set ss = Nothing
End Sub

【Excel2003 test2】
For To 1回目
Rect2
Rect1
Rect3

For To 2回目
Rect2
Rect1
Rect3

For Each 1回目
Rect2
Rect1
Rect3

For Each 2回目
Rect2
Rect1
Rect3

【Excel2007 test2】
For To 1回目
Rect1
Rect2
Rect3

For To 2回目
Rect1
Rect2
Rect3

For Each 1回目
Rect2
Rect1
Rect3

For Each 2回目
Rect2
Rect1
Rect3

Excel2003では期待通りに取れてるようですが、2007とはやはりバージョンによる違いが出てます。
2007はtest1とtest2の結果が同じなので、まあ、首尾一貫してると言えば言えるのかも。
追加テストでtest2直後、選択した状態でもう一度下記For Eachでのテストを実行すると

Sub test3()
  Dim s As Object
  Dim ss As Object

  Set ss = Selection
  For Each s In ss
    Debug.Print s.Name
  Next
End Sub

【Excel2003 test3】
Rect1
Rect2
Rect3

【Excel2007 test3】
Rect2
Rect1
Rect3

って結果です。
あまりニーズがない案件でしょうけど、何かの時に参考に...
...ならないか X(
Comment
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする