Access将宏转换为vba

Access将宏转换为vba,vba,ms-access,ms-access-2016,Vba,Ms Access,Ms Access 2016,在Access 2016交换机上,我将表单后面的宏转换为VBA,但无法编译。我发现的一个创可贴解决方案是将值> /强>添加到 TEMPAR。添加“CurrurtEngType”,ItMeNo.< /强>,并将调用参数和“())< /Stand >的实例更改为调用EVA(参数和())< >。这解决了编译错误 然后,我在交换机上添加了另一个按钮“Reports Menu”(报告菜单),但当我单击新按钮时,出现了此错误 单击“调试”时,它会突出显示这一行TempVars.Add“Switchboa

在Access 2016交换机上,我将表单后面的宏转换为VBA,但无法编译。我发现的一个创可贴解决方案是将<强>值> /强>添加到<强> TEMPAR。添加“CurrurtEngType”,ItMeNo.< /强>,并将<强>调用参数和“())< /Stand >的实例更改为<强>调用EVA(参数和())< <强> >。这解决了编译错误

然后,我在交换机上添加了另一个按钮“Reports Menu”(报告菜单),但当我单击新按钮时,出现了此错误

单击“调试”时,它会突出显示这一行TempVars.Add“SwitchboardID”,Argument。当我将.Value添加到此行的末尾TempVars.Add“SwitchboardID”,Argument.Value时,它解决了断点问题,新按钮可以工作,但现在报告菜单没有正确填充

我可以单击Return To Main(返回主菜单)返回主菜单,主菜单上的所有其他按钮都可以正常工作,但“新建报告”菜单按钮除外

这是总机后面的密码

    Option Compare Database

'------------------------------------------------------------
' Form_Current
'
'------------------------------------------------------------
Private Sub Form_Current()
On Error GoTo Form_Current_Err

  'TempVars.Add "CurrentItemNumber", ItemNumber
  TempVars.Add "CurrentItemNumber", ItemNumber.Value

Form_Current_Exit:
  Exit Sub

Form_Current_Err:
  MsgBox Error$
  Resume Form_Current_Exit

End Sub


'------------------------------------------------------------
' Form_Open
'
'------------------------------------------------------------
Private Sub Form_Open(Cancel As Integer)
On Error GoTo Form_Open_Err

  TempVars.Add "SwitchboardID", DLookup("SwitchboardID", "Switchboard Items", "[ItemNumber] = 0 AND [Argument] = 'Default'")
  DoCmd.SetProperty "Label1", acPropertyCaption, DLookup("ItemText", "Switchboard Items", "[SwitchboardID] = " & TempVars("SwitchboardID"))
  DoCmd.SetProperty "Label2", acPropertyCaption, DLookup("ItemText", "Switchboard Items", "[SwitchboardID] = " & TempVars("SwitchboardID"))
  DoCmd.Requery ""


Form_Open_Exit:
  Exit Sub

Form_Open_Err:
  MsgBox Error$
  Resume Form_Open_Exit

End Sub


'------------------------------------------------------------
' Option1_Click
'
'------------------------------------------------------------
Private Sub Option1_Click()
On Error GoTo Option1_Click_Err

  On Error GoTo 0
  If (Command = 1) Then
    'TempVars.Add "SwitchboardID", Argument
    TempVars.Add "SwitchboardID", Argument.Value
    DoCmd.SetProperty "Label1", acPropertyCaption, DLookup("ItemText", "Switchboard Items", "[SwitchboardID] = " & TempVars("SwitchboardID"))
    DoCmd.SetProperty "Label2", acPropertyCaption, DLookup("ItemText", "Switchboard Items", "[SwitchboardID] = " & TempVars("SwitchboardID"))
    DoCmd.Requery ""
    Exit Sub
  End If
  If (Command = 2) Then
    DoCmd.OpenForm Argument, acNormal, "", "", acAdd, acNormal
    Exit Sub
  End If
  If (Command = 3) Then
    DoCmd.OpenForm Argument, acNormal, "", "", , acNormal
    Exit Sub
  End If
  If (Command = 4) Then
    DoCmd.OpenReport Argument, acViewReport, "", "", acNormal
    Exit Sub
  End If
  If (Command = 5) Then
    DoCmd.RunCommand acCmdSwitchboardManager
    TempVars.Add "SwitchboardID", DLookup("SwitchboardID", "Switchboard Items", "[ItemNumber] = 0 AND [Argument] = 'Default'")
    DoCmd.SetProperty "Label1", acPropertyCaption, DLookup("ItemText", "Switchboard Items", "[SwitchboardID] = " & TempVars("SwitchboardID"))
    DoCmd.SetProperty "Label2", acPropertyCaption, DLookup("ItemText", "Switchboard Items", "[SwitchboardID] = " & TempVars("SwitchboardID"))
    DoCmd.Requery ""
    Exit Sub
  End If
  If (Command = 6) Then
    DoCmd.CloseDatabase
    Exit Sub
  End If
  If (Command = 7) Then
    DoCmd.RunMacro Argument, , ""
    Exit Sub
  End If
  If (Command = 8) Then
    'Call Argument & "()"
    Call Eval(Argument & "()")
    Exit Sub
  End If
  Beep
  MsgBox "Unknown option.", vbOKOnly, ""


