【问题标题】:Userform .setfocus and _Change events用户窗体 .setfocus 和 _Change 事件
【发布时间】:2021-04-18 08:20:46
【问题描述】:

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

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

【问题讨论】:

  • “下拉菜单”是什么意思?不是组合框吗?
  • 这就是我的意思,对不起。
  • 我的回答代码没有解决你的问题吗?你测试了吗?

标签: vba userform setfocus


【解决方案1】:

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 不能正常工作,对于表单控件...

【讨论】:

    猜你喜欢
    • 2022-11-14
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2013-03-09
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多