2016-09-13 6 views
1

Я пишу небольшой макрос, который будет выполнять некоторые вычисления для меня, прежде чем отображать их, но функция «sum» внутри моего макроса, похоже, не работает?VBA сумма диапазона с vba не работает?

sub CompileDashboard() 
    For i = 3 To 100 
     If Sheets(1).Cells(i, "A").Value = "Week 36" Then 
      Sheets(2).Cells(1, 1) = Application.WorksheetFunction.Sum(Range(Cells(i, "AN"), Cells(i, "BF"))) 

     End If 
    Next 

End sub 

Это упрощение этого нужно просто шага, который разве работает, и я не уверен, почему оно не суммируя? Он всегда выводится как 0, несмотря на значения в диапазоне.

+0

попробуйте мой ответ ниже. Вы заметили, что каждый раз переписываете свой результат? вы помещаете Sum в 'Sheets (2) .Cells (1, 1)', вы не имели в виду также продвигать строку с помощью цикла 'For', и результат должен быть:' Таблицы (2) .Cells (i, 1) ' –

+0

, если вы хотите суммировать все в' Ячейках (1,1) 'then' Таблицы (2) .Cells (1, 1) = Таблицы (1). Evaluate ("SUM (AN3: BF100 * (A3: A100 = "" Неделя 36 "")) ")' будет делать это в одной строке;) –

ответ

1

Как уже упоминалось в комментариях эту строку:

Sheets(2).Cells(1, 1) = Application.WorksheetFunction.Sum(Range(Cells(i, "AN"), Cells(i, "BF")))

должно быть изменено на

Sheets(2).Cells(i, 1) = Application.WorksheetFunction.Sum(Range(Cells(i, "AN"), Cells(i, "BF")))

Просто вариация на тему. Мне очень нравится этот синтаксис, но вы его никогда не увидите.

Sub CompileDashboard() 
    Dim i As Integer 
    With Sheets(1) 
     For i = 3 To 100 
      With .Rows(i) 
       If .Columns("A").Value = "Week 36" Then 

        Sheets(2).Cells(i, 1) = Application.Sum(.Columns("AN:BF")) 

       End If 
      End With 
     Next 

    End With 
End Sub 
+0

Аккуратный альтернатив [Intersect method] (https: // msdn. microsoft.com/en-us/library/office/aa195772.aspx). – Jeeped

+0

@ Jeeped Спасибо. Я чувствую, что он действительно очищает код. Мне также нравится 'Columns (« A »). Строки (Rows.Count) .End (xlup)', но я не использую его, потому что люди не привыкли его видеть. –

+0

Ну, единственная стигма, которую я вижу, - это то, что преимущества обертывания родительского справочника рабочего листа в С ... End With теряются, когда With ... End With находится внутри For ... Next; то есть он повторно повторно ссылается. – Jeeped

1

Если вы намерены SUM строку (от Sheets(1)) для всех столбцов между "AN" и «BF, измените строку:

Sheets(2).Cells(1, 1) = Application.WorksheetFunction.Sum(Range(Cells(i, "AN"), Cells(i, "BF"))) 

к:

Sheets(2).Cells(1, 1) = Application.WorksheetFunction.Sum(Sheets(1).Range("AN" & i & ":BF" & i)) 
+0

Я считаю, что Sheet2 активен, и OP суммирует пустые ячейки в «Range» («AN» & i & : BF "& i)', когда они намереваются суммировать один и тот же диапазон от Sheet1. – Jeeped

+0

@ Возможно, вы правы (или он рассчитывает суммировать из 'Sheets (2)', это непонятно), так или иначе изменил asnwer, спасибо –

1

Всегда укажите явные ссылки на рабочий стол .Parent для всех Range и Range.Cells объектов. With ... End With statement может легко выполнить это и не только очистить но заставляет его работать быстрее.

sub CompileDashboard() 
    with Sheets(1) 
     For i = 3 To 100 
      If .Cells(i, "A").Value = "Week 36" Then 
       Sheets(2).Cells(1, 1) = Application.Sum(.Range(.Cells(i, "AN"), .Cells(i, "BF"))) 
      End If 
     Next 
    end with 
End sub 

Цель вашей петли неясна. Если есть только одна строка с «Неделя 36», вы должны выйти из команды «For ... Next», как только она будет найдена; на самом деле, Application.Match(...) найдет его мгновенно. Если есть несколько строк с «Неделя 36», вы не должны переписывать одну и ту же ячейку на Sheet2.