Option1_Click_Exit:
  Exit Sub

Option1_Click_Err:
  MsgBox Error$
  Resume Option1_Click_Exit

End Sub


'------------------------------------------------------------
' OptionLabel1_Click
'
'------------------------------------------------------------
Private Sub OptionLabel1_Click()
On Error GoTo OptionLabel1_Click_Err

  On Error GoTo 0
  If (Command = 1) Then
    'TempVars.Add "SwitchboardID", Argument
    TempVars.Add "SwitchboardID", Argument.Value
    DoCmd.SetProperty "Label1", acPropertyCaption, DLookup("ItemText", "Switchboard Items", "[SwitchboardID] = " & TempVars("SwitchboardID"))
    DoCmd.SetProperty "Label2", acPropertyCaption, DLookup("ItemText", "Switchboard Items", "[SwitchboardID] = " & TempVars("SwitchboardID"))
    DoCmd.Requery ""
    Exit Sub
  End If
  If (Command = 2) Then
    DoCmd.OpenForm Argument, acNormal, "", "", acAdd, acNormal
    Exit Sub
  End If
  If (Command = 3) Then
    DoCmd.OpenForm Argument, acNormal, "", "", , acNormal
    Exit Sub
  End If
  If (Command = 4) Then
    DoCmd.OpenReport Argument, acViewReport, "", "", acNormal
    Exit Sub
  End If
  If (Command = 5) Then
    DoCmd.RunCommand acCmdSwitchboardManager
    TempVars.Add "SwitchboardID", DLookup("SwitchboardID", "Switchboard Items", "[ItemNumber] = 0 AND [Argument] = 'Default'")
    DoCmd.SetProperty "Label1", acPropertyCaption, DLookup("ItemText", "Switchboard Items", "[SwitchboardID] = " & TempVars("SwitchboardID"))
    DoCmd.SetProperty "Label2", acPropertyCaption, DLookup("ItemText", "Switchboard Items", "[SwitchboardID] = " & TempVars("SwitchboardID"))
    DoCmd.Requery ""
    Exit Sub
  End If
  If (Command = 6) Then
    DoCmd.CloseDatabase
    Exit Sub
  End If
  If (Command = 7) Then
    DoCmd.RunMacro Argument, , ""
    Exit Sub
  End If
  If (Command = 8) Then
    'Call Argument & "()"
    Call Eval(Argument & "()")
    Exit Sub
  End If
  Beep
  MsgBox "Unknown option.", vbOKOnly, ""


OptionLabel1_Click_Exit:
  Exit Sub

OptionLabel1_Click_Err:
  MsgBox Error$
  Resume OptionLabel1_Click_Exit

End Sub
如有任何建议,将不胜感激


提前感谢。

