【问题标题】:Get shape control name from access form to pass value in vba从访问表单获取形状控件名称以在 vba 中传递值
【发布时间】:2017-06-28 22:50:23
【问题描述】:

我在 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 项服务受到监控。当服务被记录为已审核时,形状会从红色变为绿色。团队也希望能够只单击形状并将其带到与其关联的服务。

【问题讨论】:

  • 您使用什么方法将点击处理程序附加到框?
  • 点击时我使用了代码生成器和这行代码,但它正在捕获另一个控件,而不是我点击的内容。 Dim strActiveCtl As String strActiveCtl = Screen.ActiveControl.Name
  • 如果我使用命令按钮而不是形状,我可以使用下面的代码并让它做我想做的事,但也有代码可以改变形状的颜色,这样就不起作用了命令按钮。 Private Sub Box2_Click() Dim strActiveCtl As String strActiveCtl = Replace(Me.ActiveControl.Name, "Box", "") DoCmd.GoToRecord acDataForm, "Form1", acGoTo, [strActiveCtl] End Sub
  • (请用您提供的信息更新您的问题:))
  • 那么你有 500 个函数叫 Box1_Click() ... Box502_Click() 吗?

标签: vba ms-access


【解决方案1】:

我一生都无法想象一个包含 500 多个形状框的表格,每个形状框代表不同的记录。埃加兹。

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

但是,如果这是您必须遵守的设计……您需要了解有关 Access 及其解析活动控件的方式以及单击控件时发生的情况的一些事项。

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

因此,如果您随后单击其他内容...您的形状将失去其作为“活动控件”的状态,而新事物现在将成为新的“活动控件”。

所以没有办法点击一个形状,然后点击其他东西来启动你想要在之前的“活动控件”上执行的代码。 Access 不会记住过去的“活动控件”。

所以这就提出了这样一个问题:“你能做些什么来判断一个控件或形状是否被点击了?”

对您来说幸运(或不幸),当单击形状时,它会检查是否已为其“单击时”属性编写代码。

您放置在表单上的每个形状都将具有其自己的“单击时”属性。这意味着您可以编写一个可以放置在您创建的每个形状中的函数。您可以将调用它的“Box”的编号传递给该函数。

这显然很麻烦。 (这就是我建议使用“子表单”或“列表框”的原因。)但这是获取 500 个框中每个框的不同框号的唯一方法,因为无法启动其他代码,而不会丢失您所在的框的“焦点”。

因此,如果您想继续使用“一个表单上的 500 个形状,每个形状针对不同的记录”...您可以编写一个 VBA 函数,该函数使用一个输入参数调用您的记录,该输入参数告诉“Box”调用它的内容。像这样:

Private Sub subGoToNewRecord(intActiveCtl As Integer)

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

End Sub

然后对于每个形状框你可以写:

Private Sub Box1_Click()
   subGoToNewRecord 1
End Sub

Private Sub Box2_Click()
   subGoToNewRecord 2
End Sub

.
.
.

Private Sub Box502_Click()
   subGoToNewRecord 502
End Sub

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

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

希望对您有所帮助。 :)

【讨论】:

  • abraxascarab - :) 感谢您的反馈。这是让它发挥作用的一种方法。我还在点击下方添加了此代码以使其正常工作,但希望我可以使用通用的东西。我认为它不会像我想要对形状的对象那样工作。 Private Sub Box3_Click() DoCmd.GoToRecord acDataForm, "form1", acGoTo, 3 End Sub
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
相关资源
最近更新 更多