Формула СУММЕСЛИМН в VBA с ‹

Пожалуйста, не могли бы вы сказать мне, что не так с моей предпоследней формулой SUMIFS, где я использую " < " &$F$1. Все, что возвращается, FALSE во всех ячейках. Последнее СУММЕСЛИМН без ‹ работает нормально.

Sub SumGroups()

Worksheets("Database").Activate
Dim lastCode, lastFiltCode As Integer
Dim Formula As String

'Determine Last Row in Column O (Unfiltered Codes)
lastCode = Range("O" & Rows.Count).End(xlUp).Row

'Filter Unique Codes into Column A Sheet2
Range("O1:O" & lastCode).AdvancedFilter Action:=xlFilterCopy, _
      CopyToRange:=Sheet2.Range("A1"), Unique:=True
'Determine last Row in Column A (Filtered Codes)
Worksheets("Sheet2").Activate
lastFiltCode = Sheet2.Range("A" & Rows.Count).End(xlUp).Row

'Place SUMIF Formulas in Columns Sheet2    
Worksheets("Sheet2").Range("B2:B" & lastFiltCode).Formula = _
"=SUMIFS(Database!$M$2:$M$" & lastCode & ",Database!$O$2:$O$" & lastCode & ",A2)"
Worksheets("Sheet2").Range("D2:D" & lastFiltCode).Formula = _
"=SUMIFS(Database!$M$2:$M$" & lastCode & ",Database!$O$2:$O$" & lastCode & ",A2,Database!$I$2:$I$" & lastCode & "," < " &$F$1)"
 Worksheets("Sheet2").Range("F2:F" & lastFiltCode).Formula = _
"=SUMIFS(Database!$M$2:$M$" & lastCode & ",Database!$O$2:$O$" & lastCode & ",A2,Database!$I$2:$I$" & lastCode & ",$F$1)"

End Sub

person Anthony    schedule 11.02.2017    source источник
comment
к тому же у тебя много ненужных Select и Activate   -  person Shai Rado    schedule 11.02.2017
comment
Диапазон $I$2:$I$ — даты, а Cell$F$1 — дата,   -  person Anthony    schedule 11.02.2017
comment
Привет, Шай! Когда я пытаюсь выполнить ‹ $F$1), я получаю ошибку времени выполнения «1004»: ошибка, определяемая приложением или объектом. Цените свое время. Спасибо.   -  person Anthony    schedule 11.02.2017


Ответы (3)


Во-первых, чтобы получить <$F$1 внутри формулы, я использую Chr(34), чтобы добавить круглую скобку "" внутри формулы.

Кроме того, вы путаете несколько вещей:

  • Старайтесь избегать использования Worksheets("Database").Activate и Worksheets("Sheet2").Activate, а вместо этого используйте полные рабочие листы и диапазоны, например: With Worksheets("Database") и внутри lastCode = .Range("O" & .Rows.Count).End(xlUp).Row.
  • У вас есть Sheet2 и Worksheets("Sheet2"), эти два не всегда означают один и тот же рабочий лист. Вы можете переименовать Sheet2 (по кодовому имени) в «Что-то», и это будет ваш второй лист, и переименовать Sheet3 (по кодовому имени) в «Лист2», и у вас возникнет проблема. Так что решите, какой метод вы хотите использовать (я предпочитаю использовать Worksheets("Sheet2")).
  • Dim lastCode, lastFiltCode As Integer означает, что lastCode на самом деле Variant, а lastFiltCode это Integer. В любом случае лучше использовать Long для обеих этих переменных, когда вы пытаетесь получить последнюю строку.

Код

Option Explicit

Sub SumGroups()

Dim lastCode As Long, lastFiltCode As Long

'Determine Last Row in Column O (Unfiltered Codes)
With Worksheets("Database")
    lastCode = .Range("O" & .Rows.Count).End(xlUp).Row

    'Filter Unique Codes into Column A Sheet2
    .Range("O1:O" & lastCode).AdvancedFilter Action:=xlFilterCopy, _
            CopyToRange:=Worksheets("Sheet2").Range("A1"), Unique:=True        
