Здравствуйте! В файле по выбранным критериям циклом ведется подсчет количества. Подскажите пожалуйста, возможно ли простым способом не учитывать критерий (если ячейка пуста), чтобы не городить многоэтажную конструкцию из "Если..." При этом подсчет должен вестись по имеющимся.[vba]
Код
Sub Сумма_по_критериям() Dim x As Long Dim i As Long iLastRow = Cells(Rows.Count, 3).End(xlUp).Row x = 0 For i = 3 To iLastRow 'If Range("A2")= "" Or Range("B2") = "" Or Range("C2") = "" Then ?????? 'Если какой-либо из критериев пусто то его проигнорировать If Cells(i, 1).Value = Range("A2").Value And Cells(i, 2).Value = Range("B2").Value And Cells(i, 3) = Range("C2") Then x = x + 1 End If Next Range("D2").Value = x End Sub
[/vba] Спасибо! Прошу прощения, кажется не в ту ветку форума поместилось [moder]Перенесла[/moder]
Здравствуйте! В файле по выбранным критериям циклом ведется подсчет количества. Подскажите пожалуйста, возможно ли простым способом не учитывать критерий (если ячейка пуста), чтобы не городить многоэтажную конструкцию из "Если..." При этом подсчет должен вестись по имеющимся.[vba]
Код
Sub Сумма_по_критериям() Dim x As Long Dim i As Long iLastRow = Cells(Rows.Count, 3).End(xlUp).Row x = 0 For i = 3 To iLastRow 'If Range("A2")= "" Or Range("B2") = "" Or Range("C2") = "" Then ?????? 'Если какой-либо из критериев пусто то его проигнорировать If Cells(i, 1).Value = Range("A2").Value And Cells(i, 2).Value = Range("B2").Value And Cells(i, 3) = Range("C2") Then x = x + 1 End If Next Range("D2").Value = x End Sub
[/vba] Спасибо! Прошу прощения, кажется не в ту ветку форума поместилось [moder]Перенесла[/moder]pechkin
Sub SummPoKriter() r0_ = 3'номер первой строки r1_ = Cells(Rows.Count, 1).End(3).Row''номер последней строки nr_ = r1_ - r0_ + 1'кол-во строк nc_ = 3'кол-во столбцов ar0 = Cells(r0_ - 1, 1).Resize(1, nc_)'засовываем в массив условия ar = Cells(r0_, 1).Resize(nr_, nc_)'засовываем в массив данные таблицы For i = 1 To nr_'цикл по строкам таблицы x0_ = 0'обнуляем промежуточный счетчик For j = 1 To nc_'цикл по столбцам If ar0(1, j) = "" Or ar0(1, j) = ar(i, j) Then x0_ = x0_ + 1'если в условии пусто или значение равно условию, то промежуточный счетчик увеличивается на 1 Next j'конец цикла по столбцам If x0_ = nc_ Then x_ = x_ + 1'если промежуточный счетчик равен количеству столбцов, то основной счетчик увеличивается на 1 Next i'конец цикла по строкам Cells(r0_ - 1, 1).Offset(, nc_) = x_'в ячейку пишем значение основного счетчика End Sub
[/vba]
Такой вариант [vba]
Код
Sub SummPoKriter() r0_ = 3'номер первой строки r1_ = Cells(Rows.Count, 1).End(3).Row''номер последней строки nr_ = r1_ - r0_ + 1'кол-во строк nc_ = 3'кол-во столбцов ar0 = Cells(r0_ - 1, 1).Resize(1, nc_)'засовываем в массив условия ar = Cells(r0_, 1).Resize(nr_, nc_)'засовываем в массив данные таблицы For i = 1 To nr_'цикл по строкам таблицы x0_ = 0'обнуляем промежуточный счетчик For j = 1 To nc_'цикл по столбцам If ar0(1, j) = "" Or ar0(1, j) = ar(i, j) Then x0_ = x0_ + 1'если в условии пусто или значение равно условию, то промежуточный счетчик увеличивается на 1 Next j'конец цикла по столбцам If x0_ = nc_ Then x_ = x_ + 1'если промежуточный счетчик равен количеству столбцов, то основной счетчик увеличивается на 1 Next i'конец цикла по строкам Cells(r0_ - 1, 1).Offset(, nc_) = x_'в ячейку пишем значение основного счетчика End Sub
pechkin, не очень ясно, что вас в условиях не устраивает. Они обеспечивают читабельность как минимум. Просто писать нужно с учётом вложенности выражения: Вот Ваш с учетом вложенности: [vba]
Код
Sub Сумма_по_критериям_Было() Dim x As Long Dim i As Long
iLastRow = Cells(Rows.Count, 3).End(xlUp).Row x = 0 ' не обязательно, x это Long и по умолчанию инициируется 0-м For i = 3 To iLastRow If Range("A2") <> "" Or Range("B2") <> "" Or Range("C2") <> "" Then 'Если какой-либо из критериев пусто то его проигнорировать If Cells(i, 1).Value = Range("A2").Value And Cells(i, 2).Value = Range("B2").Value And Cells(i, 3) = Range("C2") Then x = x + 1 End If End If Next Range("D2").Value = x End Sub
[/vba] Она легко делается: выделяете выражение и жмете Таб.
Но в принципе можно и так сделать... но это будет не совсем правильно, поскольку счёт на самом деле будет происходить... просто прибавляться будет 0:
[vba]
Код
Sub Сумма_по_критериям() Dim x As Long Dim i As Long
iLastRow = Cells(Rows.Count, 3).End(xlUp).Row x = 0 ' не обязательно, x это Long и по умолчанию инициируется 0-м For i = 3 To iLastRow 'If Range("A2")<> "" Or Range("B2") <> "" Or Range("C2") <> "" Then ?????? 'Если какой-либо из критериев пусто то его проигнорировать If Cells(i, 1).Value = Range("A2").Value And Cells(i, 2).Value = Range("B2").Value And Cells(i, 3) = Range("C2") Then x = x + (Range("A2") <> "") * (Range("B2") <> "") * (Range("C2") <> "") End If Next Range("D2").Value = x End Sub
[/vba]
pechkin, не очень ясно, что вас в условиях не устраивает. Они обеспечивают читабельность как минимум. Просто писать нужно с учётом вложенности выражения: Вот Ваш с учетом вложенности: [vba]
Код
Sub Сумма_по_критериям_Было() Dim x As Long Dim i As Long
iLastRow = Cells(Rows.Count, 3).End(xlUp).Row x = 0 ' не обязательно, x это Long и по умолчанию инициируется 0-м For i = 3 To iLastRow If Range("A2") <> "" Or Range("B2") <> "" Or Range("C2") <> "" Then 'Если какой-либо из критериев пусто то его проигнорировать If Cells(i, 1).Value = Range("A2").Value And Cells(i, 2).Value = Range("B2").Value And Cells(i, 3) = Range("C2") Then x = x + 1 End If End If Next Range("D2").Value = x End Sub
[/vba] Она легко делается: выделяете выражение и жмете Таб.
Но в принципе можно и так сделать... но это будет не совсем правильно, поскольку счёт на самом деле будет происходить... просто прибавляться будет 0:
[vba]
Код
Sub Сумма_по_критериям() Dim x As Long Dim i As Long
iLastRow = Cells(Rows.Count, 3).End(xlUp).Row x = 0 ' не обязательно, x это Long и по умолчанию инициируется 0-м For i = 3 To iLastRow 'If Range("A2")<> "" Or Range("B2") <> "" Or Range("C2") <> "" Then ?????? 'Если какой-либо из критериев пусто то его проигнорировать If Cells(i, 1).Value = Range("A2").Value And Cells(i, 2).Value = Range("B2").Value And Cells(i, 3) = Range("C2") Then x = x + (Range("A2") <> "") * (Range("B2") <> "") * (Range("C2") <> "") End If Next Range("D2").Value = x End Sub
If Range("A2")<> "" Or Range("B2") <> "" Or Range("C2") <> "" Then
это я Ваше условие и списал) проглядел саму суть задачи) А вот приведение true к целочисленному -1 для меня оказалось сюрпризом)) А так, для сохранения именно условия
Sub Сумма_по_критериям() Dim x As Long Dim i As Long Dim tmp As Long iLastRow = Cells(Rows.Count, 3).End(xlUp).Row x = 0 ' не обязательно, x это Long и по умолчанию инициируется 0-м For i = 3 To iLastRow 'If Range("A2")<> "" Or Range("B2") <> "" Or Range("C2") <> "" Then ?????? 'Если какой-либо из критериев пусто то его проигнорировать If (Cells(i, 1).Value = Range("A2").Value) ^ -(Range("A2") <> "") And _ (Cells(i, 2).Value = Range("B2").Value) ^ -(Range("B2") <> "") And _ (Cells(i, 3).Value = Range("C2").Value) ^ -(Range("C2") <> "") Then x = x + 1 End If Next Range("D2").Value = x End Sub
If Range("A2")<> "" Or Range("B2") <> "" Or Range("C2") <> "" Then
это я Ваше условие и списал) проглядел саму суть задачи) А вот приведение true к целочисленному -1 для меня оказалось сюрпризом)) А так, для сохранения именно условия
Sub Сумма_по_критериям() Dim x As Long Dim i As Long Dim tmp As Long iLastRow = Cells(Rows.Count, 3).End(xlUp).Row x = 0 ' не обязательно, x это Long и по умолчанию инициируется 0-м For i = 3 To iLastRow 'If Range("A2")<> "" Or Range("B2") <> "" Or Range("C2") <> "" Then ?????? 'Если какой-либо из критериев пусто то его проигнорировать If (Cells(i, 1).Value = Range("A2").Value) ^ -(Range("A2") <> "") And _ (Cells(i, 2).Value = Range("B2").Value) ^ -(Range("B2") <> "") And _ (Cells(i, 3).Value = Range("C2").Value) ^ -(Range("C2") <> "") Then x = x + 1 End If Next Range("D2").Value = x End Sub