Передача модуля переменной страницы в пользовательскую форму в VBA

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

Командная строка на Sheet1, которая вызывает сообщение Yes / No / Cancel msgbox, я хочу, чтобы механизм запоминал этот выбор в пользовательских формах и модулях, которые следуют, поэтому я объявил boolNieuweOpdrachtgever как переменную Public, однако в следующей форме строка Debug указывает что он не помнит его ценности вообще. Вот код:

Public boolNieuweOpdrachtgever As Boolean Public Sub nieuw_project_Click() Dim nieuweOpdrachtgever As Variant nieuweOpdrachtgever = MsgBox("Text", vbYesNoCancel) Select Case nieuweOpdrachtgever Case vbYes boolNieuweOpdrachtgever = True Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever nieuweOpdrachtgeverForm.Show Case vbNo boolNieuweOpdrachtgever = False Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever nieuweOpdrachtForm.Show Case Else Exit Sub End Select End Sub 

Например, в случае vbYes он проходит через рабочую форму, после чего переходит во вторую, которая имеет оператор IF, основанный на boolNieuweOpdrachtgever . Однако к тому времени он уже потерял свою ценность. Можете ли вы сказать мне, что я делаю неправильно?

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

Я протестировал различные сценарии, и решение будет заключаться в том, чтобы весь код вводить внутри кода рабочего листа и помещать его в отдельный модуль, а затем вызывать модуль из событий Worksheet, которые запускают ваш код.

В этот момент модуль объявляет общедоступную переменную, и она доступна как общедоступная переменная.

Лист:

 Private Sub SomeValue_Change() 'What would have been your code, now moved to another module Call NewModule End Sub 

Код модуля:

 Option Explicit Public tempValue As String Sub NewModule() 'Code that was previously in the Worksheet Code tempValue = InputBox("Please input the public variable value.","Public Variable") 'You can test it by calling it from here to simplify the process. Call TestValues End Sub 

Другой код: Поместите это в другой модуль. Обратите внимание, что объявления переменной вообще нет. Только в модуле, который содержит «NewModule».

 Sub TestValues() MsgBox("The value from the public variable is :" & tempValue & ".") End Sub 

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

Я попробовал ваш код, и я думаю, что знаю вашу проблему. когда вы приобретаете переменную в своей форме, скажем, форму nieuweOpdrachtgeverForm, тогда вам нужно вызвать модуль и переменную, а не только переменную. Например: Me.Label1.Caption = Module1.boolNieuweOpdrachtgever

Вот код, который я использовал для Sub (в модуле 1), который вызывает кнопка:

 Public boolNieuweOpdrachtgever As Boolean Sub nieuw_project_Click() Dim nieuweOpdrachtgever As Variant nieuweOpdrachtgever = MsgBox("Text", vbYesNoCancel) Select Case nieuweOpdrachtgever Case vbYes boolNieuweOpdrachtgever = True Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever nieuweOpdrachtgeverForm.Show Case vbNo boolNieuweOpdrachtgever = False Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever nieuweOpdrachtForm.Show Case Else Exit Sub End Select End Sub 

Вот код в формах, я использовал для проверки передачи переменной. Обратите внимание, что я добавил ярлык Label1 и поместил результирующее значение в метку:

 Private Sub UserForm_Initialize() Me.Label1.Caption = Module1.boolNieuweOpdrachtgever End Sub 

Вот результаты по формам после выбора «Да» и «Нет»:

Форма, возвращающая false

Форма возвращает true

Sjors – Мне было интересно, был ли мой ответ полезен (я не видел, чтобы проверка была проверена), но я рад, что это так. Чтобы ответить на ваш последний комментарий, я добавил код. Первый бит – это код в Модуле 1, второй – в Листе1, а другой – в Формах (на мой ответ выше). Я бы рекомендовал вам вырезать и вставить код в свой проект и пройти через него (F8), чтобы увидеть, как он работает. Это должно дать вам хорошее базовое понимание того, как делать вызовы между объектами.

Module1:

 Public boolNieuweOpdrachtgever As Boolean Sub nieuw_project_Click() Dim nieuweOpdrachtgever As Variant Dim strFromSheet1 As String nieuweOpdrachtgever = MsgBox("Text", vbYesNoCancel) Select Case nieuweOpdrachtgever Case vbYes boolNieuweOpdrachtgever = True Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever nieuweOpdrachtgeverForm.Show Case vbNo boolNieuweOpdrachtgever = False Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever nieuweOpdrachtForm.Show Case Else Exit Sub End Select Call Sheet1.setString strFromSheet1 = Sheet1.strPublic Call Sheet1.Test(strFromSheet1) End Sub 

Лист1:

 Public strPublic As String Public Sub Test(ByVal strTest As String) MsgBox (strTest) End Sub Public Sub setString() strPublic = "Hello" End Sub 

ПРИМЕР ОДНОЙ ИЗ ФОРМ:

 Private Sub UserForm_Initialize() Me.Label1.Caption = Module1.boolNieuweOpdrachtgever End Sub 
  • Скрыть и отобразить определенные строки в зависимости от выбранного номера.
  • VBA - определение пользовательской формы для последующего вызова
  • Имя пользователя из пользовательской формы
  • Excel VBA Userform, обновить и удалить базу данных,
  • Повторить макрос после ввода UserForm
  • Не удается закрыть пользовательскую форму
  • Очистить каскадный ComboBox при повторном выборе
  • VBA - копировать текст из Combobox в User и вставлять в цикл на листе excel
  • Link Combobox с текстовым полем в vba Excel
  • Как добавить сразу несколько строк данных из UserForm в Excel DataBase
  • Удалите всю строку на основе дубликата в ячейке без той, которая имеет конкретное значение ячейки
  • Interesting Posts

    excel – if () и search (), чтобы вернуть слово следующего слова, которое нужно искать

    код ведет себя по-другому в другой системе

    Зацикливание кода через папку с книгами с VBA?

    Условное форматирование на основе различий в диапазоне?

    VBA ExportAsFixedFormat сохраняет только последнюю активную диаграмму

    Вычислить разницу и сумму два раза и округлить до ближайшего 1/4 часа в десятичном формате

    Использовать пользовательские форматы в новых файлах Excel

    Как только документ попадает в определенный размер, архивируйте и создавайте другой, используя Excel VBA

    Excel сбой при перекрестной фильтрации

    Запустите marko во втором файле Excel

    Сумма Excel основана на автоматическом цвете шрифта

    Запуск / перенос Excel через собственное приложение

    Скопировать условную формулу в ячейки в столбце

    Excel – сравнить две ячейки из разных листов, если истинное значение копии из другой ячейки

    ReDim Preserve с многомерным массивом в Excel VBA

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