2017-10-04 86 views
1

我编程一种交叉引用数据库。根据选择或创建的文档名称生成ID。等待,直到用户停止打字的ComboBox运行宏(VBA)

我在标题中提到的组合框作用于改变(后3个字母),检查类似的条目对什么类型的数据库,并显示下降downof匹配的选项。一旦从匹配列表中选取一个条目或创建一个新名称 - 就会生成相应的编号。

由于每个信打后产生的下拉列表中,这需要一段时间来输入你想要的东西。我想在最后更改为运行宏后等待几秒钟。

我如何能做到这一点任何想法?

+0

如何产生的下拉列表?看一看'DoEvents'命令,还可以将'ComboBox'' Change'事件更改为'Exit'事件 – Tom

+0

这将有助于查看您的代码。我怀疑你想要类似于当你开始在谷歌搜索中输入时会发生什么?如果是这种情况,请考虑在用户与该字段进行交互之前(即在表单加载或工作簿打开时),将数据库中的列导入到XML中。您可以更有效地实现下拉选项列表。我以前创建过这样的东西,但我使用了线程。不幸的是,据我所知,你没有选择在VBA – Zac

+0

线程非常类似于谷歌搜索是的。我希望我可以开始一个单独的线程。我的代码很长,我不确定发布它会有助于收集想法。尽管如此,我会把一个简短的伪装起来。我还没有探索过使用.xml并且会做一些研究,但那只会缩短字母之间加载的时间,我想避免一起运行代码。 – EndUserAbuser

回答

0

这有点棘手,因为VBA不支持多线程。但是我们可以使用Application.OnTime事件来触发未来的测试,以测试最后一次按键事件是否至少3秒钟之前。

模块插入:

Option Explicit 

Public LastKeyEvent As Date 
Public Const WaitTimeValue As String = "00:00:03" 'test for key event in 3 seconds 

Public Sub TestKeyEvent() 
    'test if last key event is at least 3 seconds ago. 
    'If so: run your search or message box 
    'If not: do nothing 
    If LastKeyEvent <> 0 And LastKeyEvent + TimeValue(WaitTimeValue) <= Now Then 
     LastKeyEvent = 0 'Ensure this is only triggered once: 
         'If we don't do this and multiple keys are pressed within 1 second 
         'then it would run multiple times. 

     MsgBox "3 seconds without keypress, we can start search" 
     'start your search here (instead of message box) … 
    End If 
End Sub 

现在你可以使用你的文本框更改事件如TextBox1

Private Sub TextBox1_Change() 
    Dim alertTime As Date 

    LastKeyEvent = Now 'remember when the last key event was 
    alertTime = LastKeyEvent + TimeValue(WaitTimeValue) 
    Application.OnTime alertTime, "TestKeyEvent" 'run TestKeyEvent in 3 seconds 
End Sub 

注:
这是一种变通方法,工作2秒或更长时间。但不少于2秒。

+0

YES!我已经测试过,这是完美的Peh,我希望有一天能像你一样聪明。不用多说,谢谢你的快速回答。 – EndUserAbuser

+0

@EndUserAbuser如果它符合您的需求,请将答案标记为“已接受”。这就是我们在这里说“谢谢你”的方式...... :) – CMArg

+0

ha花了我很多时间,但我终于找到了绿色的支票,谢谢你的提示。 – EndUserAbuser

0

另一种再次使用Application.OnTime

用户窗体

Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 
    StartTimer 
End Sub 

模块

Public RunTime As Double 

Public Sub StartTimer() 
    On Error Resume Next 
    Application.OnTime EarliestTime:=RunTime, Procedure:="YourCode", Schedule:=False 
    RunTime = Now() + TimeValue("00:00:03") 
    Application.OnTime RunTime, "YourCode" 
End Sub 

Public Sub YourCode() 
    MsgBox "It's working!" 
End Sub