当“数据”表A的相应值落在另一个工作表“结果”的范围内时,我想计算名为“数据”的工作表中第i列的条件最大值。我试着使用下面的代码,但这是错误的:
Worksheets("Result").Cells(r , 4)=Evaluate("=STDEV(IF(Data!A:A>=Result!range(r,1) and Data!A:A<Result!range(r,2),Data!columns(i)))")
编写公式的正确方法是什么?
答案 0 :(得分:3)
您需要从字符串中删除vba部分并与&
连接。
并且数组公式不适用于And而是使用*来比较两个布尔值。
Worksheets("Result").Cells(r,4)=Worksheets("Result").Evaluate("=STDEV(IF((Data!A:A>=Result!" & Cells(r,1).Address & ")*(Data!A:A<Result!" & Cells(r,2).Address & "),Data!" & columns(i).Address & "))")
警告: 您正在使用数组公式中的完整列引用。如果你有太多的循环,这将是缓慢的。最好将所有完整列引用更改为数据集的范围。
答案 1 :(得分:2)
根据Scott Craner的建议,我使用Intersect来调整列范围以适应实际数据。
以下是r = 10: i = 5
和Worksheets("Data")
有19行数据的示例输出:
=STDEV(IF((Data!$A$1:$A$19>=Result!$A$10)*Data!$A$1:$A$19<Result!$B$10),Data!@$E$1:$E$19))
声明新变量:
Dim DataA As String, DataI As String, sFormula As String
要插入i
和r
循环的代码:
With Worksheets("Data")
DataA = Intersect(.Columns("A"), .UsedRange).Address
DataI = Intersect(.Columns(i), .UsedRange).Address
sFormula = "=STDEV(IF((Data!" & DataA & ">=Result!$A$" & r & ")*(Data!" & DataA & "<Result!$B$" & r & "),Data!@" & DataI & "))"
End With
With Worksheets("Result")
.Cells(r, 4) = .Evaluate(sFormula)
End With