2015-07-03 31 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

感谢您的反馈,我很高兴您发现它有帮助! –