Значение глобальной переменной в пользовательской форме не обновляется - PullRequest
0 голосов
/ 20 апреля 2020

Мне нужно определить глобальную переменную x и присвоить значение x в соответствии с выбором пользователя, а затем записать одно и то же значение в две ячейки N2 и J2. N2 происходит внутри пользовательской формы, а J2 - вне пользовательской формы. Сначала я хочу, чтобы у пользователя было всплывающее окно для выбора значения 0,01 или 0,05. Поэтому я использовал userform для этого. Но вместо непосредственного запуска этой пользовательской формы я хотел вызвать пользовательскую форму в модуле vba с именем macro2 (), см. Ниже. В macro2 () я сначала вызываю пользовательскую форму «user1», всплывающее окно покажет пользователю возможность выбрать 0,01 или 0,05. Если мы выберем 0.01, то глобальная переменная "x" будет иметь значение 0.01. Тогда, когда мы запишем переменную x в ячейку N2, N2 будет иметь значение 0,01 (это хорошо). Но после того, как пользовательская форма выйдет и продолжит оставшуюся часть macro2 (), ячейка J2 будет 0 вместо 0,01, хотя x должен иметь значение 0,01.

Это довольно интересно, потому что во второй раз, когда мы выбираем 0,05, N2 будет иметь значение 0,05, но J2 будет нести старое значение х 0,01. Может ли кто-нибудь помочь мне с этим? По сути, мне нужно, чтобы и N2, и J2 имели одно и то же значение x, чтобы я мог вызвать x в более позднем коде для многих других вещей. Спасибо!

Мой код модуля / макроса выглядит следующим образом:

Global x As Double
Sub Macro2()
    Dim frm As user1
    user1.Show vbModeless
    Range("J2").Select
    ActiveCell.FormulaR1C1 = x
End Sub

Код пользовательской формы "user1":

Private Sub OptionButton1_Click()
    Range("N2").Select
    x = 0.01
    ActiveCell.FormulaR1C1 = x
    Me.Hide
End Sub

Private Sub OptionButton2_Click()
    Range("N2").Select
    x = 0.05
    ActiveCell.FormulaR1C1 = x
    Me.Hide
End Sub

Private Sub UserForm_Click()
    ActiveCell.FormulaR1C1 = x
End Sub

1 Ответ

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

Sub Macro2() записывает значение x в Range("J2") при каждом вызове. Вот почему старое значение записывается в J2 при следующем запуске этой подпрограммы.

События OptionButton_Click записывают только x в Range("N2") и затем скрывают форму.

Единственный раз, когда вы что-то пишете в Range("J2"), это когда вы запускаете Macro2, который объясняет ваши интересные результаты.

Использование вашего кода как есть с некоторой модификацией:

В модуле 1:

Global x As Double
Sub Macro2()
    Dim frm As User1
    User1.Show
End Sub

В модуле UserForm:

Private Sub OptionButton1_Click()
    x = 0.01
    With ThisWorkbook.Sheets("Sheet1")
        .Range("N2").Value = x
        .Range("J2").Value = x
    End With
    Me.Hide
End Sub

Private Sub OptionButton2_Click()
    x = 0.05
    With ThisWorkbook.Sheets("Sheet1")
        .Range("N2").Value = x
        .Range("J2").Value = x
    End With
    Me.Hide
End Sub

Это присваивает значение x такое же, как ваше код, основанный на том, что выбрано optionbutton, однако записывает значение x в обе ячейки J2 и N2.

Обратите внимание, что я заменил ссылки на ActiveCell и явно объявил, какой Workbook/Worksheet мы используем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...