VBA访问编译错误 - 找不到数据成员 - 如何忽略?

时间:2016-02-01 12:17:56

标签: forms vba ms-access compiler-errors

我在MS Access中的表单中的按钮中有以下代码。问题是有时并非所有“strCTRL”都存在。在某些形式中他们这样做,在某些形式他们没有。整个代码长达900多行,所以我不会发布所有内容。它是一个SQL查询,它引用控件并提取它们的值。

问题来自并非所有控件都存在,然后我收到错误:编译错误:找不到方法或数据成员。

有没有办法绕过编译错误或告诉VBA只有在存在时才编译它?我尝试了If...NothingOn Error Resume Next,但它们似乎没有用。还有其他对象在每个页面上都不存在,而不仅仅是下面的对象。所以...任何想法? = /

Dim strCTRL1 As String
Dim strCTRL2 As String
Dim strCTRL3 As String
Dim strCTRL4 As String
Dim strCTRL5 As String
Dim strCTRL6 As String
Dim strCTRL7 As String
Dim strCTRL8 As String
Dim strCTRL9 As String
Dim strCTRL10 As String
DoCmd.SetWarnings False
On Error Resume Next
strCTRL1 = "[Control Number] = " & Me.Text684.DefaultValue & " "
strCTRL2 = "[Control Number] = " & Me.Label2210.DefaultValue & " "
strCTRL3 = "[Control Number] = " & Me.Label2295.DefaultValue & " "
strCTRL4 = "[Control Number] = " & Me.Label73.DefaultValue & " "
strCTRL5 = "[Control Number] = " & Me.Label160.DefaultValue & " "
strCTRL6 = "[Control Number] = " & Me.Label246.DefaultValue & " "
strCTRL7 = "[Control Number] = " & Me.Label332.DefaultValue & " "
strCTRL8 = "[Control Number] = " & Me.Label417.DefaultValue & " "
strCTRL9 = "[Control Number] = " & Me.Label506.DefaultValue & " "
strCTRL10 = "[Control Number] = " & Me.Text2285.DefaultValue & " "

2 个答案:

答案 0 :(得分:0)

您可以创建标签名称的数组或列表,然后:

Dim LabelName As String
Dim LabelNames As Variant

LabelNames = Array("Text684", "Label2210", ...etc.)
' ...
LabelName = LabelNames(1)
strCTRL1 = "[Control Number] = " & Me(LabelName).DefaultValue & " "

那将编译,当然 - 在运行时因不存在的标签而失败。

答案 1 :(得分:0)

好的,感谢@Gustav,你得到了编译代码,他的建议与On Error Resume Next相结合,可以让代码在任何情况下都能正常运行。

但是没有办法判断你的代码是否正确,因为现在,编译器不会告诉你哪些控件被错误命名或丢失。

相反,我会建议像这样的基于数组的方法:

    Dim Ctl As Access.Control
    Dim CtlValues() As String 
    Dim i as Long

    i = 0
    ReDim CtlValues 1 To Me.Controls.Count 

    For Each Ctl In Me.Controls
        If Ctl.ControlType = acTextBox Then
            i = i + 1
            CtlValues(i) = "[Control Number] = " & CStr(Nz(Ctl.DefaultValue, "Null"))
        End If
    Next

    ReDim Preserve CtlValues 1 To i

这12行代码执行与900行相同的任务(按照您的示例)。此代码将以任何形式工作,无论有多少控件,以及它们的名称。此代码更易于理解和使用。

看看这样的方法是否适用于此。