Вызов массива по пользовательской форме Завершение / закрытие VBA

У меня проблема, когда я хотел бы сохранить содержимое пользовательской формы в массиве, когда пользовательская форма закрыта. Я думал, что у меня правильный синтаксис, но, похоже, он не перезаписывается при инициализации userform. Я попытался помещать массив в свой собственный модуль, и это тоже не сработало. Кто-нибудь хочет просветить меня?

Образец кода:

Public Sub DPArrayStuff() Dim DP(2) DP(0) = Block1 DP(1) = Block2 DP(2) = Block3 End Sub Private Sub userform_terminate() If Block1.Value <> vbNullString Then Call DPArrayStuff End Sub Private Sub userform_Initialize() If DP(0) <> vbNUllString Then Block1 = DP(0) Block2 = DP(1) Block3 = DP(2) End If End Sub 

Для пользовательских форм, в частности

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

Если ваши переменные должны выживать только в том случае, если рабочая книга открыта:

Вы можете сохранять переменные после запуска sub, объявляя эту переменную как Public, на уровне модуля, перед объявлением Sub. Например, приведенный ниже код модуля содержит значение i в течение всего рабочего времени, и каждый раз, когда нажимается одна из кнопок, i обрабатывается и сохраняется для дальнейшего использования.

 Public i As Integer Sub Button1_Click() i = i + 1 Range("A1").Value = i End Sub Sub Button2_Click() i = i + 1 Range("A1").Value = i End Sub 

Обратите внимание, что в целом считается хорошей практикой ограничить использование публичных переменных как можно дольше; приклеивание переменных, объявленных на уровне подпрограммы, позволяет пользователю более легко идентифицировать, какие переменные действительно необходимы для запуска кода, особенно потому, что это обычная (хотя и плохая практика) использование переменной в VBA, которая еще не объявлена. Ненужное использование публичных переменных может способствовать лени.

Если вашим переменным необходимо выжить, книга закрывается и открывается:

Если вы хотите хранить данные, подобные этому между открытием и закрытием книги, у вас есть несколько вариантов, чтобы сделать это, чтобы данные не были видны вашим пользователям [по разным причинам]:

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

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

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

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

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

Скрытый рабочий лист легче кодировать, так как вы уже работаете в справочной библиотеке Excel. Запись в базу данных или текстовый файл означает настройку или создание ссылок на соответствующие справочные библиотеки и знание синтаксиса о том, как это делать.

  • Отобразить строку текста в текстовом поле на основе множественного флажка в пользовательской форме
  • Excel VBA Userform
  • Пользовательская форма и несколько изображений
  • Загрузка различных пользовательских форм последовательно
  • Кнопка VBA Options, как подключиться к модулю?
  • не удалось заполнить combobox, используя .rowsource {vba excel}
  • Как загрузить данные в Excel Userform Listbox из формы Access напрямую?
  • Excel - VBA: передать переменную от Sub до Userform
  • VBA Excel 2013: назначение значений массива из другой пользовательской формы
  • Имя пользователя из пользовательской формы
  • Добавление прослушивателя событий к нескольким спискам
  • Давайте будем гением компьютера.