Изменить значение переменной publi c, если флажок установлен или не установлен - PullRequest
0 голосов
/ 18 апреля 2020

Я создал UserForm1 и вставил CheckBox1.

Теперь, если пользователь проверяет CheckBox1, я хочу, чтобы public variable, названный CheckBox1_Value, получил значение 1. к этому.
Если Checkbox1 не проверено, переменной должно быть присвоено значение 0.

После этого я хочу запустить второй VBA, который вставляет значение этой переменной в Sheet1.Range("A1").


Я пытался сделать это с помощью следующих кодов:

1) UserForm1:

Public CheckBox1_Value

Private Sub CheckBox1_Click()
If Filter_Data.CheckBox1.Value = True Then
    CheckBox1_Value = 1
    Else
    CheckBox1_Value = 0
    End If
End Sub

2 ) Модуль

Sub Value_of_variable ()
Sheet1.Range("A1").Value = CheckBox1_Value
End Sub

Приведенные выше коды работают без сообщений об ошибках, но значение public variable не вводится в Sheet1.Range("A1"). Ячейка остается пустой, поэтому я предполагаю, что каким-то образом значение не назначено / не извлечено правильно из variable.

Что мне нужно изменить, чтобы оно работало?

Ответы [ 5 ]

1 голос
/ 19 апреля 2020

Чтобы переключить Boolean, вы можете просто сделать что-то вроде ...

CheckBox1.Value = Not CheckBox1.Value 

Нет необходимости в полном выражении If, если это единственное, что вам нужно сделать.

0 голосов
/ 19 апреля 2020

Как уже описано в одном из комментариев, лучшим решением для этого является использование Boolean variable со ссылкой на ответ в на этот вопрос :

1) UserForm1 (Filter_Data ):

Private continue_procedure As Boolean

Private Sub CommandButton1_Click()
If Filter_Data.CheckBox1.Value = True Then
    continue_procedure = True
    Else
    continue_procedure = False
    End If
Unload Me
End Sub

Function check_procedure() As Boolean
Filter_Data.Show
check_procedure = continue_procedure
End Function

2) Модуль

Sub Value_of_variable()
If Filter_Data.check_procedure() = True Then
Sheet1.Range("A1").Value = 1
Else
Sheet1.Range("A1").Value = 0
End If
End Sub

Конечно, это работает только в том случае, если для переменной есть только опция True / False, но в этом случае это то, что должно быть достигнуто с 1 и 0.

0 голосов
/ 18 апреля 2020

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

Option Explicit
' 003

Private Sub CheckBox1_Click()
    Sheet1.Cells(1, "A").Value = CheckBox1.Value
End Sub

Примечания

  1. Вы указываете Sheet1, что не обязательно совпадает с Worksheets("Sheet1"). Если вы упоминаете имя, которое вы (или Excel) дали вкладке, последний способ является правильным.
  2. Код будет записывать значение TRUE или FALSE в ячейку. Для целей Excel это быстрее, чем 0 и 1 (которые, вероятно, придется преобразовать обратно в True и False), но если вы действительно хотите 0 и 1, измените код в процедуре на

Sheet1.Cells(1, "A").Value = IIf(CheckBox1.Value, 1, 0)

Я не предлагаю решение, в котором значение присваивается переменной publi sh, поскольку маловероятно, что вам нужен такой инструмент, если значение уже есть в листе, откуда Вы можете обработать его любым удобным для вас способом. Логически, если вы хотите переменную publi sh, ее запись на лист не обязательна.

0 голосов
/ 18 апреля 2020

Переместите переменную Public из области кода UserForm в любую обычную область кода модуля.

Так, например, в области кода, где находится ваше подпрограмма Value_of_variable(), это будет выглядеть примерно так:

Option Explicit

Public CheckBox1_Value

Sub Value_of_variable()

    With New Filter_Data ' make a new instance of your userform
        .Show ' show the userform
    End With ' terminate the Userform. Any changes made to the Public variable are safely stored in it

    Sheet1.Range("A1").Value = CheckBox1_Value ' write the Public variable in Sheet1

End Sub

И ваш код пользователя Filter_Data будет соответственно:

Option Explicit

Private Sub CheckBox1_Click()
    If Me.CheckBox1.Value Then
        CheckBox1_Value = 1 ' change the Public variable
    Else
        CheckBox1_Value = 0 ' change the Public variable
    End If
End Sub
0 голосов
/ 18 апреля 2020

Value_of_variable не запускается автоматически при выполнении CheckBox1_Click().

Упрощенным решением было бы связать источник данных флажка с этой ячейкой.

Либо добавьте вызов к Value_of_variable в CheckBox1_Click()

Private Sub CheckBox1_Click()
   CheckBox1_Value = SubFilter_Data.CheckBox1.Value
   Value_of_variable
End Sub

и измените Value_of_variable на

Sub Value_of_variable ()
    Sheet1.Range("A1").Value = UserForm1.CheckBox1_Value
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...