我正在使用艾伦·布朗(Allen Browne)出色的代码(http://allenbrowne.com/ser-35.html)在点击事件中打开表单的多个实例。我了解到,新实例是只读的,由于这篇文章(Access 2007 / VBA - Multiple Instances of Form, Update controls on specific instance from Module),我设法记录了用户输入的数据并保持了日志记录。
我在每种表单上都有几个组合框,并且希望根据其他用户的选择(对于每种表单,不在表单之间)来更新/重新查询其中显示的内容。例如,用户选择cmb1上的组件A,cmb2仅显示组件A的可能故障。
{me.Requery}将仅且始终在Forms类中重新查询该表单(从数据库窗口/导航窗格中打开的表单,如果有的话,不是下面的clnClient集合上的实例)。但是,我可以使用“ Me”传递信息并检索日志记录的值。
使用来自Allen Browne的经过稍微修改的OpenAClient版本以及来自MajP的输入(在这个伟大的话题https://www.tek-tips.com/viewthread.cfm?qid=1753790中)
Public clnClient As New Collection
Public Function OpenAClient(FormName As String, Optional inputCaption As String = "") As Form_f_myForm
'Purpose: Open an independent instance of form f_myForm
On Error GoTo Err_OpenAClient
Dim frm As Form
'Open a new instance, show it, and set a caption.
Set frm = New Form_f_myForm
frm.Visible = True
frm.Caption = inputCaption
frm.Tag = FormName
'Append it to our collection.
clnClient.Add Item:=frm, Key:=FormName
Set OpenAClient = frm
Set frm = Nothing
Exit Function
Err_OpenAClient:
If Err.Number = 457 Then
MsgBox "A Form with this name already exists."
Else
MsgBox Err.Number & " " & Err.Description
End If
End Function
我尝试过
Public ActiveForm As Form_f_myform
Set activeForm = OpenAClient("ExampleForm","Example caption")
或简单
Set activeForm = clnClient.Item(2) 'just to test the second instance
,然后使用ActiveForm代替“ Me”并以这种方式进行操作,但它似乎不起作用。任何想法/帮助将不胜感激。或以不同方式解决此问题的想法。谢谢!
有点背景。我是VBA和Access的新手,正在使用数据库(Access Office365)进行故障报告。已预先评估所有故障,然后才交付给用户。用户将识别出故障的特定组件,并相应地填写表格(日期,故障类型等)。他们将不会更改包含预评估的表格。一切都很好并且可以正常工作。问题是在添加用户报告多个故障的功能时。
答案 0 :(得分:0)
首先,让我们清除一些误解:
我知道新实例是只读的...
它们确实可以读写。它们只是不能附加到同一查询。这样做的原因是,当打开多个Forms!f_myform!cmb1
实例时,像f_myform
这样的查询表达式不起作用。您必须为每个实例的记录源构造自定义SQL,以获得真正的独立操作。
{Me.Requery}将仅并且始终在Forms类中重新查询表单...
在窗体的代码中使用时,Me.Requery
实际上只会重新查询该窗体的实例。当表单的所有实例共享同一查询时,就会出现问题。原因和解决方法如上。
就编码策略而言,摆脱全局Public ActiveForm As Form_f_myform
。那只是解决问题的方法。
表单实例本身包含了使代码正常工作所需的一切。尝试使用表单引用本身调用函数(就像您之前所做的那样)。例如:
Public Sub ShowComponentFailures(thisForm As Form_f_myform)
Dim varCompID As Variant
Dim strSQL As String
' get Component ID from given instance's cmb1
varCompID = thisForm.cmb1.Value
' create SQL to retrieve possible failures for CompID
strSQL = GetComponentFailuresSQL(varCompID)
' set cmb2's record source to SQL
thisForm.cmb2.RowSource = strSQL
End Sub
答案 1 :(得分:0)
非常感谢@kismert提供解决方案和提示!!我现在已经尝试过,并且可以像您提到的那样工作。 (我必须在Access版本中使用.RowSource而不是.RecordSource。)