从访问表单中获取形状控件名称以在vba中传递值

时间:2017-06-27 16:49:00

标签: vba ms-access

我在Access中有一个表单,其中包含500多个形状,每个形状代表一个特定的记录。每个形状的控件名称为Box1,Box2等。在VBA中我试图捕获形状名称,因此如果用户点击名为Box502的形状,例如它将转到记录502.由于它是一个形状,其他方法我已使用不捕获此控件名称。如果我可以捕获名称,我可以从中删除“Box”并获取用于转到该记录的号码。

如果我使用命令按钮而不是形状,我可以使用下面的代码并让它做我想要的,但也有代码改变形状的颜色,这样就不能在命令按钮上工作。

Private Sub Box2_Click() 
   Dim strActiveCtl As String 
   strActiveCtl = Replace(Me.ActiveControl.Name, "Box", "") 
   DoCmd.GoToRecord acDataForm, "Form1", acGoTo, [strActiveCtl] 
End Sub 

如果我在形状上使用这行代码,它会抓住另一个控件,而不是我点击的内容。

点击后我正在使用代码生成器和这行代码,但它正在捕获另一个控件而不是我点击的内容。

Dim strActiveCtl As String 
strActiveCtl = Screen.ActiveControl.Name 

存在这些小盒子的原因是因为它们基本上与被监视的服务有关。大约有550项服务受到监控。当服务被注意到被检查时,形状从红色变为绿色。该团队希望能够只是点击形状,并让他们接受与之相关的服务。

1 个答案:

答案 0 :(得分:0)

我不能为我的生活设想一个有超过500个形状框的表单,每个表单代表不同的记录。 Egads。

但也许你有一个独特的理由这样做。所以我不会质疑这种设计理念,只是说大多数人在尝试识别你正在做的个人记录时会使用“子表格”和“列表框”。通过阅读如何使用这些方法设计表单,您可以节省许多麻烦。 (以及许多其他避免在表单上放置500多个形状框的方法。)

但是,如果这是您必须遵守的设计......您需要了解一些有关Access的信息以及它解析活动控件的方式以及单击控件时会发生什么。

每当您单击控件或形状时,如果您设置了控件属性以便它可以接受“焦点”,则Access会立即使其成为“活动控件”。

所以,如果你再点击其他东西......你的形状会失去它作为“主动控制”的状态,而新的东西现在将成为新的“主动控制”。

因此无法单击某个形状,然后单击其他内容以启动您希望在之前的“活动控件”上执行的代码。 访问不会记住过去的“主动控件”。

因此,这提出了一个问题:“你能做些什么来弄清楚是否点击了控件或形状?”

幸运(或不幸),当点击一个形状时,它会检查代码是否已经为它的“On Click”属性编写。

您在表单上放置的每个形状都将拥有它自己的“On Click”属性。这意味着您可以编写一个可以放置在您创建的每个形状中的函数。您可以向该函数传递称为它的“Box”的数量。

这显然非常麻烦。 (这就是为什么我建议使用“子表格”或“列表框”。)但这是你要捕获500个盒子中每个盒子的盒子号码的唯一方法,因为无法启动其他代码不会丢失你所在的“焦点”。

因此,如果你想继续你的“500个形状在一个Form上,每个寻址不同的记录”...你可以编写一个VBA函数,用一个输入参数来调用你的记录,该参数告诉“Box”调用它。像这样:

Private Sub subGoToNewRecord(intActiveCtl As Integer)

   DoCmd.GoToRecord acDataForm, "Form1", acGoTo, intActiveCtl

End Sub

然后,您可以写下每个Shape Box:

Private Sub Box1_Click()
   subGoToNewRecord 1
End Sub

Private Sub Box2_Click()
   subGoToNewRecord 2
End Sub

.
.
.

Private Sub Box502_Click()
   subGoToNewRecord 502
End Sub

这会让你得到你想要的。 (虽然,某些形状要求您单击形状的轮廓以使其成为“主动控件”。因此,您可能需要使形状边界变粗并告诉用户单击边界线。)

再一次,我不知道你为什么要这样做。我再次建议查看“子表单”是什么,并查看“列表框”是什么。它们更适合帮助您选择所需的记录,然后将其设为“活动记录”。

希望有所帮助。 :)