Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
28.03.2024, 17:05:54

Войти
На форуме добавлена возможность подписки на RSS-ленты любого раздела форума. Подписаться можно, нажав на иконку RSS , расположенную левее наименования раздела.
33 233 Сообщений в 5 454 Тем от 6 750 Пользователей
Последний пользователь: Alex1210
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  Как в VBA в условии оператора If применить динамически формируемую строку?
Страниц: [1]   Вниз
Печать
Автор Тема: Как в VBA в условии оператора If применить динамически формируемую строку?  (Прочитано 4397 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Goldennick
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 8


Просмотр профиля E-mail
« : 07.06.2021, 22:41:42 »

Добрый день.
Пытаюсь сформировать поисковый запрос на основе динамически выбираемых полей для поиска. Например, поиск может происходить по фамилии, по фамилии + имени, имени + отчеству и в любых других сочетаниях, выбираемых пользователем. Как при сверке значений оператором IF обработать динамически составляемое условие на основе выбора пользователя?
При формировании строки с условием, естественно, получаю значение string, как его теперь использовать в качестве булевой переменной?

Код: (vb)
Option Explicit
Sub module1()
Dim Строка As String
Строка = "Cells(2, 3) = Cells(4, 3) And Cells(2, 4) = Cells(4, 4)" ' Строка может быть такой
' Или такой "Cells(2, 3) = Cells(4, 3)
' Или такой "Cells(2, 3) = Cells(4, 3) And Cells(2, 4) = Cells(4, 4) And Cells(2, 5) = Cells(4, 5)
' в зависимости от критериев отбора
If Строка Then ' Теперь нужно строковое значение использовать в булевой переменной
' и запустить проверку булевого значения
    MsgBox "1"    
End If
' КАК ЭТО СДЕЛАТЬ?
End Sub

Комментарий администратора Коды оформляйте тегами VBCode. п.п. 4.25 Правил форума
« Последнее редактирование: 08.06.2021, 10:12:21 от Дмитрий Щербаков(The_Prist) » Записан
vikttur
Глобальный модератор
Ветеран
*****

Репутация: +124/-0
Офлайн Офлайн

Сообщений: 1 816



Просмотр профиля
« Ответ #1 : 07.06.2021, 23:47:49 »

Можно проверить соответствие строки какому-то условию и вернуть ИСТИНА или ЛОЖЬ. Но как это: строковое значение использовать в булевой переменной?
Записан
Goldennick
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 8


Просмотр профиля E-mail
« Ответ #2 : 08.06.2021, 00:27:29 »

Но как это: строковое значение использовать в булевой переменной?
ХЗ. Вот и пытаюсь выкрутиться. Либо нужно менять логику кода.... наверное.


Можно проверить соответствие строки какому-то условию и вернуть ИСТИНА или ЛОЖЬ. 
По сути, именно это и требуется. Но как проверить соблюдение условий выраженных СТРОКОВОЙ переменной?

If Cells(2, 3) = Cells(4, 3) And Cells(2, 4) = Cells(4, 4) then
...
end if

Вот в таком виде код работает "на ура".
Проблема в том, что вот этот кусок "Cells(2, 3) = Cells(4, 3) And Cells(2, 4) = Cells(4, 4)" формируется в другом месте кода и присваивается строковой переменной "Строка"

If Строка then
...
end if

и вот в таком виде код уже не работает из-за несоответствия типов переменных: Строка as string, а для оператора If требуется boolean
Записан
vikttur
Глобальный модератор
Ветеран
*****

Репутация: +124/-0
Офлайн Офлайн

Сообщений: 1 816



Просмотр профиля
« Ответ #3 : 08.06.2021, 09:36:17 »

как проверить соблюдение условий выраженных СТРОКОВОЙ переменной?
Так и проверить.
Есть условие (или набор условий)  Проверить соответствие строки условию (или каждому из  условий).

Похоже, Вы придумали путь решения и пытаетесь идти по нему, хотя эта дорога кривая, с выбоинами или ведет в тупик... Опишите задачу, которую решаете, покажите пример для демонстрации проблемы.


Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #4 : 08.06.2021, 10:11:28 »

При формировании строки с условием, естественно, получаю значение string
Почему естественно? Вы же можете формировать и что-то другое. Опишите подробнее как происходит формирование самих условий пользователем - тогда можно будет что-то подсказать. Тот же Select Case может быть некоей альтернативой, если знать в какой момент применить.

P.S. Коды оформляйте тегами VBCode. п.п. 4.25 Правил форума
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Goldennick
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 8


Просмотр профиля E-mail
« Ответ #5 : 08.06.2021, 20:31:54 »

Опишите подробнее как происходит формирование самих условий пользователем - тогда можно будет что-то подсказать.

Полный файл в приложении. Задача поставлена себе самостоятельно с целью тренировки:
1.Сформировать таблицу с персональными данными;
2.Осуществить в данной таблице поиск по произвольным данным;
3.Все соответствующие критериям поиска строки скопировать на новый рабочий лист и отсортировать.
Что делать по пп.1 и 3 мне понятно.
А вот по п.2 пока алгоритм поиска сформировать не получилось. Задачу себе усложнил тем, что критерии поиска могут "плавать", т.е. быть разными в зависимости от пожеланий. Например, можем искать по фамилии, по фамилии + имени, по имени + отчеству и в других сочетаниях. В общем виде пока алгоритм поиска вижу следующим образом:
1.Завели поля с эталонными значениями в пользовательской форме;
2.Начинаем перебор строк исходной таблицы;
2.1.Сравниваем текущую строку с набором эталонных значений;
2.2.Если значения совпадают, то копируем текущую строку на новый лист;
3.Переходим к следующей строке.
Затык в сравнении (п2.2.). Если бы набор условий был постоянный, то вопросов бы не было - жестко прописал набор в коде и сравнивал бы по нему. Но, т.к. набор условий составляется динамически, то что делать - не знаю  Улыбка. Как сформировать строку, описывающую сравнение - понятно, а вот как потом эту строку использовать в условии - не получилось.
Либо мы найдем способ в рамках предложенного алгоритма, либо нужно менять всю логику поиска  Улыбка.
Повторю - задача тренировочная, поставлена самим себе с целью наработки опыта. VBA начал осваивать пару месяцев назад, так-то моя специальность далека от программирования  Улыбка.

Забыл добавить: состав полей для поиска определяется группой чек-боксов.
Механизм поиска в фале-примере еще не прописан.
« Последнее редактирование: 08.06.2021, 21:13:59 от Goldennick » Записан
Goldennick
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 8


Просмотр профиля E-mail
« Ответ #6 : 08.06.2021, 23:25:22 »

Обошел несовпадение типов, сделав ход конем  Смеющийся
Выгрузил строковую переменную в виде аргумента к формуле Excel И() в отдельную ячейку и уже в зависимости от истинности ячейки обозначаю факт совпадения искомых значений с текущей строкой.

Код: (vb)

Option Explicit
Sub module2()
Dim Строка As String
Строка = "=И(" & Chr(34) & Cells(2, 3) & Chr(34) & "=" & Chr(34) & Cells(4, 3) & Chr(34) & ";" & Chr(34) & Cells(2, 4) & Chr(34) & "=" & Chr(34) & Cells(4, 4) & Chr(34) & ")"
Cells(1, 1).FormulaLocal = Строка
If Cells(1, 1) Then
    MsgBox "1"
End If
End Sub
Записан
Goldennick
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 8


Просмотр профиля E-mail
« Ответ #7 : 08.06.2021, 23:26:11 »

Но с точки зрения красоты кода, мне такой вариант не нравится  Грустный
Если уважаемым форумчанам еще не лень вникать в мою задачу, то с радостью приму Ваши варианты решения!
« Последнее редактирование: 08.06.2021, 23:28:46 от Goldennick » Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #8 : 09.06.2021, 10:16:15 »

А почему не рассматриваете вариант проверки заданности условий и их корректировку, если они не заданы? Например, так:
Код: (vb)
    Dim sF As String, sI As String, sO As String
    sF = Cells(2, 3)
    sI = Cells(2, 4)
    sO = Cells(2, 5)
    If sF = "" Then sF = "*"
    If sI = "" Then sI = "*"
    If sO = "" Then sO = "*"
    If Cells(4, 3) Like sF And _
       Cells(4, 4) Like sI And _
       Cells(4, 5) Like sO Then
            MsgBox "1"
    End If

Случай частный, чисто под Вашу задачу. Но так делать правильнее. Ведь если не задана Фамилия, но заданы имя и отчество - надо же найти строку с этими ИО, а Ваши вариант этого не делает. Или я неверно понял смысл задачи из первого сообщения?
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Goldennick
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 8


Просмотр профиля E-mail
« Ответ #9 : 09.06.2021, 10:36:33 »


Блин, о таком способе я даже не подумал... Грустный Это же так просто, не задано значение - ищем по маске... А я исключал поиск по пустому значению из условий поиска... и в результате извращался с формированием условий поиска.
Спасибо за идею!

Или я неверно понял смысл задачи из первого сообщения?
Нет, нет, Вы все правильно поняли...
« Последнее редактирование: 09.06.2021, 17:53:11 от vikttur » Записан
Goldennick
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 8


Просмотр профиля E-mail
« Ответ #10 : 15.06.2021, 21:51:24 »

Ведь если не задана Фамилия, но заданы имя и отчество - надо же найти строку с этими ИО, а Ваши вариант этого не делает.

Я шел по другой логике: если Фамилия не задана, то из поискового запроса исключаем поиск по Фамилии (запрос формируем только по Имени и Отчеству). Отдельно планировал оформить проверку полей ФИО на корректность заполнения.
Записан
Goldennick
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 8


Просмотр профиля E-mail
« Ответ #11 : 16.06.2021, 22:51:40 »

Добрый день.
Уважаемые форумчане,  механизм поиска, обозначенный в теме, реализован по алгоритму, предложенному Дмитрием Щербаковым (The_Prist).
Теперь у меня следующая проблема: нужно отсортировать таблицу с результатами поиска по нескольким полям, выбранным произвольным способом. В прилагаемой выдержке кода сортировка произведена по трем жестко прописанным полям. Прошу у общественности помощи: подскажите, пожалуйста, алгоритм сортировки по произвольному набору полей. Выбор полей осуществляется элементами CheckBox пользовательской формы.

Код: (vb)

Sub Поиск_и_сортировка()
    Dim Количество_строчек As Long, Строка As Long, Новая_строка As Long, Диапазон_сортировки As Range
    Dim sF As String, sI As String, sO As String
    Worksheets("Таблица").Activate
    Новая_строка = 3
    sF = UserForm1.TextBox1.Value
    sI = UserForm1.TextBox2.Value
    sO = UserForm1.TextBox3.Value
    If sF = "" Then sF = "*"
    If sI = "" Then sI = "*"
    If sO = "" Then sO = "*"
    Количество_строчек = StringAmount
    For Строка = 3 To Количество_строчек
        If Cells(Строка, 3) Like sF And Cells(Строка, 4) Like sI And Cells(Строка, 5) Like sO Then
            Worksheets("Таблица").Range(Cells(Строка, 3), Cells(Строка, 9)).Copy
            Worksheets("Результаты_Поиска").Cells(Новая_строка, 2).Value = Новая_строка - 2
            Worksheets("Результаты_Поиска").Paste Range(Worksheets("Результаты_Поиска").Cells(Новая_строка, 3), Worksheets("Результаты_Поиска").Cells(Новая_строка, 9))
            Новая_строка = Новая_строка + 1
        End If
    Next
    Worksheets("Результаты_Поиска").Activate
    Set Диапазон_сортировки = Range(Cells(3, 3), Cells(StringAmount, 9))
    With ActiveSheet.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("c3")
        .SortFields.Add Key:=Range("d3")
        .SortFields.Add Key:=Range("e3")
        .SetRange Диапазон_сортировки
        .Apply
    End With
    MsgBox "Поиск и сортировка завершены.", vbOKOnly
    Worksheets("Заглавный").Activate
End Sub
Function StringAmount() As Long 'Функция подсчета количества строк на странице
    Dim Начало_диапазона As Long
    Dim Конец_диапазона As Long
    Dim Количество_строчек As Long
    Начало_диапазона = ActiveSheet.UsedRange.Row
    Конец_диапазона = ActiveSheet.UsedRange.Rows.Count
    Количество_строчек = Начало_диапазона + Конец_диапазона - 1
    StringAmount = Количество_строчек
End Function


Полный файл прилагаю.
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #12 : 17.06.2021, 14:54:55 »

Теперь у меня следующая проблема: нужно отсортировать таблицу
Проблема другая - Вы не ознакомились с правилами форума. Какое отношение какая-то сортировка имеет к этой теме, кроме того, что это Ваша  же тема? Один вопрос - одна тема. Ваш последний вопрос никак не связан с вопросом темы.
Тему закрываю для пресечения дальнейших нарушений.
А Вам надо ознакомиться внимательно с правилами форума, чтобы понять свои дальнейшие действия.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru