Excel 选择范围内的形状。奇怪的看似随机的结果?

Excel 选择范围内的形状。奇怪的看似随机的结果?,excel,excel-2010,vba,Excel,Excel 2010,Vba,我正在尝试选择一个范围内的形状,但代码的结果并不是我所期望的。它随机选择的形状比预期的多(不在范围内) 这种奇怪的行为是由“Selection.Address”引起的 在循环中,当找到第一个形状时,可以将当前选择从范围C3更改为第一个形状 下一次通过循环时,它试图将TopLeftCell的地址与形状对象的地址进行比较(相交):形状对象本身没有地址(其TopLeftCell有地址) 但是你做了很长一段路:你不需要使用intersect。下面的代码按照您的预期工作: Option Explicit

我正在尝试选择一个范围内的形状,但代码的结果并不是我所期望的。它随机选择的形状比预期的多(不在范围内)


这种奇怪的行为是由“Selection.Address”引起的

在循环中,当找到第一个形状时,可以将当前选择从范围C3更改为第一个形状

下一次通过循环时,它试图将TopLeftCell的地址与形状对象的地址进行比较(相交):形状对象本身没有地址(其TopLeftCell有地址)

但是你做了很长一段路:你不需要使用intersect。下面的代码按照您的预期工作:

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

编辑:我刚刚注意到你前面的问题:

交叉点需要满足该要求,但仍需要保留对选定单元格的引用:

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

像这样使用“错误恢复下一步”将隐藏所有错误。把它拿走。谢谢你的提示。事实上,无论谁投了反对票,我都会很感激有机会从我的错误中吸取教训。我不知道是谁投了你的反对票,但我会给你一张赞成票!我想你是对的。。。好的,刚刚确认,你是对的!这是因为我不习惯vba中的形状,我已经有点累了。不保存射程是一个愚蠢的错误。我还在学习,(不是正式的,只是简单地从实践中学习)。在本例中,我刚刚对一张工作表进行了头脑风暴,现在选择多个形状(甚至所有形状)非常有用,而无需逐个选择(使用Ctrl+LClick)。谢谢你的帮助!!!谢谢你的反馈,我很高兴你觉得它很有用!
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