Excel ActiveX 组合框显示以前的值问题
Excel ActiveX ComboBox Displays Previous Value Issue
跨页上的嵌入式 ActiveX ComboBox 表单出现问题sheet 其中:
- 更改 ComboBox 中的值后,值会正确更改
但是,当在 sheet 上选择 cell/shape 时,ComboBox 值会在瞬间恢复到之前的值,然后再返回到新值
问题原因:如果在更改 ComboBox 值后按下宏的按钮,则在宏为 运行 时显示旧的 ComboBox 值,而不是新值
问题:有没有办法以编程方式强制执行此事件(在显示新值之前恢复到旧值)?
我已经尝试在 ComboBox 的 Change 事件中使用以下内容,以及在 sheet 上由另一个形状调用的宏中:
- 计算功sheet
- Selecting/Activating一个单元格
- 屏幕更新 = 假,屏幕更新 = 真
进行了更多搜索,发现这个问题 Excel ActiveX Combobox shows previous selection when losing focus 有同样的问题
将从这里开始:
我创建了一个组合框,里面有各种水果作为项目。
我点击了梨。然后是菠萝。然后单击单元格 A1,触发失去焦点事件。
Private Sub ComboBox1_LostFocus()
Debug.Print ComboBox1.Value
Debug.Print ComboBox1.Value
Debug.Print ComboBox1.Value
End Sub
这是我直接 window 中的文字:
菠萝
菠萝
菠萝
这让我认为这是一个渲染问题,而不是值更改,尽管它可能发生得太快以至于我的 debug.print 没有捕捉到它。
有趣的是,如果您从 VBA 内部进行调用,则不会发生闪光:
Sub Main()
ComboBox1.Value = "mango"
Range("A1").Select
End Sub
如果你只是 运行
ComboBox1.Value = "mango"
然后单击工作表和select一个单元格
向 ComboBox 添加了一个 LostFocus
事件,该事件有一行选择了一个单元格。 This removed the "flicker" to the previous value when another cell on the sheet was selected, and also caused the ComboBox value to "flicker" back to the new value after "flickering" to the更改 ComboBox 的值后单击命令按钮时的旧值...
因此这解决了我的问题(主要是 - 无法阻止 "flicker" 通过命令按钮发生在 运行 另一个宏上,但至少该值不会停留在旧的另一个宏运行时的值)
想法来自这个线程:
我有一个解决方案,可以解决这个问题。
我在工作表中插入了一个 ActiveX 标签(在与组合框相同的位置)并将标签 visible
状态设置为 False
。
每次下拉框关闭时,焦点都设置在不可见标签上
首先是一个全局变量。
Public DropDownBegin As Boolean
然后是子程序
Private Sub ComboBox1_DropButtonClick()
DropDownBegin = Not DropDownBegin
If Not DropDownBegin Then
ActiveSheet.Shapes("Label1").OLEFormat.Object.TopLeftCell.Select
End If
End Sub
跨页上的嵌入式 ActiveX ComboBox 表单出现问题sheet 其中:
- 更改 ComboBox 中的值后,值会正确更改
但是,当在 sheet 上选择 cell/shape 时,ComboBox 值会在瞬间恢复到之前的值,然后再返回到新值
问题原因:如果在更改 ComboBox 值后按下宏的按钮,则在宏为 运行 时显示旧的 ComboBox 值,而不是新值
问题:有没有办法以编程方式强制执行此事件(在显示新值之前恢复到旧值)?
我已经尝试在 ComboBox 的 Change 事件中使用以下内容,以及在 sheet 上由另一个形状调用的宏中:
- 计算功sheet
- Selecting/Activating一个单元格
- 屏幕更新 = 假,屏幕更新 = 真
进行了更多搜索,发现这个问题 Excel ActiveX Combobox shows previous selection when losing focus 有同样的问题
将从这里开始:
我创建了一个组合框,里面有各种水果作为项目。
我点击了梨。然后是菠萝。然后单击单元格 A1,触发失去焦点事件。
Private Sub ComboBox1_LostFocus()
Debug.Print ComboBox1.Value
Debug.Print ComboBox1.Value
Debug.Print ComboBox1.Value
End Sub
这是我直接 window 中的文字: 菠萝 菠萝 菠萝
这让我认为这是一个渲染问题,而不是值更改,尽管它可能发生得太快以至于我的 debug.print 没有捕捉到它。
有趣的是,如果您从 VBA 内部进行调用,则不会发生闪光:
Sub Main()
ComboBox1.Value = "mango"
Range("A1").Select
End Sub
如果你只是 运行
ComboBox1.Value = "mango"
然后单击工作表和select一个单元格
向 ComboBox 添加了一个 LostFocus
事件,该事件有一行选择了一个单元格。 This removed the "flicker" to the previous value when another cell on the sheet was selected, and also caused the ComboBox value to "flicker" back to the new value after "flickering" to the更改 ComboBox 的值后单击命令按钮时的旧值...
因此这解决了我的问题(主要是 - 无法阻止 "flicker" 通过命令按钮发生在 运行 另一个宏上,但至少该值不会停留在旧的另一个宏运行时的值)
想法来自这个线程:
我有一个解决方案,可以解决这个问题。
我在工作表中插入了一个 ActiveX 标签(在与组合框相同的位置)并将标签 visible
状态设置为 False
。
每次下拉框关闭时,焦点都设置在不可见标签上
首先是一个全局变量。
Public DropDownBegin As Boolean
然后是子程序
Private Sub ComboBox1_DropButtonClick()
DropDownBegin = Not DropDownBegin
If Not DropDownBegin Then
ActiveSheet.Shapes("Label1").OLEFormat.Object.TopLeftCell.Select
End If
End Sub