Vba 使用联合数组进行匹配时出错

Vba 使用联合数组进行匹配时出错,vba,excel,Vba,Excel,我试图获取非连续范围中的最大值并打印其地址。我使用Excel中的数据,如下图所示: 我使用的VBA代码是: Sub rngadd() Dim r1 As Range, r2 As Range, newrng As Range Dim dblmax As Double Dim Xrng As Variant Worksheets("sheet3").Activate Set r1 = Range("A1:A5") Set r2 = Range("A8:A12") Set newrng = U

我试图获取非连续范围中的最大值并打印其地址。我使用Excel中的数据,如下图所示:

我使用的VBA代码是:

Sub rngadd()

Dim r1 As Range, r2 As Range, newrng As Range
Dim dblmax As Double
Dim Xrng As Variant

Worksheets("sheet3").Activate
Set r1 = Range("A1:A5")
Set r2 = Range("A8:A12")
Set newrng = Union(r1, r2)
newrng.Select

dblmax = Application.WorksheetFunction.max(newrng)
Xrng = WorksheetFunction.Index(newrng, WorksheetFunction.Match(dblmax, newrng, 0)).address(False, False)
Worksheets(2).Range("D3").Value = dblmax
Worksheets(2).Range("E3").Value = Xrng

End Sub
我得到一个错误作为运行时错误:

“1004”无法获取工作表函数类的match属性

但是,如果我只针对范围
r1
运行代码,我会得到如图所示的预期结果:

因此,我发现由于使用union而出现错误,当范围(非连续范围)出现中断时,无法执行匹配


在非连续范围(如在连续范围中获得的结果)中,我应该如何获得所需的结果?

索引和匹配在非连续范围中不起作用

您可以在单元格中循环查找最大值及其对应的单元格地址,如下所示

Sub rngadd()

Dim r1 As Range, r2 As Range, newrng As Range, cell As Range
Dim cellAddress As String
Dim maxVal As Long

Worksheets("sheet3").Activate
Set r1 = Range("A1:A5")
Set r2 = Range("A8:A12")
Set newrng = Union(r1, r2)

For Each cell In newrng
    If cell.Value > maxVal Then
        maxVal = cell.Value
        cellAddress = cell.Address(0, 0)
    End If
Next cell

Worksheets(2).Range("D3").Value = maxVal
Worksheets(2).Range("E3").Value = cellAddress

End Sub
使用
Range
对象的
Find()
方法:

Sub rngadd()

    Dim r1 As Range, r2 As Range, newrng As Range
    Dim dblmax As Double
    Dim Xrng As Range

    Worksheets("sheet3").Activate
    Set r1 = Range("A1:A5")
    Set r2 = Range("A8:A12")
    Set newrng = Union(r1, r2)
    newrng.Select

    dblmax = Application.WorksheetFunction.Max(newrng)
    Set Xrng = newrng.Find(what:=dblmax, lookat:=xlWhole, LookIn:=xlValues)
    Worksheets(2).Range("D3").Value = dblmax
    Worksheets(2).Range("E3").Value = Xrng.Address

End Sub
但是,所有的
激活
/
选择
都是不好的做法,如果您已经提前知道了范围地址,您也可以避免使用
Union()

请考虑下面的重构:

Sub rngadd()
    Dim newrng As Range
    Dim dblmax As Double

    Set newrng = Worksheets("sheet3").Range("A1:A5, A8:A12")

    dblmax = Application.WorksheetFunction.Max(newrng)

    With Worksheets(2)
        .Range("D3").Value = dblmax
        .Range("E3").Value = newrng.Find(what:=dblmax, lookat:=xlWhole, LookIn:=xlValues).Address
    End With
End Sub

如果在进入循环之前首先计算出最大值,这是正确的。啊,是的,我现在知道你是如何更改方法的。谢谢!我还没有在vba中进入循环。我将尝试理解它。这一次,我只是尝试作为一个示例。我将尝试使用大数据实现。在这种情况下,我将不知道范围。我要做的是要实现的是我有一个从0开始的范围,[(1)0到最大]值,然后是[(2)最大到最小](这是连续的)值和[(3)最小到0].所以我将有1个连续范围和2个非连续范围。这就是为什么我尝试使用union将2个非连续范围转换为一个连续范围。因为我需要2个类似于Max-Min和Min-Max的范围进行进一步处理。所以有什么想法吗?如果你事先不知道所有单个范围的话n您仍然可以使用我回答的第一个代码,即将它们“联合”成一个“newrng”,然后在后者上使用Find()方法。但是我们鼓励您以第二个代码的方式重构它