使用VBA移至MSAccess ADO子窗体中的下一条记录

问题描述 投票:0回答:1

当我尝试通过在MS Access子窗体中使用DoCmd.GotoRecord移至下一条记录时收到错误2105。

。accdb文件中,有一个带有子窗体和模块的MainForm,在SQL Server中有一个简单的表。就这样。

我认为我已尽可能简化了这个问题,如果您想帮助我,可以按照以下三个简单步骤操作:

在SQL Server中:

创建表格并填充一些数据(使用SSMS):

CREATE TABLE ATable (AColumn INT)
INSERT INTO ATable VALUES (6)
INSERT INTO ATable VALUES (126)
INSERT INTO ATable VALUES (210)
INSERT INTO ATable VALUES (11)

在MS Access 2016中

创建一个模块并在其中只写一行:

Public SQLDB As Object

[创建子表单,创建一个OnLoad事件并在其模块中编写此代码:

Dim rsa As Object

Private Sub Form_Load()
  Set rsa = CreateObject("ADODB.Recordset")
End Sub

Public Sub Fill(ByVal sql As String)
  rsa.Open sql, SQLDB
  Set Me.Recordset = rsa
  DoCmd.GoToRecord , , acNext
End Sub

最后,创建一个MainForm,在其上放置一个子窗体控件并绑定到SubForm,创建一个OnLoad事件,并将此代码写入其模块中(当然,您必须将连接字符串更改为您的环境):

Private Sub Form_Load()
  Set SQLDB = CreateObject("ADODB.Connection")
  SQLDB.Open "Driver={SQL Server Native Client 11.0};Server=YourSQLServer;Database=Yourdatabase;Trusted_Connection=yes;"
  SQLDB.CursorLocation = 3 ' adUseClient
  Me.UO.Form.Fill "ATable"
End Sub

当您打开MainForm时,您会在执行DoCmd.GotoRecord,,acNext行时得到错误2105无法转到指定记录

为什么?

[如果您将所有代码都放在Subform中,效果很好,那么我就没有理由仅仅因为SubForm在“子窗体控件中”而不能工作。

如果您还有其他想法如何在子窗体的记录集中前后移动光标,我会很高兴听到。但是,表单记录集是ADO非常重要。

当我尝试通过在MS Access子窗体中使用DoCmd.GotoRecord移至下一条记录时,收到错误2105。在.accdb文件中,有一个带有子窗体和模块的MainForm,并且有一个简单的表...

ms-access access-vba
1个回答
0
投票

我找到了原因。这是因为SubForm控件未在MainForm上处于活动状态(或“集中”)。因此解决方案是在Subform的代码中添加一行:

© www.soinside.com 2019 - 2024. All rights reserved.