我在项目中有几个用户表单,每个用户表单都有一个不同的userform名称,但我使用的是对象的统一名称。例如,每个需要使用SQL查询的表单都有一个名为“Team”的对象,并使用相同的查询来提取团队列表。每个表单在其代码中也有相同的查询,并且“with”语句已更改以反映表单名称。我想做的是在一个名为SQL的模块或类似的模块中只有一个查询实例。以下是我目前使用的查询类型的示例。
Sub GetTeams()
Dim Cn As ADODB.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim SQLStr As String
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Server_Name = "SDL02-VM25"
Database_Name = "PIA"
SQLStr = "select distinct[team] from dbo.[Master Staffing List] ORDER BY [team]"
Set Cn = New ADODB.Connection
Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & vbNullString
rs.Open SQLStr, Cn, adOpenStatic
With MasterStaffing.Team
.Clear
Do
.AddItem rs![Team]
rs.MoveNext
Loop Until rs.EOF
End With
rs.Close
Cn.Close
Set rs = Nothing
Set Cn = Nothing
Exit Sub
End Sub
我可以将“With MasterStaffing.Team”替换为可以引用当前活动的任何形式的内容吗?每个使用此查询的表单都会有一个名为Team的对象,因此唯一真正需要更改的是表单引用。可以这样做吗?
答案 0 :(得分:1)
将要加载的控件作为参数传递给常规模块中的sub:
E.g:
LoadTeams Me.Team
Sub被称为:
Sub LoadTeams(ctrl as Object)
Dim Cn As ADODB.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim SQLStr As String
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Server_Name = "SDL02-VM25"
Database_Name = "PIA"
SQLStr = "select distinct[team] from dbo.[Master Staffing List] ORDER BY [team]"
Set Cn = New ADODB.Connection
Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & _
Database_Name & vbNullString
rs.Open SQLStr, Cn, adOpenStatic
With ctrl
.Clear
Do
.AddItem rs![Team]
rs.MoveNext
Loop Until rs.EOF
End With
rs.Close
Cn.Close
Set rs = Nothing
Set Cn = Nothing
End Sub
如果要进一步改进代码,请将数据库连接分解并查询到一个单独的函数,该函数接受SQL字符串并返回打开的记录集。