2013-01-07 40 views
0

我遇到了动态分配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被给出了。结果都没有功能,甚至收到变量 - 它是空的!

但为什么然后我的点击事件工作?这个报告实际上没有任何内部过滤,它只是一个显示一些数据的基本报告。

我迷路了。

手动分配事件几乎不是一种选择,因为有这么多。

也许有一种方法可以正确地做到这一点,并找出为什么点击事件甚至工作,如果参数为空?

+0

如果ctl.Name只是一个数字,请尝试'CInt(ctl.Name)'。在你的处理程序assingment中,你在引号之间有'nSekNr'(将它作为字符串发送?)如果删除引号并将'nSekNr'作为整数发送,会发生什么? –

+0

该名称包含一个我也解析的附加标识(“SekButtonA-D”) - 不包括样本中的那个。删除nSekNr的引号不会改变结果。由于某种原因,这个论点没有被赋予该函数。现在我将调查nSekNr变量是否被正确解析。 – IMA

+0

好吧,SekBtNr和它的名字在init函数中被正确解析。此外,事件过程的字符串设置正确。分配参数时出现错误,该参数为空。然而,(静态)字符串sBtnName IS确实给出了正确的。我勒个去。我现在将尝试将完整的ctl.Name赋予该函数,并在MapButtonShowID函数中解析它,而不是在init函数中解析它。 – IMA

回答

0

神秘感解决了,这是一个错字。 对不起,浪费你的时间,但如果有人希望为报表中的某种类型的每个控件动态地分配事件过程,那么该函数将按预期工作。这可能需要Access 2010,虽然

+0

我刚刚在访问2010年做了一个快速测试,原理起作用。然而,如果由于某种原因,你的解析失败并且'nSekNr'为空,你将会得到一个访问对话框,弹出'你输入的表达式OnClick作为事件属性......等等。 –