Excel VBA - 在非连续范围内选择最远/最左边的单元格

时间:2014-09-24 10:16:55

标签: excel-vba position range shape vba

我有一个由三个区域组成的非连续范围。从右边的第一个区域开始,中间的第二个区域和最后一个区域是最左边的区域。

为清楚起见,这是我的范围:

=Sheet1!$H$5:$H$6,Sheet1!$G$4:$G$7,Sheet1!$C$3:$F$8

我想在此范围的左上角放置一个形状。因此我尝试了下面的代码。

Dim rngPos As Range
Set rngPos = Range("myRange")
ActiveSheet.Shapes.AddShape msoShapeRectangle, rngPos.Left, rngPos.Top, 20, 20

问题是形状总是放在整个范围的第一个区域。我尝试“联合”范围,对于具有相同高度但不在上述范围内的范围,它可以正常工作。

Set rngPos = Union(Range("myRange"), Range("myRange"))

不幸的是,我不能将它总是放在最后一个区域,因为我的范围是从左到右而不是从右到左构建的。所以下面对我不起作用。

ActiveSheet.Shapes.AddShape msoShapeRectangle, rngPos.Areas(3).Left, rngPos.Top, 20, 20

我认为必须有一种方法可以将最左上角的单元格放在非连续范围内作为定位形状的参考我只是无法弄清楚如何做到这一点。也许甚至有一种完全不同的方法来解决这个问题。

1 个答案:

答案 0 :(得分:1)

我刚刚解决了这个问题,同时解决了我自己的非连续选择问题,并且认为我会发布我的解决方案(与这个问题不太相似)。这只是一个想法,但你可以迭代地隔离左上角的单元格然后只是在那个单元格中形成你的形状。你可能不得不偏爱最顶层或最左边,因为你可以有一个更远的范围,但不会高到另一个范围。

此示例首选项位于最左侧:

Dim leftMost As Long
Dim topMost As Long

'Some initial value larger than you could expect the answer to ever be
leftMost = 1000
topMost = 1000

For a = 1 To Selection.Areas.Count
    With Selection.Areas(a)
        For b = 1 to .Rows.Count
            If .Rows(b).Row < topMost Then
                topMost = .Rows(b).Row
                leftMost = .Rows(b).Cells(1).Column
            End If
        Next
    End With
Next
但是,我不是Excel专家。这可能是一个笨重的解决方案。