Access VBA 循环中如何为序号递增的gblDriver系列全局变量动态赋值
解决方案
VBA 不支持直接通过拼接字符串的方式动态访问变量名,你可以从以下两种方案里选适合你的:
方案1:用Eval函数动态赋值(不需要修改原有全局变量定义)
Access VBA 内置的Eval函数可以执行字符串格式的表达式,你只需要把原代码里的gblDriver1 = strDriver替换成以下代码即可:
' 先转义字符串里的双引号,避免表达式执行出错 strDriver = Replace(strDriver, """", """""") Eval "gblDriver" & i & " = """ & strDriver & """"
如果你的全局变量定义在标准模块里,不需要做其他调整就能直接生效。
方案2:改用数组存储数据(更推荐,后续维护更方便)
你现在用多个独立全局变量的写法扩展性很差,建议直接改成数组类型的全局变量:
- 找到你原来定义全局变量的地方,把原来的
Public gblDriver1 As String、Public gblDriver2 As String这类定义删除,替换成:
' 后面的上限你可以根据自己最大需要的天数调整,比如最多选30天就写30 Public gblDriver(1 To 30) As String
- 然后把原代码里的
gblDriver1 = strDriver直接改成:
gblDriver(i) = strDriver
后续你要调取对应日期的司机数据时,也可以直接用gblDriver(1)、gblDriver(2)这种形式读取,还支持循环遍历处理,比多个独立变量灵活很多。
额外优化建议
你当前的代码里每次循环都重复声明db、rst变量,还重复打开关闭数据库连接,可以把这部分提到循环外面,减少资源消耗:
Private Sub Command95_Click() Dim i As Integer Dim j As Integer Dim oApp As New Outlook.Application Dim oEmail As Outlook.Mailitem Dim strDriver As String Dim rosteredDay As Date Dim strSQL As String ' 把数据库和记录集声明提到循环外 Dim db As DAO.Database Dim rst As DAO.Recordset j = cboNumberOfDays Set db = CurrentDb ' 只打开一次数据库连接 For i = 1 To j rosteredDay = Form.Controls("cboDate" & i).Value strSQL = "SELECT tblRoster.RosterID, tblRoster.DateRoster, tblDriver.Driver " & _ " FROM tblRoster INNER JOIN tblDriver ON tblRoster.RosterID = tblDriver.RosterID " & _ " WHERE (((tblRoster.DateRoster)= #" & Format(rosteredDay, "yyyy-mm-dd") & "#));" Set rst = db.OpenRecordset(strSQL, dbOpenDynaset) If rst.EOF And rst.BOF Then MsgBox "No drivers found for the required date!" Else strDriver = "" Do Until rst.EOF strDriver = strDriver & rst![Driver] & "; " rst.MoveNext Loop ' 这里用你选的方案赋值即可 gblDriver(i) = strDriver End If rst.Close Set rst = Nothing Next i ' 循环结束再关闭数据库 Set db = Nothing End Sub
内容的提问来源于stack exchange,提问作者briggal1
相关产品推荐
相关产品推荐

