我遇到了動態分配OnMouseMove事件的問題。access vba:奇怪的行爲分配onMouseMove
在報告中,我有幾百個按鈕,我分配了一個OnClick事件。此事件在呼叫中使用條件WHERE打開另一個報告。 我這樣做是通過提取Button的名稱(包括其號碼),提取該數字並將其作爲參數提供給函數。
這很好,並打開正確的報告。我沒有檢查就認爲這個論點是正確的。
其工作原理如下:
報告的初始化函數我有
For Each ctl In Me.Controls
If ctl.ControlType = acCommandButton Then
nSekNr = ParseNumber(ctl.Name, 6)
ctl.OnClick = "=MapButtonClick('" & sBtnName & "', '" & nSekNr & "')"
[...]
的ParseNumber功能只包括
ParseNumber = Right(ctlName, (Len(ctlName) - z))
然後,我有我的點擊功能如下
Public Function MapButtonClick(ByVal sBtnName As String, ByVal nSekNr As Byte)
DoCmd.Minimize
DoCmd.Close acReport, "repSektion"
DoCmd.OpenReport "repSektion", acViewPreview, , "[SekID] = " & nSekNr
End Function
這可以工作並在我點擊每個按鈕時打開正確的報告。 (是的,我知道一個參數是不需要的,它只是從我嘗試的其他東西的遺留物)
現在我想顯示報告中使用標籤和OnMouseMove按鈕的數量,以便用戶可以在點擊按鈕之前查看部分ID。
問題是,當我複製我的函數時,Access似乎不會將nSekNr變量作爲參數發送。 我通過使用新的功能
Public Function MapButtonShowID(sBtnName As String, nSekNr As Integer)
Me.sekshow.Visible = True
Me.sekshow.Caption = "Sektion: " & sSekNr
End Function
在這sekshow是空標籤做到這一點。 我呼的一下事件的初始化下面這種權利像這樣
For Each ctl In Me.Controls
If ctl.ControlType = acCommandButton Then
nSekNr = ParseNumber(ctl.Name, 6)
ctl.OnClick = "=MapButtonClick('" & sBtnName & "', '" & nSekNr & "')"
ctl.OnMouseMove = "=MapButtonShowId('" & sBtnName & "', '" & nSekNr & "')"
[...]
這給了我一個空的「Sektion:」沒有對報告的數量。
現在開始奇怪的事情: 我檢查了nSekNr是否通過添加一個MsbBox甚至正確地給任何一個函數。我的意思是,如果點擊事件起作用,那是因爲正確的nSekNr被給出了。結果都沒有功能,甚至收到變量 - 它是空的!
但爲什麼然後我的點擊事件工作?這個報告實際上沒有任何內部過濾,它只是一個顯示一些數據的基本報告。
我迷路了。
手動分配事件幾乎不是一種選擇,因爲有這麼多。
也許有一種方法可以正確地做到這一點,並找出爲什麼點擊事件甚至工作,如果參數爲空?
如果ctl.Name只是一個數字,請嘗試'CInt(ctl.Name)'。在你的處理程序assingment中,你在引號之間有'nSekNr'(將它作爲字符串發送?)如果刪除引號並將'nSekNr'作爲整數發送,會發生什麼? –
該名稱包含一個我也解析的附加標識(「SekButtonA-D」) - 不包括樣本中的那個。刪除nSekNr的引號不會改變結果。由於某種原因,這個論點沒有被賦予該函數。現在我將調查nSekNr變量是否被正確解析。 – IMA
好吧,SekBtNr和它的名字在init函數中被正確解析。此外,事件過程的字符串設置正確。分配參數時出現錯誤,該參數爲空。然而,(靜態)字符串sBtnName IS確實給出了正確的。我勒個去。我現在將嘗試將完整的ctl.Name賦予該函數,並在MapButtonShowID函數中解析它,而不是在init函數中解析它。 – IMA