2014-10-15 6 views
0

У меня есть следующая формула, которая работает, когда я ввожу его в ячейку Excel:VBA SUMIFS с или критерии

=SUM(SUMIFS(Hours!$S:$S, Hours!$N:$N, 'HR Scorecard'!$D$2, Hours!$H:$H, {-2,-3})) 

Я сейчас пытаюсь преобразовать это функции VBA. Проблема, с которой я сталкиваюсь, заключается в том, что она говорит {является недопустимым символом.

sumact = Application.WorksheetFunction.Sum(Application.WorksheetFunction.SumIfs(wsHours.Columns(S), wsHours.Columns(N), A2, wsHours.Columns(H), {-2,-3})) 

Итак, мой первый вопрос: что заменить {-2, -3}, чтобы заставить его работать? Во-вторых, мне нужна Application.WorkSheetFunction перед Sum и SumIfs?

Редактировать: Я получил это для работы, передав его ячейкам в виде строки, но мне нужно передать значение, а не формулу, в ячейки.

+1

Кроме строки, возможно, попробуйте преобразовать ее в массив: массив (-2, -3). – Alter

ответ

0

Чтобы запустить «обычные» формулы Excel в VBA, заключите их в скобки.

sumact= [SUM(SUMIFS(Hours!$S:$S, Hours!$N:$N, 'HR Scorecard'!$D$2, Hours!$H:$H, {-2,-3}))] 

Должно работать.

+0

Это действительно близко. Одна вещь, которая мне еще нужна. Я заменил «HR Scorecard»! $ D $ 2 на «A2». У меня есть оператор select-case, который меняет текущий лист на цикл между несколькими листами. Как мне получить доступ к ячейке A2 текущего выбранного листа? – jesse

+0

Уточнение: в ячейке A2 каждого листа у меня есть двузначный идентификатор. Мне нужно найти все совпадения в Hours! $ N для этого идентификатора. Если я заменил «HR Scorecard»! $ D $ 2 одним из кодов (т. Е. «MV»), он отлично работает. Но когда я создаю строковую переменную под названием «pc» и использую эту переменную для замены «HR Scorecard»! $ D $ 2, она не находит совпадений. – jesse

+0

Итак, вы печатаете: dim pc as string: pc = "MV": [sumifs (pc, .... * и т. Д.)] – Jongscx

0

Я не могу воспроизвести пример, так как у меня отсутствует некоторая информация о данных и остальной части кода. Тем не менее, попробуйте следующее:

With Application.WorksheetFunction 
    sumact = .Sum(.SumIfs(wsHours.Columns(S), wsHours.Columns(N), A2, wsHours.Columns(H), Array(-2,-3))) 
End With 

поправки являются:

  1. Запись последнего ввода в виде массива (как это было предложено в комментарии к вашему вопросу);
  2. Использование блока «С» для доступа к методам Application.WorksheetFunctions.
+0

Это дает мне определенную или определяемую объектами ошибку. – jesse

0

Проблема в том, что формулы массивов не очень хорошо себя ведут при интегрировании в VBA. Я не могу это объяснить, так как мне не хватает знаний о том, как они работают как формулы, но их реализация в VBA - это почти бесполезное упражнение, если вы не знаете, что делаете.

При этом, если производительность не является проблемой, просто используйте Evaluate. Например, следующая подпрограмма выполняет, как ожидалось:

Sub Test() 
    MsgBox Evaluate("=SUM(2,3)") 'Shows a message box: 5 
End Sub 

Предполагая следующую таблицу в Sheet5:

Foo  10 
Bar  15 
Grok 30 
Spam 20 
Foo  50 
Bar  60 
Grok 20 
Spam 90 

Следующая подпрограмма выполняет, как ожидалось, а также:

Sub Test2() 
    MsgBox Evaluate("=SUMIF(Sheet5!$A:$A,""Foo"",Sheet5!$B:$B)") '60 
End Sub 

Вы можете даже сохраните его в переменной, если это необходимо.

Sub Test3() 
    ans = Evaluate("=SUMIF(Sheet5!$A:$A,""Grok"",Sheet5!$B:$B)") '50 
    MsgBox ans 
End Sub 

По общему признанию, так как он выполнен из VBA, скорость немного падает. Однако простота применения намного перевешивает накладные расходы на кодирование чистого варианта VBA.

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