VBA应用程序的替代品。包含小数的商
我正在尝试使用VBA应用程序的替代品。包含小数的商,vba,excel,Vba,Excel,我正在尝试使用应用程序。平均值如果,我需要将答案除以3。我试着这样做: Range("C1:C676") = (Application.IfError(Application.AverageIfs(Sheets(modelName).Range("R:R".... Sheets(modelName).Range("U:U"), "OGV"), "0") / 3) 第一个应用程序和最后一个3也没有括号,但这会导致类型不匹配错误 将其嵌套在应用程序中。商有效
应用程序。平均值如果,我需要将答案除以3。我试着这样做:
Range("C1:C676") = (Application.IfError(Application.AverageIfs(Sheets(modelName).Range("R:R"....
Sheets(modelName).Range("U:U"), "OGV"), "0") / 3)
第一个应用程序
和最后一个3
也没有括号,但这会导致类型不匹配错误
将其嵌套在应用程序中。商有效,但它只给出答案的整数部分,我还需要小数。有一个十进制友好的替代方案吗?我更愿意继续使用应用程序
语法,而不是使用range().formula=“=averageifs(
),如果可能的话
编辑:根据J.Fox的建议,我将公式部分分解为变量。问题似乎是criZFrom
和criZTo
变量,它们使用单独表格中的一个范围作为标准。如果我将这些变量替换为“1”
和”2,则公式工作正常“
分别。代码现在是:
Set rng = Sheets(wsName).Range("C1:C676")
Set avgCol = Sheets(modelName).Range("M:M")
Set colZFrom = Sheets(modelName).Range("G:G")
Set criZFrom = Sheets(wsName).Range("A1:A676")
Set colZTo = Sheets(modelName).Range("H:H")
Set criZTo = Sheets(wsName).Range("B1:B676")
Set colTime = Sheets(modelName).Range("V:V")
Set colVType = Sheets(modelName).Range("U:U")
criVType = "OGV"
criAM = "AM"
Range("A1:A676").Formula = "=roundup(row()/26,0)"
Range("B1:B676").Formula = "=if(mod(row(),26)=0,26,mod(row(),26))"
rng = Application.AverageIfs(avgCol, colZFrom, criZFrom, colZTo, criZTo, colTime, criAM, colVType, criVType) / 3
以下是一些示例数据:
从工作表(modelName)
,这有我试图平均的数据和大多数标准范围:
从工作表(wsName)
,这是问题变量的标准,也是我希望结果出现的地方(在C列):看起来您在“OGV”之后缺少一个右括号“
来结束AverageIfs
函数,即:
Range("C1:C676") = Application.IfError(Application.AverageIfs(Sheets(modelName).Range("R:R", Sheets(modelName).Range("U:U"), "OGV")), 0) / 3
另外,不确定…
是否仅用于此处或您的代码中,但您希望改用\uu
,如:
Range("C1:C676") = _
Application.IfError(Application.AverageIfs(Sheets(modelName).Range("R:R", _
Sheets(modelName).Range("U:U"), "OGV")), 0) / 3
编辑:如果您仍然遇到错误,我建议您将公式分解为多个组成部分,并将每个部分分配给一个变量,这样您就可以准确地排除问题所在,如下所示:
Sub test()
Dim rng As Range, col1 As Range, col2 As Range, str As String, modelName As String
modelName = "Sheet1"
Set rng = Range("C1:C676")
Set col1 = Sheets(modelName).Columns(18)
Set col2 = Sheets(modelName).Columns(21)
str = "OGV"
rng = Application.IfError(Application.AverageIfs(col1, col2, str), 0) / 3
End Sub
我们能看一些样本数据吗?这可能是关于AverageIfs
函数的参数传递顺序的问题
编辑2:我想我可能知道问题出在哪里了。您正在使用AverageIfs
函数,目的是通过使用Arg3和Arg5的范围而不是单个值(这是AverageIfs
不喜欢的),根据每行的特定条件分别验证每行。Ifs
函数的标准始终需要是单个值,而不是一个值范围。相反,我认为您需要使用循环分别迭代每一行,如下所示:
Set avgCol = Sheets(modelName).Range("M:M")
Set colZFrom = Sheets(modelName).Range("G:G")
Set colZTo = Sheets(modelName).Range("H:H")
Set colTime = Sheets(modelName).Range("V:V")
Set colVType = Sheets(modelName).Range("U:U")
criVType = "OGV"
criAM = "AM"
Range("A1:A676").Formula = "=roundup(row()/26,0)"
Range("B1:B676").Formula = "=if(mod(row(),26)=0,26,mod(row(),26))"
Dim x as Long
Dim t as Variant
For x = 1 To 676
Set criZFrom = Sheets(wsName).Range("A" & x)
Set criZTo = Sheets(wsName).Range("B" & x)
Set Rng = Sheets(wsName).Range("C" & x)
t = Application.WorksheetFunction.AverageIfs(avgCol, colZFrom, criZFrom.Value, colZTo, criZTo.Value, colTime, criAM, colVType, criVType)
t = CDbl(t / 3)
Rng.Value = t
Next x
啊,对不起,…
在那里,因为完整的公式太长了,我想我会缩短它以便于阅读。完整代码确实按照您的建议使用了。
。如果我按照建议添加括号,它将给出编译错误:预期:语句结束
。不用担心。我添加了一个潜在的解决方案作为编辑。好的,谢谢,我会试试的。那么,在主要公式之后添加/3
就行了吗?我已经缩小了问题的范围,按照您的建议编辑了我的原始问题,并添加了一些示例数据。我很高兴这样做有效CDbl
在这里可能根本不需要,但我不想冒险。CDbl
仅确保t/3
的结果以双变量类型存储在t
中,以保留十进制值。我不认为它会存储为没有小数点的东西,因为它是Dim
'd作为Variant
,但你永远不知道。你在编辑的代码和哪一行中遇到了什么错误?您在哪里使用criZFrom
和criZTo
?我在编辑的代码中看不到它们,除了它们的定义位置。所有变量Dim
'd都是范围吗?Argh我在尝试使用1和2硬编码后复制了它。我现在已经编辑过了。错误是run tim error 13:type mismatch
如果我使用变量,错误在rng=Application.AverageIfs(
)上。如果我硬编码1或2(来自G列和H列)错误消失了,公式工作了。问题变量是Dim
d,范围为yes。第一张表中的G列和H列需要与第二张表中的A列和B列一致。只有在主公式后面有/3
时,我才会得到错误。如果我删除此项,公式计算正确,我想我看到了问题嗯,我编辑了我的答案。