【问题标题】:Excel VBA Trying to write a "MAX" formula to Cells with different Ranges with For-LoopExcel VBA尝试使用For-Loop向具有不同范围的单元格写入“MAX”公式
【发布时间】:2019-04-05 07:20:06
【问题描述】:

我正在尝试让 VBA 将公式写入不同的单元格,以找到由某些变量决定的 Range 的最大值。我的变量IJ 是(数字/整数)。

这是我的代码。

Sub AddMAX()
    Dim I As Integer
    Dim J As Integer
    Dim L As Integer

    I = InputBox("Number of columns to check max value")
    J = InputBox("Number of Rows to add formula inn and find max value of that row")

    For L = 5 To 4 + J
        Worksheets(1).Cells(L, 4 + I).Formula = "=" & Max(Range(Cells(L, 4), Cells(L, 3 + I)))
    Next L
End Sub

曾多次尝试重写第二部分(等号后面的部分)。通常我会收到消息编译错误:未定义子或函数,它标记了“最大值”。我认为Max(也尝试使用大写字母)是一个内置函数,如 SUM 等。

我正在尝试让它在单元格中写入这样的 Excel 公式:

对于I=2J=3

单元格 F5:=MAX(D5:E5)
单元格 F6:=MAX(D6:E6)
F7 单元格:=MAX(D7:E7)

即我想要一个单元格中的公式,就像我在单元格中手动编写的那样来计算最大值,这样如果单元格 D5、D7 和 E5 到 E7 中的值发生变化,则无需任何脚本即可找到新的最大值运行。

如果有什么不清楚的地方请告诉我。

【问题讨论】:

  • 您不需要循环。您可以一次性输入整个范围内的公式。例如.Range("F5:F" & 4 + J).Formula = "=Max(D5:E5)"
  • 感谢您的回答。但我认为我需要循环,因为单元格会根据您在“InputBox”中所做的输入而改变。即单元格公式的范围取决于您拥有的列数。所以公式可以是"=Max(H5:M5)",也可以是"=Max(B5:X5)"等等。对于不同的设置必须是可以接受的,即要检查不同数量的列的 MAX 值。
  • 所以你的公式会根据输入的不同而有所不同,但你仍然不需要循环并且仍然可以在一次操作中分配它。
  • 我同意@GSerg。你仍然不需要循环:)
  • @Siddharth Rout 我当时不明白的是如何使公式动态化。 Range Range("F5:F" & 4 + J).Formula 应该是左右动态的,以及行数(您已经将其设为动态)。此外,每个单元格中的结果公式应对应于与"=Max(D5:E5)" 相同的行。即"=Max(WX:WY)" 必须引用同一行中的值范围。我可能没有看到你们看到的东西,但希望你们可以尝试向我解释更多:-) 到目前为止 VBA 初学者,但要学习更多。

标签: excel vba for-loop max formula


【解决方案1】:

您不应该将RangeCells 放在公式字符串中,它们对Excel 公式引擎没有任何意义。您需要单元格的Address

Dim I As Long
Dim J As Long
Dim L As Long

I = InputBox("Number of columns to check max value")
J = InputBox("Number of Rows to add formula inn and find max value of that row")
L = 5

With Worksheets(1)
  .Range(.Cells(L, 4 + I), .Cells(4 + J, 4 + I)).Formula = "=MAX(" & .Cells(L, 4).Address(False, False) & ":" & .Cells(L, I + 3).Address(False, False) & ")"
End With

公式实际上对于所有单元格都是相同的,这就是为什么可以在一个分配中为整个区域分配它的原因。它在 A1 参考符号中看起来不同,但如果您在 Excel 设置中切换到 R1C1,您会发现它们是相同的。这也意味着首先创建该公式using the R1C1 notation 更容易:

Dim I As Long
Dim J As Long
Dim L As Long

I = InputBox("Number of columns to check max value")
J = InputBox("Number of Rows to add formula inn and find max value of that row")
L = 5

With Worksheets(1)
  .Range(.Cells(L, 4 + I), .Cells(4 + J, 4 + I)).FormulaR1C1 = "=MAX(RC[-" & I & "]:RC[-1])"
End With

但在我看来,您应该按照预期的方式使用 Excel 界面。选择应包含MAX 公式的单元格。保持选中整个范围,将 MAX 公式放入其任何单元格中,就像您为该单元格创建它一样,但不要按 Enter,而是按 Ctrl+Enter kbd>.

【讨论】:

  • 感谢您的深入解释!这正是我想要的。很高兴您还展示了更简单的方法来定义单元格/范围。周末愉快!
【解决方案2】:

您必须小心区分 VBA 看到的部分和最终公式。

如果你写

Worksheets(1).Cells(L, 4 + I).Formula = "=" & Max(Range(Cells(L, 4), Cells(L, 3 + I)))

Max(以及以下所有内容)被 VBA 解释器看到,而不是 Excel。但是没有Max-function,你会得到一个(编译器)-error。

如果你写

Worksheets(1).Cells(L, 4 + I).Formula = "=Max(Range(Cells(L, 4), Cells(L, 3 + I)))"

VBA 解释器将整个内容视为一个字符串。它不能关心像LI 这样的变量,因为它看不到它们。因此,您最终会得到一个与您编写的完全相同的公式 - Excel(不是 VBA)会向您显示错误,因为它不理解 LI

您需要的是一个语句(在 VBA 中),它创建一个包含变量的实际 的字符串,并将其分配给 cell.formula。我强烈建议您首先将其分配给一个字符串变量 - 它使调试更加容易:

Dim formula As String
formula = "=Max(Range(Cells(" & L & ", 4), Cells(" & L & ", 3 + " & I & ")))"
Debug.Print formula
Worksheets(1).Cells(L, 4 + I).Formula = formula

更新:对不起,我根本没有看公式的内容,当然RangeCells-objects是VBA对象。您在公式中需要的是范围的地址,因此将行更改为

formula = "=MAX(" & Range(Cells(L, 4), Cells(L, 3 + i)).Address & ")"

现在 VBA 将创建一个Range 并将地址放入公式字符串中。

【讨论】:

  • 感谢您的解释。似乎它有点工作,但它不会添加和计算。在单元格中,公式看起来像一个字符串:= MAX((Cells(5; 4): Cells(5; 3 + 2))) 它不会计算,它只显示#NAME?在应该显示最大值的单元格上。当我检查单元格中的公式时,它显示= MAX((Cells(5; 4): Cells(5; 3 + 2)))。你知道可能是什么问题。是Dim formula As String 的定义吗?为任何帮助干杯
猜你喜欢
  • 2019-08-01
  • 2022-01-14
  • 2016-10-31
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
相关资源
最近更新 更多