#excel #vba #userform
#excel #vba #userform
Вопрос:
В настоящее время у меня есть пользовательская форма с несколькими страницами, так называемыми MultiPage
, и каждая из них MultiPage
имеет Textboxes
, которые будут принимать входные данные от пользователя, и на каждой из этих страниц есть кнопка Back
, Next
и, в частности, кнопка next помогает переносить значения из пользовательской формы в лист Excel под названием "DoNotPrint-Setup"
.
Private Sub btnNext2_Click()
If cbClient = "" Or tbProject.Value = "" Or tbNumber.Value = "" Or tbRevision.Value = "" Or tbDate.Value = "" Or tbPMOC.Value = "" Or tbPMOE.Value = "" Or tbClientE.Value = "" Or tbClientN.Value = "" Or tbClientP.Value = "" Or tbClientSA1.Value = "" Or tbClientSA2.Value = "" Then
If MsgBox("Form is not complete. Do you want to continue?", vbQuestion vbYesNo) <> vbYes Then
Exit Sub
End If
End If
With Sheets("DoNotPrint - Setup")
.Range("C7").Value = Me.cbClient.Text
.Range("C8").Value = Me.tbProject.Text
.Range("C9").Value = Me.tbNumber.Text
.Range("C10").Value = Me.tbRevision.Text
.Range("C11").Value = Me.tbDate.Text
.Range("C12").Value = Me.tbPMOC.Text
.Range("C13").Value = Me.tbPMOE.Text
.Range("C14").Value = Me.tbClientN.Text
.Range("C15").Value = Me.tbClientE.Text
.Range("C16").Value = Me.tbClientP.Text
.Range("C17").Value = Me.tbClientSA1.Text
.Range("C18").Value = Me.tbClientSA2.Text
End With
Me.MultiPage1.Value = 2
ending:
End Sub
Это то, что у меня есть для процесса инициализации файла ниже:
Private Sub UserForm_Initialize()
WizardProp.MultiPage1.Value = 0
Me.MultiPage1.Style = fmTabStyleNone
End Sub
И в конце у меня есть кнопка «Готово», которая скроет пользовательскую форму
Private Sub BtnFinish_Click()
Me.Hide
End Sub
Итак, прямо сейчас он принимает выходные данные из формы пользователя и вводит значения в ячейку Excel, но когда я закрываю файл Excel, текстовые поля формы пользователя при повторном открытии остаются пустыми. Итак, есть ли способ взять значения из ячеек Excel и применить их к текстовым полям Userform при повторном открытии Userform??
Комментарии:
1. Вам просто нужно поменять местами ваши уравнения с события click на событие initialize.
Ответ №1:
Вам нужно будет создать логику для
-
A) Определение того, открываете ли вы новый файл (я рекомендую использовать проверку, чтобы найти последнюю строку в вашем листе данных, поскольку это довольно просто … то есть, если вы используете основной файл, который не содержит значений)
-
Б) После того, как вы установили флажок A, ваша инициализация выполняет одну из двух вещей (подумайте, оператор If): 1) открывается пустым, 2) открывается со значениями
Теперь первая часть B довольно проста, вы это уже поняли; вторая часть будет просто инвертировать ваш оператор With:
With Sheets("DoNotPrint - Setup")
.Range("C7").Value = Me.cbClient.Text
.Range("C8").Value = Me.tbProject.Text
.Range("C9").Value = Me.tbNumber.Text
.Range("C10").Value = Me.tbRevision.Text
.Range("C11").Value = Me.tbDate.Text
.Range("C12").Value = Me.tbPMOC.Text
.Range("C13").Value = Me.tbPMOE.Text
.Range("C14").Value = Me.tbClientN.Text
.Range("C15").Value = Me.tbClientE.Text
.Range("C16").Value = Me.tbClientP.Text
.Range("C17").Value = Me.tbClientSA1.Text
.Range("C18").Value = Me.tbClientSA2.Text
End With
Становится (при внедрении в процедуру инициализации):
With Sheets("DoNotPrint - Setup")
Me.cbClient.Text = .Range("C7").Value
'...
Me.tbClientSA1.Text = .Range("C17").Value
Me.tbClientSA2.Text = .Range("C18").Value
End With
Комментарии:
1. Что касается части A, я не закончил поиск последней строки раньше, поэтому мне нужно будет использовать Range . Найти? excelcampus.com/vba/find-last-row-column-cell
2. @GoldFusion Смотрите: Разбивка последней строки / столбца Рона де Брюина и т.д.
3. Для этого нужен отдельный макрос или его можно привязать к «userform_initialize»?
4. @GoldFusion в вашей инициализируемой пользовательской форме могут быть отдельные строки, включая поиск последней строки, чтобы вы могли сохранять и использовать эту информацию при инициализации формы.