2015-07-03 26 views
2

我試圖選擇一個範圍內的形狀,但代碼的結果並不完全符合我的預期。它隨機選擇比預期更多的形狀(不在範圍內)。選擇範圍內的形狀。奇怪的看似隨機的結果?

Public Sub ShapeSelection() 
Dim Sh As Shape 
Dim selectedOne As Boolean 
On Error Resume Next 

With ActiveSheet 
    For Each Sh In .Shapes 
     If Not Application.Intersect(Sh.TopLeftCell, .Range(Selection.Address)) Is Nothing Then 
      If selectedOne = False Then 
       Sh.Select 
       selectedOne = True 
      Else 
       Sh.Select (False) 
      End If 
     End If 
    Next Sh 
End With 
End Sub 
+0

像這樣使用'On Error Resume Next'將會隱藏您所有的錯誤。去掉它。 –

+0

謝謝你的提示。事實上有什麼問題 – jony

回答

2

奇怪的行爲由「Selection.Address」

在你的循環,當第一個形狀被發現引起的,你從範圍C3改變當前的選擇,讓我們說,到第一形狀

下次通過循環它試圖比較(相交)TopLeftCell的地址與形狀對象的地址:形狀對象本身沒有地址(其TopLeftCell有一個)

但是你去了關於它很長的路要走:你不需要使用相交。代碼波紋管工作如你所期望:

Option Explicit 

Public Sub ShapeSelection() 

    Dim Sh As Shape 
    Dim sRng As Range 

    With ActiveSheet 
     Set sRng = Selection 
     For Each Sh In .Shapes 
      If Sh.TopLeftCell.Address = sRng.Address Then 
       Sh.Select 
       Exit For 
      End If 
     Next Sh 
    End With 
End Sub 

編輯:我剛纔注意到你前面的問題:How to select multiple shapes based on range?

交點所需要完成這一要求,但你仍然需要保留對所選單元格的引用:

Option Explicit 

Public Sub ShapeSelection() 

    Dim Sh As Shape 
    Dim sRng As Range 

    With ActiveSheet 
     If TypeName(Selection) = "Range" Then 
      Set sRng = Selection 
      If sRng.CountLarge = 1 Then 
       For Each Sh In .Shapes 
        Sh.Select False 
       Next Sh 
      Else 
       For Each Sh In .Shapes 
        If Not Application.Intersect(Sh.TopLeftCell, .Range(sRng.Address)) Is Nothing Then 
         Sh.Select False 
        End If 
       Next Sh 
      End If 
     End If 
    End With 
End Sub 
+0

對於誰downvoted:我會很高興有機會從我的錯誤中學習 –

+0

我不知道誰downvoted你,但你從我這裏得到upvote!我認爲你是對的。 ...好吧,剛剛確認,你是對的!這是我不習慣vba中的形狀,我已經有點累了。不保存範圍是一個愚蠢的錯誤。我仍在學習,(不正式,但只是從事這件事)。在這種情況下,我只是頭腦風暴一張表,現在選擇多個形狀(甚至所有的形狀),而不必逐一選擇它們(使用Ctrl + LClick)是非常有用的。感謝您的幫助!!! – jony

+0

感謝您的反饋,我很高興您發現它有幫助! –