Доброй ночи. Прошу помощи. Имеются 2 модуля в EXCEL'евском файле, которые подсчитывают количество ячеек определенного цвета. Брал со стороннего сайта полгода назад. Раз.
[vba]
Код
Function КолЦвет(диапазон As Range, критерий As Range) As Single Application.Volatile True Dim i As Range For Each i In диапазон If i.Interior.Color = критерий.Interior.Color Then КолЦвет = КолЦвет + 1 End If Next End Function
[/vba] и два. [vba]
Код
Function СумЦвет(диапазон As Range, критерий As Range) As Double Application.Volatile True Dim i As Range For Each i In диапазон If i.Interior.Color = критерий.Interior.Color Then СумЦвет = СумЦвет + i.Value End If Next End Function
[/vba] Прописывая в ячейке =КолЦвет(G1:G551;G1) получаю подсчет нужного цвета в необходимом диапазоне. А теперь нужно подсчитать количество этого же цвета, но уже с определенным словом (в этом же диапазоне). Знаю, что можно использовать для подсчёта определенного слова в определенном диапазоне =СЧЁТЕСЛИ(G1:G551;"мираж"). А вот как объединить эти 2 условия: цвет и символ (слово)? Рыскал по форумам, но ничего путного не нашёл. [moder]Коды нужно оформлять тегом #. Спойлер НЕ заменяет этот тег, поправила.[/moder]
Доброй ночи. Прошу помощи. Имеются 2 модуля в EXCEL'евском файле, которые подсчитывают количество ячеек определенного цвета. Брал со стороннего сайта полгода назад. Раз.
[vba]
Код
Function КолЦвет(диапазон As Range, критерий As Range) As Single Application.Volatile True Dim i As Range For Each i In диапазон If i.Interior.Color = критерий.Interior.Color Then КолЦвет = КолЦвет + 1 End If Next End Function
[/vba] и два. [vba]
Код
Function СумЦвет(диапазон As Range, критерий As Range) As Double Application.Volatile True Dim i As Range For Each i In диапазон If i.Interior.Color = критерий.Interior.Color Then СумЦвет = СумЦвет + i.Value End If Next End Function
[/vba] Прописывая в ячейке =КолЦвет(G1:G551;G1) получаю подсчет нужного цвета в необходимом диапазоне. А теперь нужно подсчитать количество этого же цвета, но уже с определенным словом (в этом же диапазоне). Знаю, что можно использовать для подсчёта определенного слова в определенном диапазоне =СЧЁТЕСЛИ(G1:G551;"мираж"). А вот как объединить эти 2 условия: цвет и символ (слово)? Рыскал по форумам, но ничего путного не нашёл. [moder]Коды нужно оформлять тегом #. Спойлер НЕ заменяет этот тег, поправила.[/moder]Cliffe
Сообщение отредактировал Manyasha - Понедельник, 10.08.2015, 11:46
Если нужно проверить только одно условие, которое поместить в ту же ячейку что и цвет [vba]
Код
Function СумЦветЕСЛИ(диапазон As Range, критерий As Range) As Double Application.Volatile True Dim i As Range For Each i In диапазон If i.Interior.Color = критерий.Interior.Color And i.Value = критерий.Value Then СумЦветЕСЛИ = СумЦветЕСЛИ + i.Value End If Next End Function
[/vba]
Если нужно проверить только одно условие, которое поместить в ту же ячейку что и цвет [vba]
Код
Function СумЦветЕСЛИ(диапазон As Range, критерий As Range) As Double Application.Volatile True Dim i As Range For Each i In диапазон If i.Interior.Color = критерий.Interior.Color And i.Value = критерий.Value Then СумЦветЕСЛИ = СумЦветЕСЛИ + i.Value End If Next End Function
Manyasha, это тот, что "код VBA" на панельке, верно? miver, хорошо, если изменю модуль, то в ячейке то что прописывать? =СумЦветЕСЛИ(G1:G551;G1;G1:G551;"мираж") или =СумЦветЕСЛИ(G1:G551;G1;"мираж")? Или вообще что-то другое? [moder]
Цитата
верно?
да. А для формул кнопка fx.[/moder]
Manyasha, это тот, что "код VBA" на панельке, верно? miver, хорошо, если изменю модуль, то в ячейке то что прописывать? =СумЦветЕСЛИ(G1:G551;G1;G1:G551;"мираж") или =СумЦветЕСЛИ(G1:G551;G1;"мираж")? Или вообще что-то другое? [moder]
- не модуль, а код функции (то, что он в модуле - это вторично) В ячейке критерия в этом варианте функции нужно прописать критерий (вот так вот :)), т.е. цвет и слово. А в той, где применяете функцию, ничего менять не нужно. Если хотите слово писать как отдельный параметр функции - можно и так сделать.
- не модуль, а код функции (то, что он в модуле - это вторично) В ячейке критерия в этом варианте функции нужно прописать критерий (вот так вот :)), т.е. цвет и слово. А в той, где применяете функцию, ничего менять не нужно. Если хотите слово писать как отдельный параметр функции - можно и так сделать.
miver, огромное спасибо. То, что доктор прописал! Один момент. Правильно понял, что Ваш модуль (подкорректированный) отвечает за цвет+критерий (слово) и если этот модуль удалить, то я всё равно смогу подсчитывать количество ячеек нужного цвета в диапазоне благодаря модулю с: [vba]
Код
Function КолЦвет(диапазон As Range, критерий As Range) As Single Application.Volatile True Dim i As Range For Each i In диапазон If i.Interior.Color = критерий.Interior.Color Then КолЦвет = КолЦвет + 1 End If Next End Function
[/vba]?
miver, огромное спасибо. То, что доктор прописал! Один момент. Правильно понял, что Ваш модуль (подкорректированный) отвечает за цвет+критерий (слово) и если этот модуль удалить, то я всё равно смогу подсчитывать количество ячеек нужного цвета в диапазоне благодаря модулю с: [vba]
Код
Function КолЦвет(диапазон As Range, критерий As Range) As Single Application.Volatile True Dim i As Range For Each i In диапазон If i.Interior.Color = критерий.Interior.Color Then КолЦвет = КолЦвет + 1 End If Next End Function
Cliffe, У меня прописана функция СумЦветЕСЛИ. Если удалите ее код, то она работать не будет. И она никак не влияет на функцию КолЦвет Кстати, у меня Ваш КолЦвет не работает. Я бы прописал так [vba]
Код
Function КолЦвет(диапазон As Range, критерий As Range) As Single Application.Volatile True Dim i As Range, sum As Long For Each i In диапазон If i.Interior.Color = критерий.Interior.Color Then sum = sum + 1 End If Next КолЦвет = sum End Function
[/vba]
Cliffe, У меня прописана функция СумЦветЕСЛИ. Если удалите ее код, то она работать не будет. И она никак не влияет на функцию КолЦвет Кстати, у меня Ваш КолЦвет не работает. Я бы прописал так [vba]
Код
Function КолЦвет(диапазон As Range, критерий As Range) As Single Application.Volatile True Dim i As Range, sum As Long For Each i In диапазон If i.Interior.Color = критерий.Interior.Color Then sum = sum + 1 End If Next КолЦвет = sum End Function
Кстати, у меня Ваш КолЦвет не работает. Я бы прописал так
У меня до сих пор работает, но перенести в новую ячейку
Код
=КолЦвет(G1:G551;G1)
не удается. Excel видит как простой текст. Странно. Думал, что это баг 10-го офиса, хотя мб это и из-за модуля.. Но понял главное, что каждый модуль отвечает за свою функцию (=КолЦвет, =СумЦветЕСЛИ и т.д., и т.п.). Огромное спасибо ещё раз!
Кстати, у меня Ваш КолЦвет не работает. Я бы прописал так
У меня до сих пор работает, но перенести в новую ячейку
Код
=КолЦвет(G1:G551;G1)
не удается. Excel видит как простой текст. Странно. Думал, что это баг 10-го офиса, хотя мб это и из-за модуля.. Но понял главное, что каждый модуль отвечает за свою функцию (=КолЦвет, =СумЦветЕСЛИ и т.д., и т.п.). Огромное спасибо ещё раз!Cliffe
Но понял главное, что каждый модуль отвечает за свою функцию
Это не так. Функций/процедур в каждом модуле может быть (и бывает обычно) несколько. В терминах ООП, они становятся частью интерфейса/реализации модуля. И вы можете вызывать процедуры из любых модулей, использовав в качестве префикса ИмяМодуля. Другое дело, что есть различные типы модулей-контейнеров (модули каждого листа, всей книги, общие модули кода, модули классов и пользовательских форм), имеющие каждый свои возможности и ограничения. Как правило, пользовательские функции, которые должны быть доступны во всей книге - располагаются в обычных общих модулях. И необязательно разбивать их по отдельным модулям, если это не обусловлено именно вашими требованиями к структуре проекта.
Но понял главное, что каждый модуль отвечает за свою функцию
Это не так. Функций/процедур в каждом модуле может быть (и бывает обычно) несколько. В терминах ООП, они становятся частью интерфейса/реализации модуля. И вы можете вызывать процедуры из любых модулей, использовав в качестве префикса ИмяМодуля. Другое дело, что есть различные типы модулей-контейнеров (модули каждого листа, всей книги, общие модули кода, модули классов и пользовательских форм), имеющие каждый свои возможности и ограничения. Как правило, пользовательские функции, которые должны быть доступны во всей книге - располагаются в обычных общих модулях. И необязательно разбивать их по отдельным модулям, если это не обусловлено именно вашими требованиями к структуре проекта.AndreTM