Добавить правила IF с использованием пользовательской формы в excel vba

Я хочу дать пользователю возможность добавить некоторые правила IF в мой код через форму пользователя, а затем запустить программу. Правила – это примерно так:

If Xarray(i,j-1)= "X" and Xarray(i,j+1)= "Y" Then Xarray(i,j)= "Z" 

Если «X», «Y» и «Z» являются текстовыми полями, заполненными пользователем, с использованием пользовательской формы и при нажатии на кнопку «ADD Rule» при нажатии на нее правило будет добавлено в код программно. Позже я могу расширить правила до более сложных правил. Мой вопрос в том, как я могу создать такую ​​процедуру для Excel VBA?

Благодарю.

Вот пример:

у нас есть пользовательская форма, в которой есть три текстовых поля и одна кнопка «Добавить правило» . Я создал этот образец кода:

 Private Sub UserForm_Initialize() Dim LeftCell As String, RightCell As String, CenterCell As String Dim iRule As String UserForm1.Show LeftCell = txtLeft.Text CenterCell = txtCenter.Text RightCell = txtRight.Text iRule = "If " & "Xarr(I, J - 1) = " & LeftCell & " And" & " Xarr(I, J + 1) = " & RightCell & " Then" & Chr(10) & _ " Xarr(I, J) = " & CenterCell & Chr(10) & _ "End If" MsgBox iRule End Sub 

Проблема в том, что я могу использовать iRule (который является строкой) как «оператор IF» в моем основном коде.

Я предлагаю использовать 2D-массив «правил». Когда пользователь добавляет правило, информация, такая как тип правила (равенство, неравенство) и параметры, подлежащие тестированию, будет введена в массив. Наконец, когда выполняется проверка, вы можете использовать параметры внутри оператора if..then внутри цикла для проверки всех элементов массива. Если все правила объединены с ИО, то вы можете установить логическую переменную в false и выйти из цикла. Если вам нужна дополнительная информация или пример кода, отправьте пробный код, над которым я могу работать.

Редактировать с помощью кода:

Я сделал класс, который вы можете использовать для этой цели:

 Option Explicit 'Class Parameters Dim pRules() As Variant 'note the variant data type Dim pCountRules As Long Private Sub class_initialize() pCountRules = 0 End Sub Public Sub AddRule(Parameter As Variant, Condition As Variant) 'note the variant data types If TypeName(Parameter) <> TypeName(Condition) Then 'one possible exception I can think of, handle this here Exit Sub End If If pCountRules = 0 Then pCountRules = 1 ReDim pRules(1 To 2, 1 To 1) pRules(1, 1) = Parameter pRules(2, 1) = Condition Else pCountRules = pCountRules + 1 ReDim Preserve pRules(1 To 2, 1 To pCountRules) pRules(1, pCountRules) = Parameter pRules(2, pCountRules) = Condition End If End Sub Public Sub ResetRules() Erase pRules pCountRules = 0 End Sub Public Function CheckRules() As Boolean Dim i As Integer If pCountRules = 0 Then CheckRules = True 'or false, depends on your logic Else CheckRules = True For i = 1 To pCountRules If pRules(1, i) <> pRules(2, i) Then CheckRules = False Exit For End If Next i End If End Function Private Sub Class_Terminate() Erase pRules End Sub 

Обратите внимание на использование варианта данных. Я избегаю этого, когда могу, вам нужна большая обработка исключений. Если ваш тип данных определен, вы можете изменить его и включить правильную проверку. Я тестировал класс следующим образом:

 Option Explicit Sub test() Dim Rules As clsRules Dim testarr(1 To 1, 1 To 3) As String Dim testparam(1 To 3) As String testarr(1, 1) = "a" testarr(1, 2) = "b" testarr(1, 3) = "c" testparam(1) = "a" testparam(2) = "b" testparam(3) = "c" 'values match Set Rules = New clsRules Rules.AddRule testarr(1, 1), testparam(1) Rules.AddRule testarr(1, 2), testparam(2) Rules.AddRule testarr(1, 3), testparam(3) 'will print true Debug.Print Rules.CheckRules 'change parameter so values do not match testparam(3) = "a" Rules.ResetRules Rules.AddRule testarr(1, 1), testparam(1) Rules.AddRule testarr(1, 2), testparam(2) Rules.AddRule testarr(1, 3), testparam(3) 'will print false Debug.Print Rules.CheckRules 'clean up Erase testarr Erase testparam Set Rules = Nothing End Sub 

Надеюсь, это полезно для вас.

Один из способов, который я могу представить, – создать подпрограмму в новом модуле с вашей строкой (код, который вы хотите выполнить) и запустить эту подпрограмму

  • Как определить, была ли нажата конкретная клавиша?
  • Повторить макрос после ввода UserForm
  • Excel / VBA - ошибка времени выполнения 91 возникает только после ввода и выхода из режима разработки
  • Скрыть закрытую кнопку в пользовательской форме excel vba для моей панели выполнения
  • Откройте документ PDF из выбранного значения в combobox - Userform
  • Код для автоматического обновления Userform
  • Экзамен Excel 2016 VBA активируется, но затем деактивируется
  • Поддержка, необходимая для программирования vba для всплывающего календаря
  • Настройка нескольких значений VBA
  • Автоматическое заполнение столбцов последовательных номеров A в соответствии с количеством строк столбца B
  • Как использовать значение переменной Userform Global Variable в разных книгах с помощью VBA
  • Interesting Posts

    Excel – введите числа, содержащие определенную строку

    Скрипт PowerShell: результат

    Запись переменных в PLC из EXCEL

    Код VBA для импорта нескольких столбцов с одного листа на другой

    Как получить выбранные имена листов в Excel

    Оптимизированный способ добавления нескольких гиперссылок в файл excel с помощью C #

    Регулярное выражение для проверки ячейки Excel

    VBA: ввод данных в combobox работает, но кнопка команды дает ошибку «Недопустимое значение свойства»

    VBA для копирования значений между файлами Excel

    Excel: проверьте, существует ли значение Cell в столбце, а затем получите значение NEXT Cell

    Макрос VBA для таблиц формата Excel особым образом

    Обновите хранимый процесс SAS в Excel с помощью подсказок

    Выпадающий список Excel VBA и проблема vlookup

    Поиск неверно отформатированных адресов электронной почты в файле CSV

    Python – Excel на Linux – есть способ извлечь комментарии и гиперссылки?

    Давайте будем гением компьютера.