Загрузка пользовательской формы с различной инициализацией - PullRequest
0 голосов
/ 11 июня 2018

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

Пока у меня есть следующее: Это в пользовательской форме

Private Sub UserForm_Initialize()

'Set Duration Box default value to 1
DurationBox.Value = 1

'Set court one as default
OptionButton1.Value = True

'Set Default (example) Date
DateBox.Text = "Ex 22/05/2001"

'Set Default start time
StartBox.Text = "08:00"

'Set Default Number of weeks
WeeksBox.Text = 1 

В ячейках есть следующее:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim CurDate As String
Dim CurStart As String

If Target.Row > 6 And Target.Row < 21 And Target.Column > 5 And 
Target.Column < 13 Then
    CurRow = ActiveCell.Row
    CurCol = ActiveCell.Column
    CurDate = Cells(5, CurCol).Text
    CurStart = Cells(CurRow, 1).Text
    UserForm1.Show

End If

End Sub

Когда пользовательская форма загружается таким образом, я хочу, чтобы CurDate и CurStart возвращали значения по умолчанию DateBox и StartBox

Однакоесли я просто добавлю:

'Set Default (example) Date
DateBox.Text = CurDate

'Set Default start time
StartBox.Text = CurStart

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

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

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

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

Создайте новое имя модуля, например, «PublicDeclaration», и поместите туда публичные переменные, например:

Public NumOfWeeks as long
Public curStart as date
Public curDate as date
Public SelectionChange as boolean

В листе с выборомизмените использование глобальной переменной SelectionChange

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Row > 6 And Target.Row < 21 And Target.Column > 5 And 
Target.Column < 13 Then
    SelectionChange = true
    CurRow = ActiveCell.Row
    CurCol = ActiveCell.Column
    CurDate = Cells(5, CurCol).Text
    CurStart = Cells(CurRow, 1).Text
    UserForm1.Show

End If

End Sub

, а затем используйте эти переменные в пользовательской форме и в Worksheet_SelectionChange

Private Sub UserForm_Initialize()
   if SelectionChange = false then
      'Set Duration Box default value to 1
      DurationBox.Value = 1

      'Set court one as default
      OptionButton1.Value = True

      'Set Default (example) Date
      DateBox.Text = "Ex 22/05/2001"

      'Set Default start time
      StartBox.Text = "08:00"

      'Set Default Number of weeks
      WeeksBox.Text = 1
   else
      DateBox.Text = curStart
      WeeksBox.Text = NumOfWeeks 

и т. д.

Я просто не уверен вNumOfWeeks curCol curRow и как вы работаете с этим, но я надеюсь, что вы поняли идею.

0 голосов
/ 11 июня 2018

У вас есть два варианта:
1. Переместить весь (или большую часть) вашего кода в UserForm_Initialize в UserForm_Activate.Тогда это произойдет сразу после вашего .Show вызова.
2. Установите значения из вашего кода вызова, а не в форме:

UserForm1.DateBox.Text = CurDate
UserForm1.Show
...