创意电子

标题: 根据工作表数据生成数据库 [打印本页]

作者: VBA语言专业教育    时间: 2021-10-8 06:08
标题: 根据工作表数据生成数据库
【分享成果,随喜正能量】所有的失败都是为成功做准备。抱怨和泄气,只能阻碍成功向自己走来的步伐。放下抱怨,心平气和地接受失败,无疑是智者的姿态。抱怨无法改变现状,拼搏才能带来盼望。真的金子,只要自己不把自己隐藏,只要一心想着闪光,就总有闪光的那一天。
《VBA数据库解决方案》教程是我推出第二套教程,如今已经是第一版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO毗连ACCDB和EXCEL的方法和实例操作,教程第一版的修订内容主要是完成所有程序文件的32位和64位OFFICE系统测试。
这套教程共两册,八十四讲,今后一段时间会给各人陆续推出修订后的教程内容。本日的内容是第22讲:根据工作表数据生成数据库


                               
登录/注册后可看大图

第二十二讲 根据工作表数据,生成数据库中新的数据表

各人好本日我们继续讲解VBA数据库解决方案的第22讲:如何利用工作表数据,生成数据库新的数据表。在之前的讲解中我们讲了很多把数据从数据表中导出到工作表的方法,本日我们讲解如何把数据由工作表存储到数据库中的数据表。
为什么要有如许的操作呢?我们举个实例:如果您是一个部门的销售人员,每月的销售数据是一个EXCEL表格,如果可以把这些数据放到数据库中,如许会更方便的实现查找和统计。为什么要借助数据库呢?EXCEL不可以吗?当然,理论上是可以的,但实际不推荐。把数据保存在EXCEL中,轻易误操作,而且当数据量大的时候,EXCEL的操作远比数据库操作要慢。这是我多年工作经验的体会。所以我们在学习的时候,该更新自己知识布局的要及时更新。比如有的朋友的EXCEL还是2003版本的甚至是2000版本的,还是建议你尽快的升级吧。
1 应用场景的具体分析

言归正传,我们还是研究如何实现上述的逆运算的过程。实例:在我的EXEL表格中有一份19年2月份的销售记录,我要新建立一个数据表保存它。EXCEL工作表内容如下截图:

                               
登录/注册后可看大图

导入的数据表名称为“19年销售情况”,下面我们看看如何能实现这个过程。
2 将工作表中的数据导入到数据表中的代码及代码解读

由于大概的方法很多,我要一个一个的给各人讲解,或许有的朋友会说,怎么不用那种方法啊?对的,你的方法也可以,或许我在后续的文章中会讲到你的方案,没关系,先看我的思路,代码:
Sub mynz_22() '第22讲 如何利用工作表数据,生成数据库新的数据表
Dim cnADO, rsADO As Object
Dim strPath, strSQL, strTable As String
Set cnADO = CreateObject("ADODB.Connection")
Set rsADO = CreateObject("ADODB.Recordset")
strPath = ThisWorkbook.Path & "\mydata2.accdb"
strTable = "19年销售情况"
cnADO.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath
Set rsADO = cnADO.OpenSchema(20, Array(Empty, Empty, strTable, Empty))
'如果存在这个数据表,那么删除
If Not rsADO.EOF Then
strSQL = "DROP TABLE " & strTable
cnADO.Execute strSQL
End If
'按工作表创建数据表
strSQL = "SELECT * INTO " & strTable _
& " FROM [Excel 12.0;Database=" _
& ThisWorkbook.FullName & ";].[" & ActiveSheet.Name & "$]"
cnADO.Execute strSQL
MsgBox "已经将工作表数据生成新数据表。", vbInformation, "数据表创建"
rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
代码截图:

                               
登录/注册后可看大图

代码解读:
1):
Dim cnADO, rsADO As Object
Dim strPath, strSQL, strTable As String
Set cnADO = CreateObject("ADODB.Connection")
Set rsADO = CreateObject("ADODB.Recordset")
strPath = ThisWorkbook.Path & "\mydata2.accdb"
strTable = "19年销售情况"
cnADO.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath
Set rsADO = cnADO.OpenSchema(20, Array(Empty, Empty, strTable, Empty))
上述代码用于创建ADO对象和毗连,不清晰的朋友要回过头看看我之前的讲解,这段代码其实是相对固定的,朋友可以作为固定的格式来利用,很多类似的地方都是如此的。
2 ):
'如果存在这个数据表,那么删除
If Not rsADO.EOF Then
strSQL = "DROP TABLE " & strTable
cnADO.Execute strSQL
End If
这段代码我加了注释是如果存在这个数据表,那么删除,具体的解释我也不再多说,我之前都有详细的讲解
3 ):
'按工作表创建数据表
strSQL = "SELECT * INTO " & strTable _
& " FROM [Excel 12.0;Database=" _
& ThisWorkbook.FullName & ";].[" & ActiveSheet.Name & "$]"
cnADO.Execute strSQL
SELECT INTO 语句:
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
SQL SELECT INTO 语法
①把所有的列插入新表:
SELECT * INTO new_table_name [IN externaldatabase] FROM old_tablename
②只把盼望的列插入新表:
SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_tablename
4) rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
上述代码用于关闭毗连和开释内存。
下面我们看运行的结果:

                               
登录/注册后可看大图

本日内容回向:
1 如何把EXCEL数据备份到数据表中?
2 通过以前的学习你是否还有他的设想,可以实现把数据表中的数据备份到数据库的表中?

本讲内容参考程序文件:VBA与数据库操作(第一册).xlsm


                               
登录/注册后可看大图

我20多年的VBA实践经验,全部浓缩在下面的各个教程中:


                               
登录/注册后可看大图

作者: 小白卫生院    时间: 2021-10-8 07:07
老师,你的学习资料课程从哪里获得?
作者: 梦回大秦2020    时间: 2021-10-8 07:33
转发了
作者: 五湖四海的虾米    时间: 2021-10-8 07:53
转发了
作者: jssyong    时间: 2021-10-8 11:37
不错,每天一个知识点一个小技巧
作者: 高高哋啦    时间: 2021-10-8 14:15
很好學習
作者: 锦鲤旭V    时间: 2021-10-8 20:38
转发了




欢迎光临 创意电子 (https://wxcydz.cc/) Powered by Discuz! X3.4