对您的代码有一些评论:

  • 调用Eval(参数(&“()”)
    没有任何意义。
    调用
    是冗余的
    Eval(Argument&“()”
    是在
    Argument
    中真正调用函数名的部分。请改为尝试
    Application.Run Me.Argument.Value
  • 您应该在代码中完全指定所有控件值。示例:
    Me.Command.Value
    Me.Argument.Value
    Me.ItemNumber.Value
    ,等等
  • 使用:
    Me.Lable1.caption=“caption”代替
    DoCmd.SetProperty“Label1”、acPropertyCaption“caption”
  • 在任何情况下,都不需要使用与
    Label1
    相同的
    DLookup
    功能来设置
    Lable2
    。只需使用
    Me.Label2.Caption=Me.Label1.Caption
  • TempVars.Add“SwitchboardID”,Argument
    不同,编写
    TempVars(“SwitchboardID”)=Me.Argument.Value

  • 这将帮助你实现目标,但我不能保证这会解决你的问题。您必须使用传统的调试方法来找出可能出现的其他问题,并进行修复。

    我非常感谢您的响应,但由于时间限制,我放弃了尝试修复Access 2016生成的代码(当它转换宏时)并从一个旧的数据库中获取代码。我相信这段代码是用Access 2003创建的,但它仍然可以很好地工作(见下文)。每个交换机有8个按钮的限制,但对于大多数应用程序来说应该足够了

    Option Compare Database
    
    Private Sub Form_Open(Cancel As Integer)
    ' Minimize the database window and initialize the form.
    
    ' Move to the switchboard page that is marked as the default.
    Me.Filter = "[ItemNumber] = 0 AND [Argument] = 'Default' "
    Me.FilterOn = True
    
    End Sub
    
    Private Sub Form_Current()
    ' Update the caption and fill in the list of options.
    
    Me.Caption = Nz(Me![ItemText], "")
    FillOptions
    
    End Sub
    
    Private Sub FillOptions()
    ' Fill in the options for this switchboard page.
    
    ' The number of buttons on the form.
    Const conNumButtons = 8
    
    Dim con As Object
    Dim RS As Object
    Dim stSql As String
    Dim intOption As Integer
    
    ' Set the focus to the first button on the form,
    ' and then hide all of the buttons on the form
    ' but the first.  You can't hide the field with the focus.
    Me![Option1].SetFocus
    For intOption = 2 To conNumButtons
        Me("Option" & intOption).Visible = False
        Me("OptionLabel" & intOption).Visible = False
    Next intOption
    
    ' Open the table of Switchboard Items, and find
    ' the first item for this Switchboard Page.
    Set con = Application.CurrentProject.Connection
    stSql = "SELECT * FROM [Switchboard Items]"
    stSql = stSql & " WHERE [ItemNumber] > 0 AND [SwitchboardID]=" & Me![SwitchboardID]
    stSql = stSql & " ORDER BY [ItemNumber];"
    Set RS = CreateObject("ADODB.Recordset")
    RS.Open stSql, con, 1   ' 1 = adOpenKeyset
    
    ' If there are no options for this Switchboard Page,
    ' display a message.  Otherwise, fill the page with the items.
    If (RS.EOF) Then
        Me![OptionLabel1].Caption = "There are no items for this switchboard page"
    Else
        While (Not (RS.EOF))
            Me("Option" & RS![ItemNumber]).Visible = True
            Me("OptionLabel" & RS![ItemNumber]).Visible = True
            Me("OptionLabel" & RS![ItemNumber]).Caption = RS![ItemText]
            RS.MoveNext
        Wend
    End If
    
    ' Close the recordset and the database.
    RS.Close
    Set RS = Nothing
    Set con = Nothing
    
    End Sub
    
    Private Function HandleButtonClick(intBtn As Integer)
    ' This function is called when a button is clicked.
    ' intBtn indicates which button was clicked.
    
    ' Constants for the commands that can be executed.
    Const conCmdGotoSwitchboard = 1
    Const conCmdOpenFormAdd = 2
    Const conCmdOpenFormBrowse = 3
    Const conCmdOpenReport = 4
    Const conCmdCustomizeSwitchboard = 5
    Const conCmdExitApplication = 6
    Const conCmdRunMacro = 7
    Const conCmdRunCode = 8
    Const conCmdOpenPage = 9
    
    ' An error that is special cased.
    Const conErrDoCmdCancelled = 2501
    
    Dim con As Object
    Dim RS As Object
    Dim stSql As String
    
    On Error GoTo HandleButtonClick_Err
    
    ' Find the item in the Switchboard Items table
    ' that corresponds to the button that was clicked.
    Set con = Application.CurrentProject.Connection
    Set RS = CreateObject("ADODB.Recordset")
    stSql = "SELECT * FROM [Switchboard Items] "
    stSql = stSql & "WHERE [SwitchboardID]=" & Me![SwitchboardID] & " AND [ItemNumber]=" & intBtn
    RS.Open stSql, con, 1    ' 1 = adOpenKeyset
    
    ' If no item matches, report the error and exit the function.
    If (RS.EOF) Then
        MsgBox "There was an error reading the Switchboard Items table."
        RS.Close
        Set RS = Nothing
        Set con = Nothing
        Exit Function
    End If
    
    Select Case RS![Command]
    
        ' Go to another switchboard.
        Case conCmdGotoSwitchboard
            Me.Filter = "[ItemNumber] = 0 AND [SwitchboardID]=" & RS![Argument]
    
        ' Open a form in Add mode.
        Case conCmdOpenFormAdd
            DoCmd.OpenForm RS![Argument], , , , acAdd
    
        ' Open a form.
        Case conCmdOpenFormBrowse
            DoCmd.OpenForm RS![Argument]
    
        ' Open a report.
        Case conCmdOpenReport
            DoCmd.OpenReport RS![Argument], acPreview
    
        ' Customize the Switchboard.
        Case conCmdCustomizeSwitchboard
            ' Handle the case where the Switchboard Manager
            ' is not installed (e.g. Minimal Install).
            On Error Resume Next
            Application.Run "ACWZMAIN.sbm_Entry"
            If (Err <> 0) Then MsgBox "Command not available."
            On Error GoTo 0
            ' Update the form.
            Me.Filter = "[ItemNumber] = 0 AND [Argument] = 'Default' "
            Me.Caption = Nz(Me![ItemText], "")
            FillOptions
    
        ' Exit the application.
        Case conCmdExitApplication
            CloseCurrentDatabase
    
        ' Run a macro.
        Case conCmdRunMacro
            DoCmd.RunMacro RS![Argument]
    
        ' Run code.
        Case conCmdRunCode
            Application.Run RS![Argument]
    
        ' Open a Data Access Page
        Case conCmdOpenPage
            DoCmd.OpenDataAccessPage RS![Argument]
    
        ' Any other command is unrecognized.
        Case Else
            MsgBox "Unknown option."
    
    End Select
    
    ' Close the recordset and the database.
    RS.Close
    
    HandleButtonClick_Exit:
    On Error Resume Next
    Set RS = Nothing
    Set con = Nothing
    Exit Function
    
    HandleButtonClick_Err:
    ' If the action was cancelled by the user for
    ' some reason, don't display an error message.
    ' Instead, resume on the next line.
    If (Err = conErrDoCmdCancelled) Then
        Resume Next
    Else
        MsgBox "There was an error executing the command.", vbCritical
        Resume HandleButtonClick_Exit
    End If
    
    End Function
    
    选项比较数据库
    私有子表单_打开(取消为整数)
    '最小化数据库窗口并初始化表单。
    '移动到标记为默认值的交换机页面。
    Me.Filter=“[ItemNumber]=0和[Argument]='Default'”
    Me.FilterOn=正确
    端接头
    私有子表单_当前()
    '更新标题并填写选项列表。
    Me.Caption=Nz(Me![ItemText],“”)
    填充选项
    端接头
    专用子选项()
    '填写此交换机页面的选项。
    '窗体上的按钮数。
    常数conNumButtons=8
    作为对象的Dim con
    将遥感器作为对象
    将stSql设置为字符串
    作为整数的Dim intOption
    '将焦点设置为窗体上的第一个按钮,
    '然后隐藏窗体上的所有按钮
    ”“但是第一个。不能用焦点隐藏字段。
    我[选项1]。设置焦点
    对于输入=2到连接按钮
    Me(“选项”&选项)。可见=假
    Me(“OptionLabel”和intOption)。可见=假
    下一个语调
    '打开交换机项目表,然后查找
    '此交换机页的第一项。
    Set con=Application.CurrentProject.Connection
    stSql=“从[交换机项目]中选择*”
    stSql=stSql&“其中[ItemNumber]>0和[SwitchboardID]=”&Me![开关板ID]
    stSql=stSql&“按[ItemNumber]排序”
    Set RS=CreateObject(“ADODB.Recordset”)
    RS.打开stSql,con,1'1=adOpenKeyset
    '如果此交换机页面没有选项,
    '显示消息。否则,请用项目填充页面。
    如果(RS.EOF)那么
    我[OptionLabel1].Caption=“此交换机页面没有项目”
    其他的
    而(不是(卢比EOF))
    Me(“选项”&RS![ItemNumber])。可见=真
    Me(“OptionLabel”&RS![ItemNumber])。可见=真
    Me(“OptionLabel”&RS![ItemNumber])。说明=RS![项目文本]
    下一个
    温德
    如果结束
    '关闭记录集和数据库。
    RS.Close
    设置RS=无
    设置con=Nothing
    端接头
    专用函数HandleButtonClick(intBtn为整数)
    '单击按钮时调用此函数。
    'intBtn表示单击了哪个按钮。
    '可以执行的命令的常量。
    常数conCmdGotoSwitchboard=1
    常数conCmdOpenFormAdd=2
    Const conCmdOpenFormBrowse=3
    Const conCmdOpenReport=4
    Const concmdescustomizeswitchboard=5
    Const conCmdExitApplication=6
    Const conCmdRunMacro=7
    Const conCmdRunCode=8
    Const conCmdOpenPage=9
    '一个特殊情况下的错误。
    Const conErrDoCmdCancelled=2501
    作为对象的Dim con
    将遥感器作为对象
    将stSql设置为字符串
    错误转到手柄按钮点击错误
    '在交换机项目表中查找项目
    '对应于已单击的按钮。
    Set con=Application.CurrentProject.Connection
    Set RS=CreateObject(“ADODB.Recordset”)
    stSql=“从[交换机项目]中选择*”
    stSql=stSql&“WHERE[SwitchboardID]=”&Me![SwitchboardID]&“和[ItemNumber]=”&intBtn
    RS.打开stSql,con,1'1=adOpenKeyset
    '如果没有匹配的项,请报告错误并退出该函数。
    如果(RS.EOF)那么
    MsgBox“读取交换机项目表时出错。”
    RS.Close
    设置RS=无
    设置con=Nothing
    退出功能
    如果结束
    选择案例![命令]
    “去另一个总机。
    机箱连接开关板
    我