用户表单 .setfocus 和 _Change 事件

Userform .setfocus and _Change events

我创建了一个由文本框和下拉菜单组成的用户窗体。这个想法是让用户完成文本框,然后点击“保存”,将输入的值粘贴到 excel 工作簿中的相应单元格。

由于在下拉菜单中输入的信息会随时间变化,我将文本框的格式设置为在用户最后一次更改该字段时显示。

为此,我在下拉菜单上创建了一个 _CHANGE 事件,并指定如果选择更改,文本框必须应用 = NOW,从而显示日期和时间。这本身就很好用。

初始化USERFORM时出现问题。它的代码包含一个 .SETFOCUS 用于下拉菜单以显示其现有值。 USERFORM_INITIALISE 上的 .SETFOCUS 似乎充当下拉菜单上的 _CHANGE 事件,这导致它在用户实际更改字段之前编辑日期和时间。

我该如何改变它?

Private Sub drop_down_menu_change()
        textbox.Value = Now
End Sub

Private Sub UserForm_Initialize()

drop_down_menu.AddItem "1"
drop_down_menu.AddItem "2"
drop_down_menu.AddItem "3"
drop_down_menu.AddItem "4"
drop_down_menu.AddItem "5"

drop_down_menu.SetFocus

  End Sub

下面是用户表单的截图和代码:

Initialize事件期间,代码添加item时触发Change事件是正常的...

您可以通过创建一个 Boolean 变量来解决这个问题,使事件仅在表单初始化后才起作用。像这样:

  1. 在顶层表单代码模块区(declarations area)声明一个变量:
Private noEvent As Boolean
  1. 在初始化事件中这样使用:
Private Sub UserForm_Initialize()
   noEvent = True

   drop_down_menu.AddItem "1"
   drop_down_menu.AddItem "2"
   drop_down_menu.AddItem "3"
   drop_down_menu.AddItem "4"
   drop_down_menu.AddItem "5"

   drop_down_menu.SetFocus
    
    noEvent = False
End Sub
  1. 并且事件应该转化为:
Private Sub drop_down_menu_change()
   if not noEvent Then textbox.Value = Now
End Sub

不幸的是,对于表单控件,EventsEnabled = False 无法正常工作...