Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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
将excel工作表函数转换为vba_Vba_Excel_Excel Formula - Fatal编程技术网

将excel工作表函数转换为vba

将excel工作表函数转换为vba,vba,excel,excel-formula,Vba,Excel,Excel Formula,下面的宏有问题。我试图得到下面的函数,它可以在VBA中转换 =SUMPRODUCT(time!$I$1418:time!$I$39433,--(time!$E$1418:time!$E$39433=$B11),--(time!$G$1418:time!$G$39433=E$2)) 这是因为如果Excel存在于太多的单元格中,则该函数会使Excel的速度减慢太多 这是我到目前为止得到的。我试图从c列循环到第二行=“total”所在的列,然后我继续下一行,重复这个过程,直到B列中的单元格为空 我有

下面的宏有问题。我试图得到下面的函数,它可以在VBA中转换

=SUMPRODUCT(time!$I$1418:time!$I$39433,--(time!$E$1418:time!$E$39433=$B11),--(time!$G$1418:time!$G$39433=E$2))
这是因为如果Excel存在于太多的单元格中,则该函数会使Excel的速度减慢太多

这是我到目前为止得到的。我试图从c列循环到第二行=“total”所在的列,然后我继续下一行,重复这个过程,直到B列中的单元格为空

我有一个运行时错误1004,应用程序定义的错误或对象定义的错误,他们正在突出显示sumproduct部分

Sub date_stats()

Dim first_cell As Integer
Dim time As Worksheet
Set time = ActiveWorkbook.Sheets("time")
Dim i As Integer, j As Integer, num As Integer

firstcell = Range("e65000").End(xlUp).Row + 1

Do Until ActiveSheet.Range("b" & firstcell).Value = ""
firstcell = firstcell + 1
i = 2
    Do Until ActiveSheet.Cells(2, i).Value = "total"
    i = i + 1

    num = Application.WorksheetFunction.SumProduct(time.Range("i2:i50000"), --(time.Range("E2:E50000") = ActiveSheet.Range("B" & first_cell)), --(time.Range("G2:G50000") = ActiveSheet.Cells(i, 2)))

    Loop
Loop
第一次更新

我正在进步。我忘记了我使用的是另一个模块,因此在新模块上没有明确的选项,我把firstcell和first_cell拼错了。我已经删除了VBA上的所有bug,但现在出现的结果是#REF,这意味着它引用的是已删除的单元格,而事实显然并非如此。这是新更新的工作簿

代码如下:

Sub date_stats()


Dim first_cell As Integer
Dim time2 As Worksheet
Set time2 = ActiveWorkbook.Sheets("time")
Dim i As Integer, j As Integer, num As Integer
Dim x As String
Dim y As String
Dim z As Range




'num = Format(num, "standard")


Application.ScreenUpdating = False


With ActiveSheet
first_cell = .Range("e65000").End(xlUp).Row


'=SUMPRODUCT(time!$I$1418:time!$I$39433,--(time!$E$1418:time!$E$39433=$B11),--(time!$G$1418:time!$G$39433=E$2))


Do Until .Range("b" & first_cell).Value = ""
first_cell = first_cell + 1
i = 3
    Do Until .Cells(2, i).Value = "total"

    x = .Range("B" & first_cell).Address
    y = .Cells(2, i).Address
    Set z = .Cells(first_cell, i)
    z.Value = Evaluate("=SUMPRODUCT(time2!$I$2:$I$50000,--(time2!$E$2:time2!$E$50000=" & x & "),--(time2!$G$2:time2!$G$50000=" & y & "))")
     i = i + 1
    Loop
Loop


End With


Application.ScreenUpdating = True




End Sub

问题解决了。我将工作表time的名称更改为time2,因为Excel已经将time用作一个特殊函数。但当我使用不再需要的评估功能时

评估(“=SUMPRODUCT(时间!$I$2:$I$50000,--(时间!$E$2:$E$50000=“&x&”),-(时间!$G$2:$G$50000=“&y&”))


所以这个问题是由于打字错误造成的

尝试用
Application.screenUpdatement=False
Application.screenUpdate=True
将宏的计算括起来,只需将其分解为更简单的组成部分,直到将问题隔离。当然,请确保VBA在模块顶部使用
选项Explicit
进行编译。
SumProduct
工作表函数在VBA中受到更大的限制,因为它不支持数组参数。您可以先根据标准创建范围,然后将范围传递给
SumProduct
,从而绕过此问题。您能举个例子吗