【问题标题】:Excel VBA - Select furthest/outmost left cell in a non-contiguous rangeExcel VBA - 在非连续范围内选择最远/最左边的单元格
【发布时间】:2014-09-24 10:16:55
【问题描述】:

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

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

=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

我认为必须有一种方法可以将非连续范围内最左上角的单元格作为定位形状的参考,但我不知道该怎么做。也许甚至有完全不同的方法来解决这个问题。

【问题讨论】:

    标签: excel position range shape vba


    【解决方案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 专家。这可能是一个有点笨拙的解决方案。

    【讨论】:

    • 感谢您的回答。我不再使用该文件,否则我会试一试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多