最近事情很多,有好的,有不好的。项目拖延了很久,大概有20多天,项目是之前答应好的,总算告一段落,想着做一些总结,写一份8月的日志。
在这个月,姥爷去世了,第一次直面亲人的离世,没有看到水晶棺的那一刻,总归没有多少感触,当看到的那一刻,眼泪怎么也止不住的流,以前的种种经历就像灯片一样在眼前划过。
另一个事情,和小彭的感情也变好了一些,可能是两人在最近都经历了亲人的离开,心理上难免走进了一点,也算是这个月的安慰吧
还有一个事是对于自己的思考,有两个项目的机会,一个是慧婷希望一起合作一个画画的项目,一个是牛杰的抢票业务。但是最近也不知道为什么,总也提不起精神。以前的时候老因为项目的事放别人鸽子,最近突然觉得,人,要守信
最后聊聊工作,最近工作上也有点不顺,感觉最近没有精神头,很多知道的事也不知道怎么干了,很困扰,不知道是瓶颈还是什么,总说不清,反正工作上是不太舒服,没什么事,也有点事,有点事又不想干,不想干又不甘心,说不清。
经过半个多月的学习,查资料,构思,加上家里乱七八糟的事,终于把系统做的差不多。
这个项目属于第一次写VBA项目,之前都是用公式做自动化,但是公式能做的毕竟有限,所以还是想练习下VBA的系统,没准以后用的着,也是自己百闲中的一个小兴趣吧。
一、part1
在做这个系统中,初想挺简单的,无非就是调调数据库,做做查询,实际做起来还是有点东西的,在这个项目中遇到几个困难
- 数据库的设计(如何把数据库分开设计,都有哪些数据需要分开,设计的时候给自己造成了很多的困难)
- 窗体的设计(设计窗体我没试过,第一次设计窗体,还行,没那么复杂)
- 数据更新后不想调数据库,如何把数据放到指定位置
- 数据库联表查询,多个数据库,联表查询可费了老鼻子劲了
- 数据库ID值更新,更新一个数据,在其他数据库中更新这个id(后来我放弃了)
总体来说就是这几个问题,幸好有chatgpt,要不自己真不知道啥时候能整出来。
二、part2
接下来说一下具体功能上的实现
第一个:新增数据
功能设计:
这个功能就是一个批量导入数据,需要一个固定的excel模板,点击按钮 => 选则文件 => 获取数据 => 添加数据库 => 同步添加到这个excel里
遇到的问题和卡点:
- 最初设计的时候最后一步是希望直接添加到excel里的,但是后来在实现的过程中,发现如果不调取数据库,id值的获取是个问题,因为如果要删除的话,id就全乱了,所以最后还是添加完数据以后再调用一次数据库。
代码设计:
- 连接数据库和调取全部数据用的次数比较多,需要封装一个方法
- 调用数据库中”字段名“也使用频繁,而且改动比较麻烦,为了方便维护,需要用数组将数据存起来,以后需要改动代码,只用改动数组就可以了
- 添加的步骤比较繁琐,后续用的也不多,可以根据功能用”面向过程“思路实现
具体实现:
Option Explicit
Public myArray() As Variant
Sub InitializeArray()
ReDim myArray(1 To 13) As Variant
myArray(1) = "id"
myArray(2) = "省份"
myArray(3) = "市"
myArray(4) = "[区/县]"
myArray(5) = "邮编"
myArray(6) = "学校名称"
myArray(7) = "地址信息"
myArray(8) = "姓名"
myArray(9) = "职称"
myArray(10) = "联系方式"
myArray(11) = "学校级别"
myArray(12) = "学校性质"
myArray(13) = "归属人"
End Sub
'第一步 打开对话框
Public Sub forlder_open()
Dim fileDialog As fileDialog
Dim selectedFile As Variant
' 创建文件选择对话框
Set fileDialog = Application.fileDialog(msoFileDialogFilePicker)
' 设置对话框属性
fileDialog.AllowMultiSelect = False
fileDialog.Title = "选择 Excel 文件"
fileDialog.Filters.Clear
fileDialog.Filters.Add "Excel 文件", "*.xlsx; *.xls"
' 显示文件选择对话框并获取选中的文件
If fileDialog.Show = -1 Then
selectedFile = fileDialog.SelectedItems(1)
Call open_fild(selectedFile)
Else
Exit Sub ' 用户取消了选择,退出子过程
End If
End Sub
'第二步 获取excel对象,并获取数据
Public Sub open_fild(selectedFile)
Dim excelApp As Object
Dim Workbook As Object
Dim Worksheet As Object
Dim fieldValue As Variant
Call 连接数据库 '数据库连接
MsgBox "数据库已连接"
' 创建 Excel 应用程序对象
Set excelApp = CreateObject("Excel.Application")
' 打开选中的 Excel 文件
Set Workbook = excelApp.Workbooks.Open(selectedFile)
' 获取 Excel 数据并填充到数据库
Set Worksheet = Workbook.Sheets(1) ' 假设数据在第一个工作表中
Call add_sql(Worksheet)
' 关闭 Excel 文件
Workbook.Close False
' 关闭 Excel 应用程序
excelApp.Quit
Set Workbook = Nothing
Set excelApp = Nothing
End Sub
'第三步 增加数据
Public Sub add_sql(Worksheet)
Dim fieldNames() As String
Dim dataArray() As Variant
Dim row As Long
Dim column As Long
Dim sql As String
' 获取字段名称数组
ReDim fieldNames(1 To Worksheet.UsedRange.Columns.Count)
For column = 1 To Worksheet.UsedRange.Columns.Count
fieldNames(column) = Worksheet.Cells(1, column).Value
Next column
' 获取数据数组
ReDim dataArray(1 To Worksheet.UsedRange.Rows.Count - 1, 1 To Worksheet.UsedRange.Columns.Count)
For row = 2 To Worksheet.UsedRange.Rows.Count
For column = 1 To Worksheet.UsedRange.Columns.Count
dataArray(row - 1, column) = Worksheet.Cells(row, column).Value
Next column
Next row
' 执行插入语句将数据插入到数据库表中
For row = 1 To UBound(dataArray, 1)
sql = "INSERT INTO 数据总表(" & Join(fieldNames, ", ") & ") VALUES("
For column = 1 To UBound(dataArray, 2)
sql = sql & "'" & Replace(CStr(dataArray(row, column)), "'", "''") & "', "
Next column
sql = Left(sql, Len(sql) - 2) & ")"
'MsgBox sql
cnn.Execute sql
Next row
'Call UpdateForeignKey(Worksheet.UsedRange.Rows.Count - 1) '更新外键
Call 获取所有数据
'MsgBox Worksheet.UsedRange.Rows.Count
MsgBox "写入数据"
End Sub