End With

With Worksheets("Sheet2")
    'Determine last Row in Column A (Filtered Codes)
    lastFiltCode = .Range("A" & .Rows.Count).End(xlUp).Row

    'Place SUMIF Formulas in Columns Sheet2
    .Range("B2:B" & lastFiltCode).Formula = _
        "=SUMIFS(Database!$M$2:$M$" & lastCode & ",Database!$O$2:$O$" & lastCode & ",A2)"

    .Range("D2:D" & lastFiltCode).Formula = _
        "=SUMIFS(Database!$M$2:$M$" & lastCode & ",Database!$O$2:$O$" & lastCode & ",A2,Database!$I$2:$I$" & lastCode & "," & Chr(34) & "<" & Chr(34) & "&$F$1)"

    .Range("F2:F" & lastFiltCode).Formula = _
        "=SUMIFS(Database!$M$2:$M$" & lastCode & ",Database!$O$2:$O$" & lastCode & ",A2,Database!$I$2:$I$" & lastCode & ",$F$1)"
End With

End Sub
person Shai Rado    schedule 11.02.2017
comment
Спасибо за советы Шай Радо - person Anthony; 11.02.2017
comment
@Anthony, вы можете пометить как ответ один из ответов, которые вы получили здесь (и / или проголосовать за) - person Shai Rado; 11.02.2017
comment
Привет, Шай Радо, я новичок на этом сайте. Я нажал на стрелку ^. Надеюсь, я поступил правильно. - person Anthony; 11.02.2017
comment
это голосование за, чтобы отметить как ответ, вам нужно нажать на V рядом с одним из ответов (вы увидите, что V станет зеленым), и это также повысит ваш балл +2 - person Shai Rado; 11.02.2017
comment
Хорошо, нажал на V. Надеюсь, все хорошо. Ваша помощь приветствуется. - person Anthony; 11.02.2017
comment
@ Энтони, нет, ты не ответил ни на один из ответов (мой или M Omar) V зеленый - person Shai Rado; 11.02.2017
comment
Ааа.. Это галочка, которую я должен нажать. - person Anthony; 11.02.2017
comment
@Энтони LOL, поздравляю, ты сделал это - person Shai Rado; 11.02.2017

Просто чтобы уточнить, почему другие ответы работают:

SumIf (а также различные другие функции Excel, требующие строковых операторов (таких как CountIf) ожидают, что логические операторы и их последующие операторы будут выражены в виде строки. То есть должны быть заключены в речевые метки, например, «myString».

Поскольку формула также является строкой, например. ActiveCell.Formula = "=If(A1=3, 1, 0)" компилятор путается в том, какой набор кавычек обозначает строку. Так например это не будет работать: ActiveCell.Formula = "=If(A1=3, "Yes", "No")".

Технически способ справиться с этим состоит в том, чтобы заключить требуемую кавычку в собственные кавычки; """ myValue """.

Однако это быстро сбивает с толку. Вместо этого используйте функцию Character, чтобы вернуть требуемый символ. . В данном случае 34; chr(34) & myvalue & (chr34).

person Absinthe    schedule 11.02.2017
comment
хорошее объяснение, вот почему я предпочитаю использовать Chr(34) вместо того, чтобы считать, сколько " у меня есть - person Shai Rado; 12.02.2017

Worksheets("Sheet2").Range("D2:D" & lastFiltCode).Formula = _
"=SUMIFS(Database!$M$2:$M$" & lastCode & ",Database!$O$2:$O$" & lastCode &      ",A2,Database!$I$2:$I$" & lastCode & ","" < "" &$F$1)"

Это сделает это. поставить ‹ в кавычках.

person M Omar    schedule 11.02.2017
comment
Спасибо, двойные кавычки работают! M Омар, вы ученый и джентльмен / леди. - person Anthony; 11.02.2017