用户表单 .setfocus 和 _Change 事件

问题描述

我发现自己被困在最小的问题上。

我创建了一个由文本框和下拉菜单组成的用户表单。这个想法是让用户完成文本框,然后点击“保存”,将输入的值粘贴到 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

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

enter image description here

非常感谢您的宝贵帮助!

干杯。

解决方法

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

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

  1. 在顶层表单代码模块区(声明区)声明一个变量:
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 不能正常工作...