2017-02-11 6 views
1

Пожалуйста, не могли бы вы рассказать мне, что случилось с моей второй последней формулой SUMIFS, где я использую " < " &$F$1. Все, что возвращается, FALSE во всех ячейках. Последние SUMIFS без < отлично работают.Формула SUMIFS в VBA с «<»

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

Кроме того, у вас есть много ненужных 'Select' и' Activate' –

+0

Диапазон $ I $ 2: $ I $ - даты и ячейки $ F $ 1 - дата, – Anthony

+0

Hi Shai, когда я пытаюсь <$ F $ 1) Я получаю ошибку времени выполнения «1004»: определяемая приложением или объектная ошибка. Цените свое время. Благодарю. – Anthony

ответ

0

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

Кроме того, вы замешивания несколько вещей:.

  • Старайтесь избегать использования Worksheets("Database").Activate и Worksheets("Sheet2").Activate, и вместо того, чтобы использовать полностью квалифицированные рабочие листы и диапазоны, как:. With Worksheets("Database") и внутри lastCode = .Range("O" & .Rows.Count).End(xlUp).Row
  • Вы Sheet2 в nd Worksheets("Sheet2"), эти два не всегда означают один и тот же рабочий лист. Вы можете переименовать Sheet2 (по кодовому имени) в «Something», и это будет ваш второй лист, и переименуйте Sheet3 (по кодовому имени) на «Sheet2», и у вас возникнет проблема. Поэтому решите, какой метод вы хотите использовать (я предпочитаю использовать 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 
+0

Спасибо за советы Shai Rado – Anthony

+0

@ Энтони, вы можете отметить как «Ответ» один из ответов, которые вы получили здесь (и/или upvote). –

+0

Hi Shai Rado, я новичок на этом сайте. Я нажал на стрелку ^. Надеюсь, я поступил правильно. – Anthony

1
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)" 

Это будет делать это. положить < в кавычки.

+0

Спасибо, двойные кавычки! М Омар, ты ученый и джентльмен/леди. – Anthony

2

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

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

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

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

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

+0

приятное объяснение, поэтому я предпочитаю использовать 'Chr (34)' вместо подсчета количества '' 'я –