2014-09-28 5 views
0

У меня возникают проблемы со следующим макросом. Я пытаюсь получить следующую функцию, которая работает в VBA.преобразование функции рабочего листа excel в vba

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

Это потому, что эта функция слишком медленно замедляет работу 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 

FIRST UPDATE

Я прогресс. Я забыл, что я использовал другой модуль и, следовательно, не имел явных опций в новом модуле и что я ошибочно писал firstcell и first_cell. У меня есть все ошибки, удаленные в VBA, но теперь результат, который появляется, - #REF, что означает, что он ссылается на удаленные ячейки, что явно не так. Вот новая обновленная книга.

https://drive.google.com/file/d/0B9zzW6-3m2qGeFNCdEhtem44Wnc/edit?usp=sharing

А вот код:

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 
+0

Попробуйте скопировать вычисления вашего макроса с помощью 'Application.ScreenUpdating = False' и' Application.ScreenUpdating = True' –

+0

Это не помогло. – user147178

+0

Это будет вопрос разбивки его на более простые составляющие, пока вы не изолируете проблему. Конечно, убедитесь, что VBA компилируется с помощью опции Option Explicit в верхней части модуля. – Smandoli

ответ

0

Проблема решена. Я изменил имя времени листа на время2, потому что время уже использовалось Excel как специальная функция. Но когда я использовал функцию оценки, которая больше не нужна.

Оценка ("= SUMPRODUCT (Time $ I $ 2: $ I $ 50000, - (Time $ E $ 2: $ E $ 50000 =" & х & «), - (Time $ G $ 2: $ G $ 50000 = "& y &")) ")

Таким образом, проблема возникла из-за опечатки.

Смежные вопросы