【问题标题】:Passing Form Objects to VBA Subs/Functions in MS-Access将表单对象传递给 MS-Access 中的 VBA 子程序/函数
【发布时间】:2010-07-27 14:02:56
【问题描述】:

我有一些选择题应用程序。根据正确答案或错误答案,将出现 4 个绿色复选标记和 4 个红色 x。

它们最初都是不可见的,并且位于表单上的特定位置,因此当它们变得可见时,如果他们在答案旁边找到一个绿色复选标记,那么它就像一个绿色复选标记,旁边是一个红色复选标记如果他们弄错了,他们的答案。

我决定创建一个子过程,它接受三个参数,它们的答案(“A”、“B”、“C”或“D”)、绿色图像参考以使其可见和红色图像参考可见。

不幸的是,我根本无法让他们通过引用。智能感知器知道我指的是什么对象。

Private Sub btnA_Clicked ()
  Question_Answered("A", imgGreenA, imgRedA) 'images referenced from form'
End Sub

Private Sub Question_Answered (strUserAnswer as String, imgGreen as Image, imgRed as Image)
  ...
End Sub

另一个(可能相关的)问题是我无法将表单中的图像分配给 Question_Answered 子中的局部变量,如下所示:

Dim imgGreen as Image
imgGreen = imgGreenA

将 MS-Access 2003 MDB 与 MS-Access 2007 结合使用。

【问题讨论】:

    标签: ms-access vba pass-by-reference


    【解决方案1】:

    使用控件对象调用 VBA 函数确实没有问题。你的函数是用相同的形式还是在某个模块中编写的?

    要分配一个控制变量,你必须使用set,所以它是Set imgGreen = imgGreenA

    【讨论】:

    • subs 在同一个表单的 VBA 代码中。 btnA_Clicked 是 Access 生成的,而 question_answered 子是我自己手写的。
    • 如果是同一种形式,根本不需要传控件,反正那里都可以用!
    • 但他试图将主窗体上不同对象的逻辑处理传递给同一个函数。
    【解决方案2】:

    你试过了吗

    Private Sub Question_Answered (strUserAnswer as String, ByRef imgGreen as Image, ByRef imgRed as Image)
      ...
    End Sub
    

    并且还尝试编写不带括号的调用语句,当事物在/不在括号中时,我遇到了 VBA 不传递引用的问题。例如。

    Private Sub btnA_Clicked ()
      Question_Answered "A", imgGreenA, imgRedA 'images referenced from form'
    End Sub
    

    正如 HansUp 所说,您不需要(或不想)在 Question_Answered 中重新调暗 imgGreen

    【讨论】:

      【解决方案3】:

      由于您没有发布 Question_Answered() 子例程的内容,因此无法说出问题所在,但我首先想到的是您已将图像声明为图像而不是控件.图像实际上永远不会直接在表单上,​​而是封装在图像控件中,因此您将要使用的控件实际上根本不是图像。

      所以:

        Private Sub Question_Answered (ByVal strUserAnswer As String, ByRef imgGreen As Control, ByRef imgRed As Control)
      

      现在,我可能错了,但这是一个开始的地方。

      (另请注意,我明确表示要调用 ByRef 或 ByVal)

      【讨论】:

        【解决方案4】:

        如果调用 sub 时出现错误,

        更改:Question_Answered("A", imgGreenA, imgRedA)

        收件人:Question_Answered strUserAnswer:="A", imgGreen:=imgGreenA, imgRed:=imgRedA

        【讨论】:

        • 不需要添加参数名称——只需删除括号,即 Question_Answered "A", imgGreenA, imgRedA
        【解决方案5】:

        我遇到了同样的问题,我在子界面中使用“作为对象”解决了它。试试这个:

            Private Sub btnA_Clicked ()
               Question_Answered("A", imgGreenA, imgRedA) 'images referenced from form'
            End Sub
        
            Private Sub Question_Answered (strUserAnswer as String, imgGreen as Object, imgRed as Object)
               ...
            End Sub
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多