Access将宏转换为vba
在Access 2016交换机上,我将表单后面的宏转换为VBA,但无法编译。我发现的一个创可贴解决方案是将<强>值> /强>添加到<强> TEMPAR。添加“CurrurtEngType”,ItMeNo.< /强>,并将<强>调用参数和“())< /Stand >的实例更改为<强>调用EVA(参数和())< <强> >。这解决了编译错误 然后,我在交换机上添加了另一个按钮“Reports Menu”(报告菜单),但当我单击新按钮时,出现了此错误 单击“调试”时,它会突出显示这一行TempVars.Add“SwitchboardID”,Argument。当我将.Value添加到此行的末尾TempVars.Add“SwitchboardID”,Argument.Value时,它解决了断点问题,新按钮可以工作,但现在报告菜单没有正确填充 我可以单击Return To Main(返回主菜单)返回主菜单,主菜单上的所有其他按钮都可以正常工作,但“新建报告”菜单按钮除外 这是总机后面的密码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
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
退出功能
如果结束
选择案例![命令]
“去另一个总机。
机箱连接开关板
我