【问题标题】:Run-time error '1004' on WorksheetFunction.Max/Min for variable range变量范围的 WorksheetFunction.Max/Min 上的运行时错误“1004”
【发布时间】:2017-11-29 08:44:55
【问题描述】:

我想在 for 循环中获取范围的最大值和最小值(对于每一行)。

我在互联网上找到的解决方案要么是针对静态范围,要么是给我同样的错误。目前,我使用以下内容在xMax 行提供run-time error '1004'

Dim i As Long
Dim xMax As Double
Dim ws1 As Worksheet
Set ws1 = Worksheets("Sheet1")

For i = 2 To 15
    xMax = Application.WorksheetFunction.Max(ws1.range(Cells(i, 6), Cells(i, 15)))
Next

但以下静态范围有效:

xMax = Application.WorksheetFunction.Max(ws1.range(Cells(2, 6), Cells(2, 15)))

我尝试将其简化为 2 个单元格:

静态范围没有问题:

xMax = Application.WorksheetFunction.Max(Cells(2, 6).Value, Cells(2, 7).Value)

但动态范围弹出同样的错误:

For i = 2 To 15
    xMax = Application.WorksheetFunction.Max(Cells(i, 6).Value, Cells(i, 7).Value)
Next

如何在循环中实现变量范围的最小值/最大值?

【问题讨论】:

  • 您没有正确限定Cells 调用:xMax = Application.WorksheetFunction.Max(ws1.range(ws1.Cells(i, 6), ws1.Cells(i, 15)))
  • 你不用Next i吗?并将其设置为 int
  • @David G:不,i 是可选的 - 但使用它是一种很好的做法。

标签: excel vba max min


【解决方案1】:

在限定所有范围后进行初始陈述:

xMax = Application.WorksheetFunction.Max(ws1.range(ws1.Cells(i, 6), ws1.Cells(i, 15)))

当范围内的某些单元格出现错误时,例如#NA#DIV!0Max 函数会引发错误。要让您的计算忽略范围内的错误单元格,您可以使用 Aggregate 函数。

xMax = Application.Aggregate(14, 6, ws1.range(ws1.Cells(i, 6), ws1.Cells(i, 15)), 1)
  • 第一个参数14 指定Large。将15 用于Small
  • 第二个参数6 指定“忽略计算中的错误”
  • 最后一个参数1指定“第一个最大的结果”

还要注意您尝试过的其他版本,即

xMax = Application.WorksheetFunction.Max(Cells(i, 6).Value, Cells(i, 7).Value)

不指定连续范围,而是指定一组值(变体)。每当这些变体之一不是数字时,这将引发错误。但是你不需要这个版本。

【讨论】:

  • 太棒了!谢谢你救了我撞墙的头!
【解决方案2】:

您必须告诉 Excel cell 指向的位置 - 否则它将使用活动工作表,例如

xMax = Application.WorksheetFunction.Max(ws1.range(ws1.Cells(i, 6), ws1.Cells(i, 15)))

With ws1
    xMax =  Application.WorksheetFunction.Max(.Range(.Cells(i, 6), .Cells(i, 15)))
End With

就我个人而言,我通常首先将一个范围分配给一个范围变量——它有助于调试:

With ws1
    dim r as range
    ''' set r = .Range(.Cells(i, 6), .Cells(i, 15))  ' Fails if not all cells are numeric
    set r = .Range(.Cells(i, 6), .Cells(i, 15)).SpecialCells(xlCellTypeConstants, xlNumbers)
    xMax =  Application.WorksheetFunction.Max(r)
End With

【讨论】:

  • 谢谢,这就是问题所在。但是,当涉及到包含 #N/A 的单元格时,我遇到了同样的错误
【解决方案3】:

我包含一个拆分功能,可以更轻松地捕获字母。

Dim i As Long
Dim xMax As Double
Dim ws1 As Worksheet
Set ws1 = Worksheets("Sheet1")

For i = 2 To 15
    xMax = Application.WorksheetFunction.Max(ws1.range("F" & i & ":" & Split(Cells(, i).Address, "$")(1) & "15"))
Next

【讨论】:

  • 感谢您的回答。但是, i 变量适用于行而不适用于列。我需要得到F2:O2, F3:O3... , F15:O15,请注意xMax = Application.WorksheetFunction.Max(ws1.range("F:" & i & "O:" & i)) 也不起作用。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多