Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Не учитывать критерии подсчета значений - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Не учитывать критерии подсчета значений (Макросы/Sub)
Не учитывать критерии подсчета значений
pechkin Дата: Четверг, 31.05.2018, 10:23 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 329
Репутация: 49 ±
Замечаний: 0% ±

2003
Здравствуйте! В файле по выбранным критериям циклом ведется подсчет количества. Подскажите пожалуйста, возможно ли простым способом не учитывать критерий (если ячейка пуста), чтобы не городить многоэтажную конструкцию из "Если..." При этом подсчет должен вестись по имеющимся.[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]
К сообщению приложен файл: 8600829.xls (24.0 Kb)


Сообщение отредактировал Pelena - Четверг, 31.05.2018, 10:37
 
Ответить
СообщениеЗдравствуйте! В файле по выбранным критериям циклом ведется подсчет количества. Подскажите пожалуйста, возможно ли простым способом не учитывать критерий (если ячейка пуста), чтобы не городить многоэтажную конструкцию из "Если..." При этом подсчет должен вестись по имеющимся.[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
Дата добавления - 31.05.2018 в 10:23
_Boroda_ Дата: Четверг, 31.05.2018, 10:46 | Сообщение № 2
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16673
Репутация: 6479 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Такой вариант
[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
[/vba]
К сообщению приложен файл: 8600829_1.xls (42.0 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеТакой вариант
[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
[/vba]

Автор - _Boroda_
Дата добавления - 31.05.2018 в 10:46
Roman777 Дата: Четверг, 31.05.2018, 10:52 | Сообщение № 3
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
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]


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Четверг, 31.05.2018, 10:59
 
Ответить
Сообщение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]

Автор - Roman777
Дата добавления - 31.05.2018 в 10:52
Manyasha Дата: Четверг, 31.05.2018, 11:20 | Сообщение № 4
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
pechkin, здравствуйте, еще один вариант, форумльный:
Код
=БСЧЁТ(A1:C10;A1;E1:G2)


только условия придется вытащить из таблицы.
К сообщению приложен файл: 8600829-1.xls (45.5 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщениеpechkin, здравствуйте, еще один вариант, форумльный:
Код
=БСЧЁТ(A1:C10;A1;E1:G2)


только условия придется вытащить из таблицы.

Автор - Manyasha
Дата добавления - 31.05.2018 в 11:20
pechkin Дата: Четверг, 31.05.2018, 12:54 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 329
Репутация: 49 ±
Замечаний: 0% ±

2003
Всем СПАСИБО! Roman777-Ваш вариант считает по всем критериям с отрицательным знаком, а если критерий отсутствует, то не считает по оставшимся
 
Ответить
СообщениеВсем СПАСИБО! Roman777-Ваш вариант считает по всем критериям с отрицательным знаком, а если критерий отсутствует, то не считает по оставшимся

Автор - pechkin
Дата добавления - 31.05.2018 в 12:54
Roman777 Дата: Четверг, 31.05.2018, 13:45 | Сообщение № 6
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
pechkin,
If Range("A2")<> "" Or Range("B2") <> "" Or Range("C2") <> "" Then

это я Ваше условие и списал) проглядел саму суть задачи) А вот приведение true к целочисленному -1 для меня оказалось сюрпризом))
А так, для сохранения именно условия
считает по оставшимся

можно извратиться:

[vba]
Код
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
[/vba]


Много чего не знаю!!!!
 
Ответить
Сообщениеpechkin,
If Range("A2")<> "" Or Range("B2") <> "" Or Range("C2") <> "" Then

это я Ваше условие и списал) проглядел саму суть задачи) А вот приведение true к целочисленному -1 для меня оказалось сюрпризом))
А так, для сохранения именно условия
считает по оставшимся

можно извратиться:

[vba]
Код
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
[/vba]

Автор - Roman777
Дата добавления - 31.05.2018 в 13:45
pechkin Дата: Четверг, 31.05.2018, 14:40 | Сообщение № 7
Группа: Проверенные
Ранг: Обитатель
Сообщений: 329
Репутация: 49 ±
Замечаний: 0% ±

2003
Спасибо! Кажется работает hands
 
Ответить
СообщениеСпасибо! Кажется работает hands

Автор - pechkin
Дата добавления - 31.05.2018 в 14:40
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Не учитывать критерии подсчета значений (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!