将焦点设置为子窗体会给出错误2449(表达式中存在无效方法) - VBA - Access 2013

时间:2015-12-10 10:56:48

标签: forms vba ms-access setfocus

----------- --------- UPDATE

我想出了如何关注我的子表单。如果是子表单则:

ParentFormName = frm.Parent.Name
SubFormName = frm.Name

Forms(ParentFormName).Form(SubFormName).SetFocus

这似乎有效(尽管Andre451的帖子更有效)。但是这导致了我的子表单导致挂起状态的潜在问题。我的子表单相对较大(194条记录),当在较大记录的记录集上执行MoveFirst / Last时,我得到错误3021 (no current record)。这可能与子窗体的整个记录​​集没有加载到主窗体的load事件上有关。较小的记录集可以更快地循环,因此不会产生错误(这只是一个假设)。

新的问题是:如何避免3021 error并让子窗体记录完全加载,以便我可以使用以下任一方式来完成它们:

  1. DoCmd.RunCommand acCmdRecordsGoToLast
  2. OR

    1. frm.RecordsetClone.MoveLast
    2. -------------------------------------------- --------------------------------------

      我们将Access数据迁移到仍然使用Access作为前端的SQL服务器。我们通过将SQL Server表与Access链接来实现这一点,这一切都很好(几乎)。但是最近我们遇到了Access查询在SQL服务器上进入suspended state的问题(主要发生在组合框中的查询中)。

      经过一些研究,我们发现这可以通过循环查看表单加载的查询记录来解决(所以通过做一个简单的acCmdRecordsGoToLastacCmdRecordsGoToFirst)这似乎有效。 因此,为了抵消这种暂停状态,我们在每个表单中加载了一个init,它运行recordsourcerowsource(主表单记录源,comboxes行源等)的记录。 / p>

      所以在表单加载:

      modFunctions.InitForm(Me)
      

      这个init在一个模块中,如下所示:

          Dim InitFormResult As Boolean
      
          InitFormResult = InitFormRecordSource(frm)  ' Initialize the recordsource of the form
          InitFormComboBoxes frm          ' Initialize all the comboboxes on the form
          InitFormCommandButton frm       ' Initialize all the buttons on the form
      

      表单RecordSource的第一个init(发生错误的地方)如下所示:

      Public Function InitFormRecordSource(frm As Form) As Boolean
      
          If frm.RecordSource <> "" Then  ' if recordsource found
              On Error GoTo ErrHandler
      
              frm.SetFocus
      
              DoCmd.RunCommand acCmdRecordsGoToLast
              DoCmd.RunCommand acCmdRecordsGoToFirst
      
              GoTo EndSuccess
      
      ErrHandler:
             MsgBox (Err.Number)
              Debug.Print "ERROR during InitFormRecordSource in form : " & frm.Name
              InitFormRecordSource = False
              Exit Function
      EndSuccess:
          InitFormRecordSource = True
      
          Else
              InitFormRecordSource = True
          End If
      End Function 
      

      要使用First和Last来运行表单记录集,它需要具有焦点。这一切都适用于一种形式,但它不适用于主窗体中的子窗体。在子表单中,我们也希望通过运行子表单记录来计算挂起状态,但是在使用上面的代码时,我们会继续获取error 2449

      经过一些研究后,我遇到了这篇文章:Module Function frm.setfocus runtime 2449 error这或多或少是同一个问题。所以我发现一个子表单需要以不同的方式给予它关注,但我所做的所有努力都不会起作用。

      到目前为止我尝试了什么:

      If frm.RecordSource <> "" Then  ' if recordsource found
              On Error GoTo ErrHandler
      
              Dim HasParent As Boolean
              Dim sParentForm
              HasParent = TypeName(frm.Parent.Name) = "String"
      
              If HasParent = True Then 'The form is a subform
                  'sParentForm = frm.Parent
                  'sParentForm.frm.SetFocus
                  'frm.Parent.frm.SetFocus
                  'sParentForm!frm.SetFocus
              Else
                  frm.SetFocus
              End If
      
      
              DoCmd.RunCommand acCmdRecordsGoToLast
              DoCmd.RunCommand acCmdRecordsGoToFirst
      
              GoTo EndSuccess
      

      上面的代码中都注释了尝试过的修复程序。 HasParent确实有效,我可以检查表单是否是子表单(它有一个父表单),并设置焦点不同。

      虽然我似乎无法专注于子窗体,但我不太清楚如何解决这个问题!

1 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,Sql Server 2008 R2上的查询进入“ASYNC_NETWORK_IO”等待状态,直到最后一条记录被加载。

我的解决方案:不要使用表单本身转到最后一条记录,而是.RecordsetClone

frm.RecordsetClone.MoveLast