系统:Windows 7
软件:Excel 2010 / Access 2010
- 这个系列开展一个新的篇章,主体使用Access,包括数据库部分及界面部分,当然输出部分也会涉及到Excel,Excel的可读性还是比较好的
- 本公众号的不同阶段:Excel -> Excel + Access -> Access。但并不表示Access就一定比Excel好啊,各有所长吧,合适才是最好的
- 主体框架:换一种讲解方式,以项目为基础,从开始到结束
- 项目名称:培训管理系统
- 主要功能:两个界面。界面1,培训时录入信息;界面2,以培训老师和培训学员为客户,输出信息
- 涉及知识:Access界面,数据库知识,VBA,SQL,Excel
Part 1:本篇目标
- 之前介绍了界面及数据库部分
- 今天继续上一篇的内容,介绍下拉列表实现

Part 2:代码整体逻辑建立
- 本窗体中,有两个组合框,分别获取其对应的rs(Recordset)
- 窗体中显示对应的rs
入口Sub
Sub sMod_sr_02_下拉列表(frmName)
Rem>>
Rem>>
Dim arr
Dim tblName
Dim dbAddr
Dim i
Dim fild
Dim searchC
Dim SQL
Dim ctrlName
Dim mode
Dim rsAdConn
Dim rs
Dim adConn
arr = Array("培训课程名称", "培训老师")
tblName = "01_常数项"
dbAddr = fMod_dz_01_数据库地址
For i = 0 To UBound(arr) Step 1
fild = arr(i)
searchC = fild & " is Not Null"
SQL = "Select distinct " & fild & " From " & tblName & " Where (" & searchC & " )"
ctrlName = fild
mode = 2
rsAdConn = fMod_tyk_01_rs产生(dbAddr, SQL, mode)
Set rs = rsAdConn(0) ' 注意:必须有set
Set adConn = rsAdConn(1)
Call sMod_tyk_02_组合框下拉列表(rs, adConn, frmName, ctrlName)
rs.Close
Next i
'关闭数据库
adConn.Close
Set adConn = Nothing
End Sub
代码截图

Part 3:获取rs
Function fMod_tyk_01_rs产生(dbAddr, SQL, Optional mode = 1)
Rem>>通过运行SQL,产生rs
Rem>>两种运行方式:
Rem>>mode=1,Set rs = adConn.Execute(SQL);
Rem>>mode=2,rs.Open SQL, adConn, adOpenKeyset, adLockOptimistic
Dim adConn As ADODB.Connection '连接
Set adConn = New ADODB.Connection
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
With adConn
.Provider = "Microsoft.ACE.OLEDB.12.0;"
.Open "Data Source=" & dbAddr
End With
If mode = 1 Then
Set rs = adConn.Execute(SQL)
ElseIf mode = 2 Then
rs.Open SQL, adConn, adOpenKeyset, adLockOptimistic
End If
fMod_tyk_01_rs产生 = Array(rs, adConn)
End Function
代码截图

Part 4:rs更新下拉列表
Sub sMod_tyk_02_组合框下拉列表(rs, adConn, frmName, ctrlName)
Rem>>
Rem>>
Dim rsCount
Dim frm
Dim cbo
Dim j
rsCount = rs.RecordCount
Set frm = Forms(frmName)
Set cbo = frm.Controls(ctrlName)
cbo.RowSource = ""
cbo.Value = ""
If rsCount > 0 Then
rs.MoveFirst
cbo.RowSource = ""
For j = 1 To rs.RecordCount
cbo.AddItem rs.Fields(0) & "" '使用该方法需先设置 行来源类型 为 值列表
rs.MoveNext
Next j
End If
End Sub
代码截图

Part 5:部分代码解读
- 对数据库的操作套路
- 连接数据库
- 获取SQL
- 执行SQL,得到rs
- 关闭数据库连接
-
cbo.AddItem rs.Fields(0) & ""
,官方解释如下:
- cbo.AddItem(Item, Index),其中Item为字符串,这也是上面代码中连接一个空的字符的原因
- Index省略,默认加到列表的尾部
-
cbo.RowSource = ""
将选项清空 -
cbo.Value = ""
将取值清空
AddItem

RowSource

- 接下来就是下拉列表实现了,今天就讲到这里了,且听下回分解
- 因为这系列,是一边写程序,一边写文章,所以后期可能存在对先前发表的文章进行更改
- 有的时候做一个系统就是这样,会返回去改动,所以说前期想的越周到,返工的可能性就越低
- 本文为原创作品,如需转载,可加小编微信号
learningBin
更多精彩,请关注微信公众号
扫描二维码,关注本公众号

网友评论