用于更新在不同用户表单中调用的 accdb 记录的多用途模块(使用各自的文本框)
Multi-purpose Module to update accdb records called in different userforms (using respective txtboxs)
我正在创建一个 EXCEL VBA 前端系统来管理通过 ADODB 连接的后端访问 (ACCDB)。
我一直在为每个用户窗体创建一个过程来在我的后端数据库中导入、修改或创建记录,我想整理它并在模块中创建一个过程来调用和命名对象和从哪里获取信息的参数。
像这样:
在模块中:
Sub AddNewRecord(TABLE as string, INPUTFRM as
userform, DBPATH as string, DBPASS as string, SH as worksheet)
Dim rs As ADODB.Recordset
Dim cnn As ADODB.Connection
Dim sql As String
Set cnn = New ADODB.Connection
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DBPATH & ";" &
"Jet OLEDB:Database Password=" & DBPASS
Set rs = New ADODB.Recordset
rs.Open Source:=TABLE, ActiveConnection:=cnn, _
CursorType:=adOpenDynamic, LockType:=adLockOptimistic, _
Options:=adCmdTable
rs.AddNew
For i = 1 to 10
rs(SH.cells(1, i).value) = INPUTFRM.Controls("txtbox" & i).Value
Next i
rs.update
rs.close
cnn.close
Set rs = Nothing
Set cnn = Nothing
End Sub
在我输入数据的用户表单中:
Private Sub cmdAdd_Click()
Call AddNewRecord("ProjectsTable", Me.Name, ThisWorkbook.Path, "Pass1234", "Sheet1")
End Sub
我最大的问题是将值从用户窗体中的文本框传递到模块。在提取不同文本框中的值时,我试图传递要在模块中使用的用户表单名称。
如存储过程的这一部分。
在我的 sheet 的第一行中,我有 10 个字段名称(例如:ID、FirstName、LastName 等)并根据该行更新了相应的字段。
要更新的值将包含在我调用存储过程的 10 个文本框用户窗体中。
For i = 1 to 10
rs(SH.cells(1, i).value) = INPUTFRM.Controls("txtbox" & i).Value
Next i
我想要制作这个存储过程的原因是我将以几种不同的形式使用 SQL 查询,这些查询基于这些形式中的一些输入,如果有一个更清晰、更小的代码会很好.
很抱歉,如果我的示例代码看起来不太清楚,我只是创建了这个示例代码作为我想要执行的示例。
如果你们知道如何传递要在模块中使用的用户窗体对象值,或者甚至知道解决方法,如果您愿意分享,我将不胜感激。
非常感谢,
Access 没有存储过程。它有查询,但查询仅限于一次更新一个 table。所以那部分显然是不可能的。
在 Access 中获得存储 procedure-like 功能(一次更新多个 table )有一种非常 hacky 的方法:使用数据宏。数据宏不是为此目的而设计的,它将使您无法使用 table 您正在以正常方式设置这些宏。但是您可以将 "fake" table 与数据宏一起使用,在插入后更新其他 table,然后删除它自己的内容。
不过,您可以很容易地传递用户表单:
在用户表单中:
Private Sub cmdAdd_Click()
AddNewRecord "ProjectsTable", Me, ThisWorkbook.Path, "Pass1234", "Sheet1"
End Sub
您必须进行调整才能使用实际的数据库路径。
我正在创建一个 EXCEL VBA 前端系统来管理通过 ADODB 连接的后端访问 (ACCDB)。
我一直在为每个用户窗体创建一个过程来在我的后端数据库中导入、修改或创建记录,我想整理它并在模块中创建一个过程来调用和命名对象和从哪里获取信息的参数。
像这样:
在模块中:
Sub AddNewRecord(TABLE as string, INPUTFRM as
userform, DBPATH as string, DBPASS as string, SH as worksheet)
Dim rs As ADODB.Recordset
Dim cnn As ADODB.Connection
Dim sql As String
Set cnn = New ADODB.Connection
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DBPATH & ";" &
"Jet OLEDB:Database Password=" & DBPASS
Set rs = New ADODB.Recordset
rs.Open Source:=TABLE, ActiveConnection:=cnn, _
CursorType:=adOpenDynamic, LockType:=adLockOptimistic, _
Options:=adCmdTable
rs.AddNew
For i = 1 to 10
rs(SH.cells(1, i).value) = INPUTFRM.Controls("txtbox" & i).Value
Next i
rs.update
rs.close
cnn.close
Set rs = Nothing
Set cnn = Nothing
End Sub
在我输入数据的用户表单中:
Private Sub cmdAdd_Click()
Call AddNewRecord("ProjectsTable", Me.Name, ThisWorkbook.Path, "Pass1234", "Sheet1")
End Sub
我最大的问题是将值从用户窗体中的文本框传递到模块。在提取不同文本框中的值时,我试图传递要在模块中使用的用户表单名称。
如存储过程的这一部分。 在我的 sheet 的第一行中,我有 10 个字段名称(例如:ID、FirstName、LastName 等)并根据该行更新了相应的字段。 要更新的值将包含在我调用存储过程的 10 个文本框用户窗体中。
For i = 1 to 10
rs(SH.cells(1, i).value) = INPUTFRM.Controls("txtbox" & i).Value
Next i
我想要制作这个存储过程的原因是我将以几种不同的形式使用 SQL 查询,这些查询基于这些形式中的一些输入,如果有一个更清晰、更小的代码会很好.
很抱歉,如果我的示例代码看起来不太清楚,我只是创建了这个示例代码作为我想要执行的示例。 如果你们知道如何传递要在模块中使用的用户窗体对象值,或者甚至知道解决方法,如果您愿意分享,我将不胜感激。
非常感谢,
Access 没有存储过程。它有查询,但查询仅限于一次更新一个 table。所以那部分显然是不可能的。
在 Access 中获得存储 procedure-like 功能(一次更新多个 table )有一种非常 hacky 的方法:使用数据宏。数据宏不是为此目的而设计的,它将使您无法使用 table 您正在以正常方式设置这些宏。但是您可以将 "fake" table 与数据宏一起使用,在插入后更新其他 table,然后删除它自己的内容。
不过,您可以很容易地传递用户表单:
在用户表单中:
Private Sub cmdAdd_Click()
AddNewRecord "ProjectsTable", Me, ThisWorkbook.Path, "Pass1234", "Sheet1"
End Sub
您必须进行调整才能使用实际的数据库路径。