MS Access 传递表单功能
MS Access Pass Form Through Function
我正在尝试创建一个功能,让我可以使用各种命令按钮,而不必每次都重新创建代码。
为此,我必须通过函数传递表单名称
函数:
public Function NewRecord(controlForm, focusForm)
focusForm.SetFocus
DoCmd.GoToRecord , , acNewRecord
controlForm.SetFocus
controlForm - 这是类似于 Me 函数的主要形式
focusForm - 这不仅适用于主窗体,而且当我创建子窗体时,我必须将焦点放在子窗体上才能使命令起作用。
为了调用函数,我执行了以下操作:
public sub Command19_Click()
Dim controlForm
Dim focusForm
Set controlForm = Forms![frm_Sales_CustomerProfile]
Set focusForm = Forms![frm_Sales_CustomerProfile]
Call NewRecord(controlForm, focusForm)
End Sub
我收到此错误,指出:编译错误:无效使用 属性。
作为构建自定义菜单栏或功能区的一般规则,您可以像这样编写“形式”中立的代码:
Public 函数 MyDelete(strPrompt 作为字符串,strTable 作为字符串)
Dim strSql As String
Dim f As Form
Set f = Screen.ActiveForm
If MsgBox("Delete this " & strPrompt & " record?", _
vbQuestion + vbYesNoCancel, "Delete?") = vbYes Then
所以请注意我们根本不需要传递表单名称——上面的代码只是将活动屏幕作为变量“f”。
此时您可以像代码在表单中一样执行任何操作。
所以
Me.Refresh (code inside the form)
变成
f.Refresh
所以这里的关键概念是您不需要传递当前活动表单,因为 screenActive 表单无论如何都会让您获得当前表单对象。
然而,对于子表单和“普通”类型的代码,上面的代码会分崩离析,因为 screen.ActiveForm 将 return 主表单,而不是子表单实例。
因此,作为第二种推荐方法,只需始终像这样传递当前上下文表单对象“我”:
Call MySub(me)
你定义你的子类:
Sub MySub(f as form)
现在在这段代码中,我们可以通过使用 "f" 代替 "me"
来引用 "anything"
f.Refresh
因此,如果您使用子表单,只需传递“我”即可。鉴于以上信息,那么您的代码变为:
public sub Command19_Click()
Call NewRecord(me)
End Sub
NewReocrd 变为:
Sub NewRecord(f as form)
现在在你的 newreocrd 代码中,你可以使用“任何东西”形成对象,例如:
f.Name ' get name of the form.
或
City = f.City ' get value of city control
因此传递“整个”表单上下文。
你可以说制作一个例程来显示任何形式的城市值,例如:
呼叫 ShowCity(我, "City")
然后
Sub ShowCity(f 作为表单,strControlToShow 作为字符串)
Msgbox "City value = " & f(strControlToShow)
因此,人们通常会编写适用于任何表单的代码,只需选择当前活动表单即可:
Dim f As Form
Set f = Screen.ActiveForm
注意上面的代码是如何立即获取活动表单的——这是一个好主意,因为如果焦点发生变化,“f”引用将在“通用”例程后面的代码中保持不变被称为 + 以多种形式使用。
然而,由于子表单问题,通常最好始终传递“完整”表单 instance/object :
Call MyNewRecord(me)
然后定义sub为:
Sub MyNewReocord(f as form)
DoCmd.GoToRecord acDataForm, f.Name, acNewRec
结束子
你可以选择在上面添加“焦点”
f.SetFocus
所以对于很多菜单或功能区代码,你不传递表单对象,而只是使用 screen.ActiveForm,你也可以使用 Screen.ActiveControl(同样适用于菜单栏或功能区代码以获取具有焦点的控件)。然而,由于子表单的限制,通常将 "me" 传递给例程将获得类似的结果,如果在某些情况下不是更好的话。
您被困在使用已经在此上下文(表单)中使用的标识符而不是使用强名称(NameOfLibrary.NameOfFunction)。NewRecord
是一个表单 属性,所以Invalid Use Of Property
有道理。如果你使用MyModulName.NewRecord(frm1,frm2)
一切都很好。如果您在模块 òr Class 中使用 NewRecord
,它也可以工作,因为没有 属性 具有相同的名称(我假设;-))。
老实说,我也不使用强名称(数据库或记录集对象除外,因为我也被困在那里,假设 DAO,使用 ADODB),但专业人士建议这样做,现在我们知道为什么了!
您的函数应该只有一个参数,因为如果您需要该表单,它足以仅传递子表单引用 NewRecord(frm as Access.Form)
(注意强名称!)。您可以使用 Set mfrm = frm.Parent
轻松引用主窗体
您的代码;
Public Function FrmNewRecord(frm As Access.Form)
frm.Recordset.AddNew
End Function
Public Sub Command19_Click()
FrmNewRecord(Forms![frm_Sales_CustomerProfile]) ' mainform
FrmNewRecord(Forms![frm_Sales_CustomerProfile]!sfrmControl.Form) ' subform
End Sub
您在代码中两次传递相同的表单,有什么原因吗?如果 Forms[frm_Sales_CustomerProfile]
包含 Command19 使用 Me
。
我删除了 .SetFocus
部分,因为没有必要或有任何理由设置焦点?为什么 NewRecord 是一个函数? return 什么都没有。
顺便说一句:我正在研究一个SubForms(frm)
函数,return是所有子表单的集合。
代码:
'SubForms(frm As Access.Form) returns a collection of all subform references in frm
Public Function SubForms(frm As Access.Form) As VBA.Collection
Dim ctr As Access.Control
Dim sfrm As Access.Form
Dim col As New VBA.Collection
For Each ctr In frm.Controls
If ctr.ControlType = acSubform Then
On Error Resume Next
Set sfrm = ctr.Form
If Err.Number = 0 Then
col.Add sfrm, sfrm.Name
End If
On Error GoTo 0
End If
Next ctr
Set SubForms = col
End Function
我正在尝试创建一个功能,让我可以使用各种命令按钮,而不必每次都重新创建代码。
为此,我必须通过函数传递表单名称
函数:
public Function NewRecord(controlForm, focusForm)
focusForm.SetFocus
DoCmd.GoToRecord , , acNewRecord
controlForm.SetFocus
controlForm - 这是类似于 Me 函数的主要形式
focusForm - 这不仅适用于主窗体,而且当我创建子窗体时,我必须将焦点放在子窗体上才能使命令起作用。
为了调用函数,我执行了以下操作:
public sub Command19_Click()
Dim controlForm
Dim focusForm
Set controlForm = Forms![frm_Sales_CustomerProfile]
Set focusForm = Forms![frm_Sales_CustomerProfile]
Call NewRecord(controlForm, focusForm)
End Sub
我收到此错误,指出:编译错误:无效使用 属性。
作为构建自定义菜单栏或功能区的一般规则,您可以像这样编写“形式”中立的代码:
Public 函数 MyDelete(strPrompt 作为字符串,strTable 作为字符串)
Dim strSql As String
Dim f As Form
Set f = Screen.ActiveForm
If MsgBox("Delete this " & strPrompt & " record?", _
vbQuestion + vbYesNoCancel, "Delete?") = vbYes Then
所以请注意我们根本不需要传递表单名称——上面的代码只是将活动屏幕作为变量“f”。
此时您可以像代码在表单中一样执行任何操作。
所以
Me.Refresh (code inside the form)
变成
f.Refresh
所以这里的关键概念是您不需要传递当前活动表单,因为 screenActive 表单无论如何都会让您获得当前表单对象。
然而,对于子表单和“普通”类型的代码,上面的代码会分崩离析,因为 screen.ActiveForm 将 return 主表单,而不是子表单实例。
因此,作为第二种推荐方法,只需始终像这样传递当前上下文表单对象“我”:
Call MySub(me)
你定义你的子类:
Sub MySub(f as form)
现在在这段代码中,我们可以通过使用 "f" 代替 "me"
来引用 "anything"f.Refresh
因此,如果您使用子表单,只需传递“我”即可。鉴于以上信息,那么您的代码变为:
public sub Command19_Click()
Call NewRecord(me)
End Sub
NewReocrd 变为:
Sub NewRecord(f as form)
现在在你的 newreocrd 代码中,你可以使用“任何东西”形成对象,例如:
f.Name ' get name of the form.
或
City = f.City ' get value of city control
因此传递“整个”表单上下文。
你可以说制作一个例程来显示任何形式的城市值,例如:
呼叫 ShowCity(我, "City")
然后
Sub ShowCity(f 作为表单,strControlToShow 作为字符串)
Msgbox "City value = " & f(strControlToShow)
因此,人们通常会编写适用于任何表单的代码,只需选择当前活动表单即可:
Dim f As Form
Set f = Screen.ActiveForm
注意上面的代码是如何立即获取活动表单的——这是一个好主意,因为如果焦点发生变化,“f”引用将在“通用”例程后面的代码中保持不变被称为 + 以多种形式使用。
然而,由于子表单问题,通常最好始终传递“完整”表单 instance/object :
Call MyNewRecord(me)
然后定义sub为:
Sub MyNewReocord(f as form)
DoCmd.GoToRecord acDataForm, f.Name, acNewRec
结束子
你可以选择在上面添加“焦点”
f.SetFocus
所以对于很多菜单或功能区代码,你不传递表单对象,而只是使用 screen.ActiveForm,你也可以使用 Screen.ActiveControl(同样适用于菜单栏或功能区代码以获取具有焦点的控件)。然而,由于子表单的限制,通常将 "me" 传递给例程将获得类似的结果,如果在某些情况下不是更好的话。
您被困在使用已经在此上下文(表单)中使用的标识符而不是使用强名称(NameOfLibrary.NameOfFunction)。NewRecord
是一个表单 属性,所以Invalid Use Of Property
有道理。如果你使用MyModulName.NewRecord(frm1,frm2)
一切都很好。如果您在模块 òr Class 中使用 NewRecord
,它也可以工作,因为没有 属性 具有相同的名称(我假设;-))。
老实说,我也不使用强名称(数据库或记录集对象除外,因为我也被困在那里,假设 DAO,使用 ADODB),但专业人士建议这样做,现在我们知道为什么了!
您的函数应该只有一个参数,因为如果您需要该表单,它足以仅传递子表单引用 NewRecord(frm as Access.Form)
(注意强名称!)。您可以使用 Set mfrm = frm.Parent
您的代码;
Public Function FrmNewRecord(frm As Access.Form)
frm.Recordset.AddNew
End Function
Public Sub Command19_Click()
FrmNewRecord(Forms![frm_Sales_CustomerProfile]) ' mainform
FrmNewRecord(Forms![frm_Sales_CustomerProfile]!sfrmControl.Form) ' subform
End Sub
您在代码中两次传递相同的表单,有什么原因吗?如果 Forms[frm_Sales_CustomerProfile]
包含 Command19 使用 Me
。
我删除了 .SetFocus
部分,因为没有必要或有任何理由设置焦点?为什么 NewRecord 是一个函数? return 什么都没有。
顺便说一句:我正在研究一个SubForms(frm)
函数,return是所有子表单的集合。
代码:
'SubForms(frm As Access.Form) returns a collection of all subform references in frm
Public Function SubForms(frm As Access.Form) As VBA.Collection
Dim ctr As Access.Control
Dim sfrm As Access.Form
Dim col As New VBA.Collection
For Each ctr In frm.Controls
If ctr.ControlType = acSubform Then
On Error Resume Next
Set sfrm = ctr.Form
If Err.Number = 0 Then
col.Add sfrm, sfrm.Name
End If
On Error GoTo 0
End If
Next ctr
Set SubForms = col
End Function