2017-10-04 53 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