具有不同初始化的用户窗体加载

Userform load with different initalisation

我目前有一个用户窗体,其中包含按下按钮时加载的日期和时间。当它出现时,它带有已经填写的示例默认值。但是我决定我希望在单击单元格时也加载用户窗体。但是,当单击单元格时,我希望用户窗体显示已填写的日期和时间(基于单元格位置)

到目前为止,我有以下内容: 这是在用户窗体

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

加载用户窗体后,首先它不会执行任何操作,直到我关闭用户窗体,其次它会抛出错误。

本质上,我想根据用户窗体的激活方式为用户窗体提供不同的初始化。我可以只使用两个用户窗体来做完全相同的事情,但是其余代码很长,而且仍然容易更改。

您有两个选择:
1. 将 UserForm_Initialize 中的所有(或大部分)代码移动到 UserForm_Activate。然后它将在您的 .Show 调用后立即发生。
2. 设置调用代码中的值而不是以下形式:

UserForm1.DateBox.Text = CurDate
UserForm1.Show

您不能在用户窗体中使用工作表的局部变量。您需要全局声明它们,您可以在模块中进行声明。

创建一个类似于 "PublicDeclaration" 的新模块名称并在其中放置 public 变量,例如:

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 以及你如何使用它,但我希望你能理解。