VBA中ListView应用2(对数据库增删改)
纪念从零开始2个月学VBA的成果。
本文主要涉及:
- VBA 类模块
- MySQL 增删改
- ListView 事件
上文使用VBA编写了一个查询MySQL的数据,并用ListView显示的小窗口。
现在提出新的需求:通过ListView对MySQL数据进行增删改,效果如下:
通过ListView的双击事件,调出增删改子窗体。因此需要做两个子窗体
- 添加型号和业绩窗口
- 设计窗体的样式,窗体中除了型号编号和业绩编号,其他的字段都需要有,并且要将TextBox的名称修改成相对于的字段名。(因为型号编号和业绩编号需要计算得出)
- 在子窗体中,型号编号,合同编号不允许编辑,将Enabled属性设置成False
可以把相同的功能写成方法,然后在两个窗体中进行调用。两个窗体中有相同的增删改功能,只是操作的数据库不一样。
新增方法:
'在类模块编写新增方法
Sub 新增(Select_Sql, 数据表$, 字典, 窗体, Add_List)
'将新增的数据写入数据库
Dim conn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim data As New MySQL
Dim sql$
Dim 自动编号%
conn.Open data.模拟数据
rst.Open Select_Sql, conn
自动编号 = rst.Fields("编号") + 1 '自动计算型号编号
'使用循环编写SQL语句
sql = "Insert into " & 数据表 & " values ('" & 自动编号 & "','"
For Each D In 字典.keys
sql = sql & 窗体.Controls(D) & "','"
sql = Left(sql, Len(sql) - 2) & ")"
conn.Execute sql '执行SQL语句
conn.Close: Set conn = Nothing
'将将新增的数据写入ListView
With Add_List.ListItems.Add()
.Text = 自动编号
x = 0
For Each D In 字典.keys
x = x + 1
.SubItems(x) = 窗体.Controls(D)
End With
End Sub
修改方法:
'在类模块编写修改方法
Sub 修改(数据表$, 字典, 窗体, 关键字段, Selcte_List)
Dim conn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim data As New MySQL
Dim sql$
conn.Open data.模拟数据
'使用循环编写SQL语句
sql = "UPDATE " & 数据表 & " SET "
For Each D In 字典.keys
sql = sql & D & "= '" & 窗体.Controls(D) & "',"
sql = Left(sql, Len(sql) - 1)
sql = sql & " WHERE " & 关键字段 & "= '" & Selcte_List.SelectedItem.Text & "'"
'MsgBox sql
conn.Execute sql '执行SQL语句
conn.Close: Set conn = Nothing
'将将新增的数据写入ListView
With Selcte_List.SelectedItem
x = 0
For Each D In 字典.keys
x = x + 1
.SubItems(x) = 窗体.Controls(D)
End With
End Sub
删除方法 :
'在类模块编写删除方法
Sub 删除(数据表$, 关键字段$, Selcte_List)
Dim conn As New ADODB.Connection
Dim data As New MySQL
Dim sql$
conn.Open data.模拟数据
On Error Resume Next
sql = "DELETE FROM " & 数据表 & " WHERE " & 关键字段 & " = '" & Selcte_List.SelectedItem.Text & "'"
'MsgBox sql
conn.Execute sql
Selcte_List.ListItems.Remove Selcte_List.SelectedItem.Index
conn.Close: Set conn = Nothing
Unload Me
End Sub
将这三个方法放在类模块中:
ps: 其实写方法很简单,先在两个窗口分别写增删改,然后对比两者的区别,将代码中不同的地方用变量代替。
在型号窗体中调用方法:
在业绩窗口中调用方法:
把子窗体写完后,在回到主窗体,对ListView2和ListView3添加双击事件。
双击事件的执行程序的一样的,都是双击之后,在调出对应的子窗体.show,并在子窗体中显示选中行的对应信息。
相同的执行程序,也写成带有变量的过程,然后在调用的时候写入对应的参数即可
Private Sub ListView2_DblClick()
'listView2双击事件
On Error Resume Next
获取选中行资料 ListView2, B型号, Dic_型号
End Sub
Private Sub ListView3_DblClick()
'listView3双击事件
On Error Resume Next
获取选中行资料 ListView3, C业绩, Dic_业绩
End Sub
Sub 获取选中行资料(表, 窗体, 字典)
Dim Lst
Set Lst = 表.SelectedItem '将对象赋值给变量
With 窗体
If 表.ListItems.Count > 0 Then '判断表如果不为空,则在将选中的行资料写入指定窗体
x = 0
For Each D In 字典.keys
x = x + 1
.Controls(D) = Lst.SubItems(x)
End If