Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA应用程序的替代品。包含小数的商_Vba_Excel - Fatal编程技术网

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
时,我才会得到错误。如果我删除此项,公式计算正确,我想我看到了问题嗯,我编辑了我的答案。