Ms access 以编程方式创建在Access中打开窗体的按钮

Ms access 以编程方式创建在Access中打开窗体的按钮,ms-access,vba,ms-access-2010,Ms Access,Vba,Ms Access 2010,当我的数据库打开时,它会显示一个带有“加载栏”的表单,在显示“主菜单”表单之前,加载栏会报告链接外部表等的进度。主菜单中有一些代码,这些代码在后台以编程方式生成一个表单,表单上有按钮,完成后保存并重命名表单,并将其作为SourceObject分配给子表单 这一切都很好,也就是说,直到我决定让按钮真正做一些有用的事情。在生成按钮的循环中,它将VBA代码添加到子窗体的待执行模块中。出于某种原因,这样做会使VBA完成执行,然后停止。这使得(模式)加载表单不会消失,因为有一个If语句执行DoCmd.Cl

当我的数据库打开时,它会显示一个带有“加载栏”的表单,在显示“主菜单”表单之前,加载栏会报告链接外部表等的进度。主菜单中有一些代码,这些代码在后台以编程方式生成一个表单,表单上有按钮,完成后保存并重命名表单,并将其作为
SourceObject
分配给子表单

这一切都很好,也就是说,直到我决定让按钮真正做一些有用的事情。在生成按钮的循环中,它将VBA代码添加到子窗体的待执行模块中。出于某种原因,这样做会使VBA完成执行,然后停止。这使得(模式)加载表单不会消失,因为有一个
If
语句执行
DoCmd.Close
以在加载表单完成时关闭加载表单。它还破坏了依赖于所设置的全局变量的功能,因为当执行停止时,会清除全局变量

除了直接放弃访问权和编写真正的代码之外,有没有更好的方法来创建以编程方式完成任务的按钮?尽管我很想这样做,但我不得不在Access中这样做,以防我离开公司,这样技术水平较低的员工在我不在的时候仍然可以使用它

如果需要,下面是相关代码的位和段

表格(u USysSplash):

“在任何处理之前打开表单时运行的代码。
私有子表单_打开(取消为整数)
“不要把不该做的事弄糟。
如果g_数据库_已加载,则
MsgBox“请不要试图直接运行启动窗体。”,vbOKOnly,“禁止触摸”
取消=真
出口接头
如果结束
'检查用户是否安装了MySQL 5.1 ODBC驱动程序。
调用CheckMysqlODBC'使用elfin majykks查找是否安装了Connector/ODBC,并将结果放入g_mysql_installed中
如果没有安装g_mysql_,则
取消=真
DoCmd.OpenForm“Main”
出口接头
如果结束
端接头
'窗体准备好渲染时运行的代码。
私有子表单_当前()
“准备表格
boxProgressBar.width=0
lblLoading.caption=“”
“渲染窗体
DoCmd.SelectObject acForm,Me.name
我,重新油漆
多芬特
"开始工作
链接表
“完成!”
DoCmd.OpenForm“主页”
f_done=True
端接头
私有子窗体_Timer()'计时器属性设置为100
如果f_完成,则DoCmd.Close acForm,Me.name
端接头
表格:

”在显示表单之前运行代码。
专用子表单_加载()
'检查用户是否安装了MySQL 5.1 ODBC驱动程序。
'标题包含错误消息和下载链接
如果没有安装g_mysql_,则
FormHeader.Visible=True
Detail.Visible=False
其他的
FormHeader.Visible=False
Detail.Visible=True
CreateButtonList Me,Me.subTasks
如果结束
端接头
'子按钮在窗体的“详细信息”部分上创建按钮,从顶部的给定高度开始。
子CreateButtonList(ByRef frm作为表单,ByRef buttonPane作为子表单)
将按钮设置为记录集
以新形式作为形式
将新按钮变暗为命令按钮
Dim colCount为整数、rowCount为整数、curCol为整数、curRow为整数
Dim newFormWidth为整数
Dim taskFormName作为字符串,newFormName作为字符串
Set rsButtons=CurrentDb.OpenRecordset(“从USysButtons中选择*格式,如“&frm.name&“””)
如果不是rsButtons.EOF和rsButtons.BOF,则
taskFormName=“USys”&frm.name&“任务”
出错时继续下一步
如果CurrentProject.AllForms(taskFormName)的类型为AccessObject,则
buttonPane.SourceObject=“”
DoCmd.DeleteObject acForm,taskFormName
如果结束
呃,明白了
错误转到0
Set newForm=CreateForm
newFormName=newForm.name
以新形式
.Visible=False
.NavigationButtons=False
.RecordSelectors=False
.CloseButton=False
.ControlBox=False
.width=按钮平面宽度
.HasModule=True
以
移动最后一个按钮
先移动按钮
colCount=Int((按钮平面宽度)/1584)“Twips:1440英寸。1584 twips=1.1“
rowCount=Round(rsButtons.RecordCount/colCount,0)
newForm.Detail.height=行数*1584
curCol=0
curRow=0
不执行rsButtons.EOF
Set newButton=CreateControl(newForm.name,acommandbutton)
纽扣
.name=“gbtn\u”&rsButtons!btn\u name
.Visible=True
.Enabled=True
.caption=rsButtons!caption
.PictureType=2
.Picture=rsButtons!img\u名称
.PictureCoptionArrangement=acBottom
.ControlTiptText=rsButtons!工具提示
.OnClick=“[Event Procedure]”
“这是我头痛的根源。
如果不为IsNull(rsButtons!open\u query)和rsButtons!open\u query“”,则
newForm.Module.InsertLines newForm.Module.countofline_
“专用子gbtn_”&rsButtons!btn_name&“_Click()”
newForm.Module.InsertLines newForm.Module.countofline_
“DoCmd.OpenQuery”“&rsButtons!打开\u查询&”
newForm.Module.InsertLines newForm.Module.countofline_
“末端接头”&vbCrLf&vbCrLf
ElseIf Not IsNull(rsButtons!打开表单)和rsButtons!打开表单“”,则
newForm.Module.InsertLines newForm.Module.countofline_
“专用子gbtn_”&rsButtons!btn_name&“_Click()”
newForm.Module.InsertLines newForm.Module.countofline_
“DoCmd.OpenForm”“”&rsButtons!打开表单&
If Not IsNull(rsButtons!open_query) And rsButtons!open_query <> "" Then
    .OnClick = "=MyOpenForm(""" & rsButtons!open_form & """)"
ElseIf Not IsNull(rsButtons!open_form) And rsButtons!open_form <> "" Then
    .OnClick = "=MyOpenQuery(""" & rsButtons!open_form & """)"
End If
Public Function MyOpenForm(FormName as String)
    DoCmd.OpenForm FormName
End Function

Public Function MyOpenQuery(QueryName as String)
    DoCmd.OpenQuery QueryName
End Function