Excel VBAADOSQL实例集锦
Excel_VBA编程常用实例(150例)
Excel_VBA编程常用实例(150例)主要内容和特点《ExcelVBA编程入门范例》主要是以一些基础而简短的VBA实例来对ExcelV BA中的常用对象及其属性和方法进行讲解,包括应用程序对象、窗口、工作簿、工作表、单元格和单元格区域、图表、数据透视表、形状、控件、菜单和工具栏、帮助助手、格式化操作、文件操作、以及常用方法和函数及技巧等方面的应用示例。
这些例子都比较基础,很容易理解,因而,很容易调试并得以实现,让您通过具体的实例来熟悉ExcelVBA编程。
■ 分16章共14个专题,以具体实例来对大多数常用的ExcelVBA对象进行讲解;■ 一般而言,每个实例都很简短,用来说明使用VBA实现Excel某一功能的操作;■ 各章内容主要是实例,即VBA代码,配以简短的说明,有些例子可能配以必要的图片,以便于理解;■ 您可以对这些实例进行扩充或组合,以实现您想要的功能或更复杂的操作。
VBE编辑器及VBA代码输入和调试的基本知识在学习这些实例的过程中,最好自已动手将它们输入到VBE编辑器中调试运行,来查看它们的结果。
当然,您可以偷赖,将它们复制/粘贴到代码编辑窗口后,进行调试运行。
下面,对VBE编辑器界面进行介绍,并对VBA代码输入和调试的基本知识进行简单的讲解。
激活VBE编辑器一般可以使用以下三种方式来打开VBE编辑器:■ 使用工作表菜单“工具——宏——Visual Basic编辑器”命令,如图00-01所示;■ 在Visual Basic工具栏上,按“Visual Basic编辑器”按钮,如图00-02所示;■ 按Alt+F11组合键。
图00-01:选择菜单“工具——宏——Visual Basic编辑器”命令来打开VBE编辑器图00-02:选择Visual Basic工具栏上的“Visual Basic编辑器”命令按钮来打开VBE编辑器此外,您也可以使用下面三种方式打开VBE编辑器:■ 在任一工作表标签上单击鼠标右键,在弹出的菜单中选择“查看代码”,则可进入VBE编辑器访问该工作表的代码模块,如图00-03所示;■ 在工作簿窗口左上角的Excel图标上单击鼠标右键,在弹出的菜单中选择“查看代码”,则可进入VBE编辑器访问活动工作簿的ThisWorkbook代码模块,如图00-04所示;■ 选择菜单“工具——宏——宏”命令打开宏对话框,若该工作簿中有宏程序,则单击该对话框中的“编辑”按钮即可进行VBE编辑器代码模块,如图00-05所示。
excelvbaadosql入门教程004:sql中的excel表
Excel VBA ADO SQL入门教程004:SQL中的Excel表1.上期我们聊了SQL常用查询语句中的字段查询,其简化版语法如下:SELECT 字段名FROM 表名当时我们说,FROM关键词指明了要获取字段信息的表的名称。
倘若数据源是Excel表格,则需要在表名后增加美元符号$,并用中括号包起来,例如[Sheet1$]……事实上,上述例子是SQL In Excel 对工作表引用最简单的一种情况,也就是整表引用;此外还有单元格区域引用、跨工作簿引用表等。
所以我们今天就再来聊一下SQL语句中的Excel表。
2.区域成表Excel工作表和数据库的数据表有很多不同之处,最显著的地方在于,数据库的数据表是由行列构成的,而Excel工作表则是由一个又一个单元格构成的,且这些单元格拥有独特的地址表述方法(A1和R1C1),它们还可以构成数据相连的单元格区域,例如A2:H8。
于是问题来了,如果我们只需要使用SQL语言计算某张Excel工作表的部分区域该怎么表述呢?这种问题是很常见的。
比如,很多人的Excel标题行并不是处于表格的第一行,而是第2行……如下图:此时,我们希望SQL可以使用A2:F列的单元格区域作为表,而不是整个Excel工作表,这样我们更容易使用字段名处理数据……对吧?(我转头看看书柜,书柜不说话……)再比如,一张表里存在两个或更多个“表”……这句话什么意思呢?见下图。
图中所示的表格中,既存在一份“教师表”,又存在一份“学生表”;如果我们只希望SQL引用计算A2:D8的教师表数据……呃,请把刀放下,君子动手不动刀…………好伐,Excel中的SQL其实是支持将工作表的单元格区域作为“表”使用的。
上图所示的问题,SQL可以写成:SELECT 姓名,学科FROM [数据表$A2:D8]查询结果如下:而第1种情况,我们知道数据开始于A2单元格,但不知道结束于F列的哪个单元格,SQL可以写成:SELECT 姓名,爱好FROM [学生表$A2:F]另外,如果我们需要SQL引用计算表格D:G整列的数据:SELECT * FROM [学生表$D:G]总结以上几种Excel工作表区域的表述方式,也就是,工作表名称美金符号$ 相对引用状态下的单元格地址,最后使用中括号包起来。
ExcelVBAADOSQL实例集锦
ExcelVBAADOSQL实例集锦1, 包含空值的记录f13 is null‘‘订单生成系统.xls‘f6-第6列,f2-第2列Private Sub Worksheet_Activate()On Error Resume NextDim x As Object, yy As Object, sql As StringSet x = CreateObject("ADODB.Connection")x.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;hdr=no;';Data Source=" & ActiveWorkbook.FullNamesql = "select f6,f2,f3,f4,f5,f7,f13,f24 -f25 from [sheet1$] where f24 -f25<="" and="" bdsfid="72">'C3' or f13 is null)" ‘不等于字符串用‘C3’包含空值用is nullSet yy = x.Execute(sql)Range("a:h").ClearContentsRange("a1:h1") = Array("编号", "品名", "规格", "产地", "单位", "件装", "属性", "计划") ‘表头另外赋值[a2].CopyFromRecordset yySet yy = NothingSet x = NothingEnd Sub2,用ADO Connection对象查询Option ExplicitPublic conn As ADODB.ConnectionSub Myquery()Dim sConnect$, sql1$Set conn = CreateObject("adodb.connection")Sheets("sheet1").Cells.ClearContentssConnect = "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;" & _"Data Source=" & ThisWorkbook.Path & "\" & /doc/0317259515.html, sql1 = "select 物料代码,物料描述,属性,单位from [物料代码表$] where 属性= '采购' " '表格名要用[$],条件部分用单引号''ThisWorkbook.Sheets("sheet1").Cells(2,1).CopyFromRecordset conn.Execute(sql1) 'copy 后面紧接SQL查询执行语句With Sheets("sheet1").Range("A1") = "物料代码" '建立表头.Range("B1") = "物料描述".Range("C1") = "属性".Range("D1") = "单位"End With'conn.Close '可不用每次关闭数据源的连接End Sub3,用记录集执行单个查询Option ExplicitSub Myquery()Dim rd As ADODB.RecordsetDim i%, j%, k%, sConnect$, sql1$, str$Set rd = New ADODB.Recordsetstr = "外协"Sheets("sheet1").Cells.ClearContentssConnect = "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;" & _"Data Source=" & ThisWorkbook.Path & "\" & /doc/0317259515.html,'conn.Open sConnect '打开数据源sql1 = "select 物料代码,物料描述,属性,单位from [物料代码表$] where 属性= '采购' " '表格名要用[$],条件部分用单引号'' rd.Open sql1, sConnect, adOpenForwardOnly, adLockReadOnlyThisWorkbook.Sheets("sheet1").Cells(2,1).CopyFromRecordset rdWith Sheets("sheet1").Range("A1") = "物料代码" '建立表头.Range("B1") = "物料描述".Range("C1") = "属性".Range("D1") = "单位"End Withrd.Close '关闭记录集Set rd=Nothing '关闭End Sub4,引用一列,如A列‘引用单列、单行、单个单元格.xls'引用一列,如A列Sub onecolumn()Dim Sql$Set Conn = CreateObject("Adodb.Connection")Conn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;hdr=no';data source=" & ThisWorkbook.Path & "\1.xls"Sql = "select f1 from [sheet1$]"Cells.Clear[a1].CopyFromRecordset Conn.Execute(Sql)Conn.CloseSet Conn = NothingEnd SubSub dgzbhz()'2008/12/2‘‘Book12021.xls‘由于分表的第2列表头是“金额”,不用它,改为“一中”,所以要用hdr=no无标题,拷贝时把第一行表头归零,所以最后要加表头。
excel vba sql语句示例
excel vba sql语句示例Excel VBA中SQL语句示例-以中括号为主题在Excel VBA中,SQL(Structured Query Language)是一种用于管理关系数据库的语言。
它允许用户从数据库中检索数据,更新和删除数据,并与数据库进行交互。
中括号[]在SQL语句中用于标识数据表或字段名称。
本文将介绍几个常用的Excel VBA中使用SQL语句并涉及中括号的示例。
1.查询数据表中所有字段使用SELECT语句可以从数据表中选择一条或多条记录。
要选择所有字段,可以使用“*”或字段列表。
使用“*”选取所有字段非常方便,但不建议在大型数据表中使用。
以下是一个示例,它使用“*”选取数据表中的所有字段。
Sub SelectAllFields()'Define variablesDim cn As ADODB.ConnectionDim rs As ADODB.RecordsetDim strQuery As String'Open connection to the databaseSet cn = New ADODB.Connectioncn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\User\Documents\Database.accdb;Persist Security Info=False;"cn.Open'Create SQL query to select all fields from the data tablestrQuery = "SELECT * FROM [Data Table]"'Execute the query and store the result in a recordsetSet rs = cn.Execute(strQuery)'Close the database connectioncn.CloseSet cn = NothingEnd Sub2.根据条件查询数据表中的记录使用WHERE子句可以根据指定的条件从数据表中检索一条或多条记录。
VBA调用SQL查询的方法与示例
VBA调用SQL查询的方法与示例VBA(Visual Basic for Applications)是一种广泛应用于Microsoft Office软件中的宏语言,它可以使用户通过编写代码来自动化执行各种任务。
在Excel、Access等应用程序中,VBA可以与SQL(Structured Query Language)数据库查询语言相结合,实现对数据库的操作和管理。
本文将介绍VBA调用SQL查询的方法与示例,并提供相关代码供读者参考。
1. 连接到数据库在VBA中调用SQL查询之前,我们需要先连接到数据库。
VBA中连接数据库的方法有许多种,这里我们以连接到Microsoft Access数据库为例进行说明。
首先,我们需要在VBA代码中添加对Microsoft ActiveX Data Objects(ADO)库的引用。
在VBA编辑器中,选择“工具”>“引用”,然后选中“Microsoft ActiveX Data Objects x.x Library”。
接下来,我们可以使用ADO连接字符串来连接到数据库。
例如,对于Microsoft Access数据库,连接字符串的格式为:```Provider=Microsoft.ACE.OLEDB.12.0;DataSource=C:\path\to\database.accdb;```我们可以将连接字符串保存在一个变量中,并使用`ADODB.Connection`对象来进行连接。
示例代码:```VBADim conn As ObjectSet conn = CreateObject("ADODB.Connection")Dim connectionString As StringconnectionString ="Provider=Microsoft.ACE.OLEDB.12.0;DataSource=C:\path\to\database.accdb;"conn.Open connectionString```2. 执行SQL查询连接成功后,我们可以通过执行SQL查询语句来检索数据库中的数据。
VBA与SQL语句的结合与应用实例
VBA与SQL语句的结合与应用实例在现代信息化时代,数据处理已经成为各个行业中不可或缺的一环。
在处理大量数据时,使用Excel和SQL数据库是非常常见的选择。
而结合VBA(Visual Basic for Applications)和SQL语句,可以将两者的优势发挥到极致,提高数据处理的效率和准确性。
本文将通过一些实例来展示VBA与SQL语句的结合与应用。
案例一:数据导入与清洗假设我们有一个存储了客户订单的Excel表格,我们需要将其中的数据导入到SQL数据库中进行进一步处理。
这时,我们可以使用VBA编写一个宏来实现自动将Excel中的数据导入到数据库表中。
首先,我们需要在Excel中添加一个按钮,通过宏来触发数据导入的操作。
然后,我们可以使用VBA代码来连接到数据库,并执行相应的SQL语句将数据导入。
示例代码如下:```vbaSub ImportDataToSQL()Dim conn As ObjectDim rs As ObjectDim strSQL As StringDim rng As RangeDim cell As RangeSet conn = CreateObject("ADODB.Connection")conn.ConnectionString = "Provider=<provider>; Data Source=<data_source>; Initial Catalog=<catalog>; User ID=<user_id>; Password=<password>"conn.OpenSet rng = ThisWorkbook.Sheets("Sheet1").Range("A2:D10") ' 假设数据范围为A2:D10strSQL = "INSERT INTO TableName (Column1, Column2, Column3, Column4) VALUES (?,?,?,?)"For Each cell In rngSet rs = CreateObject("ADODB.Recordset")rs.Open strSQL, connrs.AddNewrs.Fields("Column1").Value = cell.Offset(0, 0).Valuers.Fields("Column2").Value = cell.Offset(0, 1).Valuers.Fields("Column3").Value = cell.Offset(0, 2).Valuers.Fields("Column4").Value = cell.Offset(0, 3).Valuers.Updaters.CloseSet rs = NothingNext cellconn.CloseSet conn = NothingEnd Sub```在上述示例代码中,我们需要替换掉连接字符串中的`<provider>`、`<data_source>`、`<catalog>`、`<user_id>`和`<password>`,以便正确连接到目标数据库。
ExcelVBA+ADO+SQLUNION多表数据合并
ExcelVBA+ADO+SQLUNION 多表数据合并你挑着担,我牵着马 迎来⽇出,送⾛晚霞………… 1.SQL的UNION运算符可以合并两个或多个的SELECT结果集,因此,我们通常使⽤该运算符来合并多表数据。
例如,在⼀个⼯作簿中存在两个表,⼀个表名为 '⼀班',另⼀个表名为'⼆班',现在我们需要将两个表的数据合并成⼀张表。
SQL语句如下:SELECT * FROM [⼀班$] U N I O N S E L E CT * F R O M [⼆班$]结果如下:需要说明的是,UNION运算符会对结果集去重复,只保留唯⼀值;前⾯讲去重复的时候提过,SQL去重复的过程,是先对记录排序,后再去重复,因此U U N I O N 的运算结果通常是默认升序排列的不重复记录。
例如,汇总⼀班和⼆班两个班级的学⽣名单:SELECT 姓名 FROM [⼀班$] U N I O N S E L E CT 姓名 F R O M [⼆班$]结果如下:敢问路在何⽅蒋⼤为 - 蒋⼤为珍藏版看见星光由于使⽤了UNION运算符,⼀、⼆班都存在的‘看见星光‘,只保留了⼀个。
如果不需要去重复的操作,可以使⽤关键字AL L,也就是U N I O N AL L。
同样汇总⼀班和⼆班两个班级的学⽣名单:SELECT 姓名 FROM [⼀班$] U N I O N AL L S E L E CT姓名F R O M[⼆班$]结果如下:由于使⽤了ALL关键字,⼀、⼆班都存在的‘看见星光‘,都被保留了下来;⽽且姓名的排放顺序是和出现的顺序⼀致的,并没有进⾏排序处理。
2.不管是U N I O N还是U N I O N AL L,都要求S E L E CT语句拥有相同的列数,⽽且列的顺序必须相同。
当列数不相同时,例如以下语句:姓名,语⽂F R O M[⼀班$]U N I O N AL L S E L E CT姓名F R O M SELECT 姓[⼆班$]会得到错误提⽰:⽽当列的个数相同,但顺序不相同时,例如以下语句:SELECT 姓语⽂,姓姓名,语⽂F R O M[⼀班$]U N I O N AL L S E L E CT 语名F R O M[⼆班$]会得出错误的结果。
excel中sql应用实例
excel中sql应用实例Excel中SQL应用实例近年来,随着数据分析和处理的重要性日益增加,Excel作为一种常用的数据处理工具,不断地给我们带来惊喜。
其中,Excel中SQL的应用越来越受到关注。
本文将以“Excel中SQL应用实例”为主题,逐步介绍Excel 中SQL的使用方法及应用场景。
1. 什么是SQLSQL(Structured Query Language)是一种用于管理和操作关系数据库的计算机语言。
它可以实现对数据库的查询、插入、更新和删除等操作。
在Excel中通过SQL可以直接对数据进行操作,而不需要通过复杂的公式或手动操作来实现。
2. 准备工作首先,我们需要准备一个包含数据的Excel文件。
该文件应包含一个表格,其中包含需要操作的数据。
在Excel中,我们可以将每一列看作是表的一个字段,每一行看作是一个记录。
3. 数据的导入在Excel中,我们可以使用“数据”选项卡中的“来自其他来源”按钮将数据导入至Excel。
选择“来自SQL Server”选项,然后按照提示进行操作。
4. 使用SQL进行查询在Excel中使用SQL进行查询的方法很简单。
先选中一个空的单元格,然后在“数据”选项卡中的“来自其他来源”按钮下选择“来自SQL Server”。
在弹出的对话框中,选择“刷新数据”按钮。
在“连接属性”对话框中,填入数据库的相关信息,如服务器名称、用户名和密码等。
点击确定后,将打开一个查询编辑器。
在查询编辑器中,可以输入SQL语句进行查询。
例如,如果我们要查询某个字段的最大值,可以输入类似于“SELECT MAX(字段名) FROM 表名”的SQL语句。
点击执行按钮后,查询结果将显示在Excel中。
5. 使用SQL进行筛选和排序在查询编辑器中,我们可以使用WHERE语句对数据进行筛选。
例如,如果我们要过滤出满足某个条件的记录,可以使用类似于“SELECT * FROM 表名WHERE 字段名= 条件”的SQL语句。
43个典型ExcelVBA实例
43个典型ExcelVBA实例目录例1.九九乘法表(Print方法的应用) (3)例2 输入个人信息(Inputbox函数的应用) (3)例3 退出确认(Msgbox函数的应用) (5)例4 突出显示不及格学生 (7)例5 从身份证号码中提取性别 (8)例6 评定成绩等级 (9)例7 计算个人所得税 (11)例8 密码验证 (13)例9 求最小公倍数和最大公约数 (15)例10 输出ASCII码表 (16)例11 计算选中区域数值之和 (17)例12 换零钱法(多重循环) (18)例13 数据排序 (21)例14 彩票幸运号码 (22)例15 用数组填充单元格区域 (24)例16 判断单元格是否包含公式 (25)例17 自动填充公式 (26)例18 锁定和隐藏公式 (28)例19 将单元格公式转换为数值 (29)例20 删除所有公式 (29)例21 用VBA表示数组公式 (30)数据查询 (31)例22 查找指定的值 (31)例23 带格式查找 (33)例24 查找上一个/下一个数据 (34)例25 代码转换 (36)例26 模糊查询 (37)例27 网上查询快件信息 (38)例28 查询基金信息 (40)例29 查询手机所在地 (41)例30 使用字典查询 (43)数据排序 (45)例31 用VBA代码排序 (45)例32 乱序排序 (46)例33 自定义序列排序 (47)例34 多关键字排序 (49)例35 输入数据自动排序 (50)例36 数组排序 (51)例37 使用Small和Large函数排序 (52)例38 使用RANK函数排序 (54)例39 姓名按笔画排序 (56)例40 用VBA进行简单筛选 (59)例41 用VBA进行高级筛选 (61)例42 筛选非重复值 (62)例43 取消筛选 (63):例1.九九乘法表(Print方法的应用)1.案例说明在早期的Basic版本中,程序运行结果主要依靠Print语句输出到终端。
Excel VBA中ADO记录集使用技巧
Excel VBA中ADO记录集使用技巧技巧1:使用唯一值填充组合框主题使用Recordset(记录集)用表中的唯一值来填充组合框。
问题想创建一个组合框,基于表中(见下图1)的内容创建省份的唯一值列表。
图1:示例工作表解决方法使用简单的记录集快速提取不同的省份名并将其装载到组合框。
Sub FillCombox()Dim Myconnection As ConnectionDim Myrecordset As RecordsetDim MyWorkbook As StringSet Myconnection = New ConnectionSet Myrecordset = New Recordset'识别引用的工作簿MyWorkbook = Application.ThisWorkbook.FullName'打开对工作簿的连接Myconnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _"Data Source=" & MyWorkbook & ";" & _"Extended Properties=Excel 8.0;" & _"Persist Security Info=False"'将所选区域装载到记录集中Myrecordset.Open "Select Distinct [省份] from [Sheet1$A1:D50]", Myconnection, adOpenStaticWith boBox1.ClearDo.AddItem Myrecordset![省份]Myrecordset.MoveNextLoop Until Myrecordset.EOFEnd WithEnd Sub上述代码运行得相当快,并且可以在任何事件中调用它们,例如工作簿打开时、查询刷新后或者按下按钮。
43个典型ExcelVBA实例
43个典型ExcelVBA实例目录例1.九九乘法表(Print方法的应用) (3)例2 输入个人信息(Inputbox函数的应用) (3)例3 退出确认(Msgbox函数的应用) (5)例4 突出显示不及格学生 (7)例5 从身份证号码中提取性别 (8)例6 评定成绩等级 (9)例7 计算个人所得税 (11)例8 密码验证 (13)例9 求最小公倍数和最大公约数 (15)例10 输出ASCII码表 (16)例11 计算选中区域数值之和 (17)例12 换零钱法(多重循环) (18)例13 数据排序 (21)例14 彩票幸运号码 (22)例15 用数组填充单元格区域 (24)例16 判断单元格是否包含公式 (25)例17 自动填充公式 (26)例18 锁定和隐藏公式 (28)例19 将单元格公式转换为数值 (29)例20 删除所有公式 (29)例21 用VBA表示数组公式 (30)数据查询 (31)例22 查找指定的值 (31)例23 带格式查找 (33)例24 查找上一个/下一个数据 (34)例25 代码转换 (36)例26 模糊查询 (37)例27 网上查询快件信息 (38)例28 查询基金信息 (40)例29 查询手机所在地 (41)例30 使用字典查询 (43)数据排序 (45)例31 用VBA代码排序 (45)例32 乱序排序 (46)例33 自定义序列排序 (47)例34 多关键字排序 (49)例35 输入数据自动排序 (50)例36 数组排序 (51)例37 使用Small和Large函数排序 (52)例38 使用RANK函数排序 (54)例39 姓名按笔画排序 (56)例40 用VBA进行简单筛选 (59)例41 用VBA进行高级筛选 (61)例42 筛选非重复值 (62)例43 取消筛选 (63):例1.九九乘法表(Print方法的应用)1.案例说明在早期的Basic版本中,程序运行结果主要依靠Print语句输出到终端。
(完整word)Excel VBA+ADO+SQL
Excel VBA+ADO+SQL入门教程001:认识SQL In Excel那就先说SQL吧。
SQL是一种结构化查询语言(Structured Query Language),是一种声明式语言,敲黑板划重点【结构化和声明式】.SQL的核心是对表的引用,声明你想从数据源中获取什么样的结果,而不用告诉计算机如何才能够得到结果—-后面这句话似乎很难理解,举例来说,倘若我们需要获取上图所示表格(Sheet1)成绩大于等于80分的人员名单,如果用命令式程序语言,比如VBA,是这样的: Sub MyFind()Dim arr, brr, i&, k&arr = Sheet1。
[a1]。
CurrentRegionReDim brr(1 To UBound(arr), 1 To UBound(arr, 2))For i = 1 To UBound(arr)If arr(i, 2)〉= 80 Thenk = k + 1brr(k, 1) = arr(i,1)brr(k, 2) = arr(i, 2)End IfNext[d:f]。
ClearContents[d1].Resize(k, 2) = brrEnd Sub你需要通过VBA编程告诉计算机每一步怎么走,数据从哪里来,从哪里开始遍历,行列是多少,符合条件的数据装入哪里,怎么装等等……而如果用声明式SQL语言呢?只要告诉计算机我要什么就可以了.SELECT 姓名,成绩FROM [Sheet1$] WHERE 成绩>=80我要Sheet1表(FROM [Sheet1$])……成绩大于等于80(WHERE 成绩>=80)……姓名和成绩的数据(SELECT 姓名,成绩)。
只要结果,不问过程.就酱紫的声明式霸道总裁范。
4。
为什么要学习SQL In Excel(Excel支持的SQL语言)呢?换言之,相比于Excel其它功能,例如函数、VBA、POWER PIVOT等,SQL有何优势?首先,必须严肃脸说明的是,对于普通Excel使用者而言,VBA、SQL以及以后提及的ADO并不是非学不可的,非学不可的是基础操作、函数、透视表、图表……然而大数据时代,对于另外相当一部分表族而言,Excel用久了,慢慢的,会意识到一个大问题;曾经在你心中无比强大的Excel函数,原来只适合小数据的腾挪躲闪;当数据量稍大后,函数这货就像未嗑士力架的姚明—-不来劲的很哩。
利用Excel的VBA与ADO和SQL技术相结合实现财务报表自动生成
利用Excel的VBA与ADO和SQL技术相结合实现财务报表自动生成[摘要] 本文以资金平衡表为实例,介绍了利用Excel VBA结合ADO和SQL 语句进行复杂条件下的数据库查询,把数据库数据与Excel有机结合,实现会计报表自动生成的思路和方法。
[关键词] Excel;VBA;ADO;SQL;财务报表;自动生成1 引言财务人员日常工作中经常要填制、报送各种各样的数据报表,尤其要定期向外报送会计报表。
Microsoft Excel 由于其强大的数据处理和分析功能被广泛应用在财务领域。
但是对于大多数的财务人员来说,对Microsoft Excel还只是停留在简单的应用上,极少有人利用编程来开发具有一定复杂性和针对性的应用系统。
本文重点介绍利用Excel 的VBA 与ADO 和SQL 技术相结合自动生成财务报表。
本文结合笔者会计工作中编报基本建设单位会计报表实例,利用用友ERP-U8总账系统输出财务数据的功能,借助Excel 的VBA 与ADO 和SQL 技术相结合,实现会计报表自动生成。
2 会计报表自动生成模块的设计与实现VBA 是Visual Basic for Applications 的缩写,是新一代的标准宏语言,是基于Visual Basic for Windows 发展起来的。
ADO 是Active Data Objects的缩写,又被称为OLE 自动化接口,是Microsoft 通用的数据访问技术。
SQL(Structured Query Language,结构化查询语言),是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
本文主要以资金平衡表的自动生成为例进行阐述。
2.1 设计思路(1)从用友ERP-U8总账系统中输出“发生额及余额表”,输出文件类型选择为Microsoft Excel 97-2000。
此表作为自动生成会计报表的数据源。
(2)按照《国有建设单位会计制度》,建立资金平衡表报表项目与会计科目的对照关系。
ExcelVBAADOSQL入门教程017:交叉表查询
ExcelVBAADOSQL入门教程017:交叉表查询1.诸君好,我们今天聊SQL查询语句中的交叉表查询。
先说下什么是交叉表。
赌五根黄金,交叉表这个名字你可能陌生,但样子却肯定不陌生,赢了算我的,输了算老祝的……简而言之,交叉表就是一种分类汇总的二维表,由行和列两个变量汇总数据,例如下图所示的表格即是一份交叉表,成绩由姓名(行)和学科(列)共同分组定义:在SQL IN EXCEL中,实现交叉表查询的语句是TRANSFORM,其语法如下:TRANSFORM aggfunctionSELECT statementPIVOT pivotfield [IN (value1[, value2[, ...]])]语法看不懂哦?看不懂才正常呀,一眼就看懂那就扫地僧了不是?2.我们在第一章的时候讲过,对于没有VBA编程基础的EXCELer而言,SQL常和透视表搭配使用——透视表相信大家是不陌生的;它有四块区域构成,分别是筛选、行、列和值。
好端端的,怎么又扯到透视表去了呢?手拿开,男男授受不亲,没事乱摸我额头作甚,哥没烧糊涂。
我们之前说TRANSFROM语法如下TRANSFORM aggfunction SELECT statement PIVOT pivotfield [IN (value1[, value2[, ...]])]以透视表来比较,TRANSFORM 后的aggfunction,对应的是透视表的值区域,SELECT的statement对应的是透视表的行字段(透视表的行字段肯定是去重归类的),而PIVOT则是对应透视表的列字段。
因此TRANSFROM的语法汉化后如下:TRANSFROM 聚合值字段SELECT 行字段 FROM 数据源 GROUP BY 分组行字段PIVOT 分组列字段……说好的SELECT指定行字段,怎么又多出来FROM 和 GROUP BY 子句了呢?这是因为SELECT是指SELECT语句,而不是SELECT子句呀。
EXCEL(VBA)~SQL 经典写法范本汇集
EXCEL(VBA)~SQL 经典写法范本汇集(转)2008-11-27 10:41需引用 microsoft activeX Data Objects 2.8 library1.sql = "select 构件名称,构件代号,横长度,横数量,竖长度,竖数量,比重,相应工艺 from [参数$B2:K1916]where (大样代码='" & DYDH & "') and (内外框='WKXC')"2.sql = "select 构件名称,构件代号,横长度,横数量,竖长度,竖数量,比重,相应工艺 from [参数$B2:K" & CSMaxrow & "] where (大样代码='" & DYDH & "') and (内外框='WKXC')"****************************************************************A、根据本工作簿的1个表查询求和写法范本Sub 查询方法一()Set CONN = CreateObject("ADODB.Connection")CONN.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullNamesql = "select 区域,存货类, sum(代销仓入库数量),sum(代销仓出库数量),sum(日报数量)from [sheet4$a:i] where 区域='" & [b3] & "' and month(日期)='" & Month(Range("F3")) & "' group by 区域,存货类"Sheets("sheet2").[A5].CopyFromRecordset CONN.Execute(sql)CONN.Close: Set CONN = NothingEnd Sub-----------------Sub 查询方法二()Set CONN = CreateObject("ADODB.Connection")CONN.Open "dsn=excel files;dbq=" & ThisWorkbook.FullNamesql = "select 区域,存货类, sum(代销仓入库数量),sum(代销仓出库数量),sum(日报数量)from [sheet4$a:i] where 区域='" & [b3] & "' and month(日期)='" & Month(Range("F3")) & "' group by 区域,存货类"Sheets("sheet2").[A5].CopyFromRecordset CONN.Execute(sql)CONN.Close: Set CONN = NothingEnd Sub**************************************************************************************************B、根据本工作簿2个表的不同类别查询求和写法范本Sub 根据入库表和回款表的区域名和月份分别求存货类发货数量和本月回款数量查询()Set conn = CreateObject("adodb.connection")conn.Open "provider=microsoft.jet.oledb.4.0;" & _"extended properties=excel 8.0;data source=" & ThisWorkbook.FullNameSheet3.ActivateSql = " select a.存货类,a.fh ,b.hk from (select 存货类,sum(本月发货数量) " _& " as fh from [入库$] where 存货类 is not null and 区域='" & [b2] _& "' and month(日期)=" & [d2] & " group by 存货类) as a" _& " left join (select 存货类,sum(数量) as hk from [回款$] where 存货类" _& " is not null and 区域='" & [b2] & "' and month(开票日期)=" & [d2] & "" _& " group by 存货类) as b on a.存货类=b.存货类"Range("a5").CopyFromRecordset conn.Execute(Sql)End Sub*******************************************************************C、根据本文件夹下其他工作簿1个表区域的区域求和Sub 在工作表1汇总本文件夹下001工作薄的表1分数列查询汇总()Set conn = CreateObject("ADODB.Connection")conn.Open "dsn=excel files;dbq=" & ThisWorkbook.Path & "\001.xls"sql = "select sum(分数) from [sheet1$]"Sheets(1).[a2].CopyFromRecordset conn.Execute(sql)conn.Close: Set conn = NothingEnd Sub---------------------Sub 在工作表1汇总本文件夹下001工作薄的表1A1:A10查询汇总()Set conn = CreateObject("ADODB.Connection")conn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;hdr=no;';data source=" & ThisWorkbook.Path & "\001.xls"sql = "select sum(f1) from [sheet1$a1:a10]"Sheets(1).[A5].CopyFromRecordset conn.Execute(sql)conn.Close: Set conn = NothingEnd Sub-----------------------Sub 在工作表1汇总本文件夹下001工作薄的表1分数列A1:A7查询并msgbox表达汇总()Set conn = CreateObject("ADODB.Connection")Set rr = CreateObject("ADODB.recordset")conn.Open "dsn=excel files;dbq=" & ThisWorkbook.Path & "\001.xls"sql = "select sum(分数) from [sheet1$a1:a7]"Sheets(1).[A8].CopyFromRecordset conn.Execute(sql)rr.Open sql, conn, 3, 1, 1MsgBox rr.fields(0)conn.Close: Set conn = NothingEnd Sub******************************************************************************************D、根据本文件夹下其他工作簿多个表区域的单列区域查询求和sub 本文件夹下其他工作簿的每个工作簿的第4列 30行查询求和Dim cn As Object, f$, arr&(1 To 30), i%Application.ScreenUpdating = FalseSet cn = CreateObject("adodb.connection")f = Dir(ThisWorkbook.Path & "\*.xls")Do While f <> ""If f <> Thencn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;hdr=no;';data source=" & ThisWorkbook.Path & "\" & fRange("d5").CopyFromRecordset cn.Execute("select f4 from [基表1$a5:d65536]")cn.CloseFor i = 1 To 30arr(i) = arr(i) + Range("d" & i + 4)Next iEnd Iff = DirLoopRange("d5").Resize(UBound(arr), 1) = WorksheetFunction.Transpose(arr)Application.ScreenUpdating = TrueEnd Sub************************************************************************************************** E、根据本文件夹下其他工作簿多个表区域的多列区域查询求和sub 本文件夹下其他工作簿的每个工作簿的第B\C\D列 25行查询求和Dim cn As Object, f$, arr&(1 To 25, 1 To 3), i%Application.ScreenUpdating = FalseSet cn = CreateObject("adodb.connection")f = Dir(ThisWorkbook.Path & "\*.xls")Do While f <> ""If f <> Thencn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;hdr=no;';data source=" & ThisWorkbook.Path & "\" & fRange("b6").CopyFromRecordset cn.Execute("select f2,f3,f4 from [基表3$a6:e65536]")cn.CloseFor i = 1 To 25For j = 1 To 3arr(i, j) = arr(i, j) + Cells(i + 5, j + 1)Next jNext iEnd Iff = DirLoopRange("b6").Resize(UBound(arr), 3) = arrApplication.ScreenUpdating = TrueEnd Sub***********************************************************************************F、其他相关知识整理' 用excel SQL方法'conn是建立的连接对象,用open打开' 通过 CreateObject("ADODB.Connection") 这一句建立了一个数据库连接对象conn' 在工程中就不再需要引用“Microsot ActiveX Data Objects 2.0 Library“ 对象'设置对象 conn 为一个新的 ADO 链接实例,也可以用 set conn = New ADODB.Connection。
ExcelVBAADOSQL入门教程013:子查询
ExcelVBAADOSQL入门教程013:子查询1.诸君好,今天咱们聊SQL查询语句中的子查询……什么是子查询?简单理解,子查询就是嵌套在查询中的查询。
为什么要使用子查询?……很多时候,我们对数据的查询处理不是一个查询语句就可以完成的;不能完成的原因,可能是查询条件比较复杂,也可能是受困于SQL自身语法的限制;介时,子查询作为查询条件的重要组成部分,用在WHERE子句以及HAVING子句中,可以帮助我们快速灵活的完成查询操作……举个栗子。
SELECT 姓名 FROM [成绩表$] WHERE 语文>(SELECT MIN(语文) FROM [成绩表$] )(SELECT MIN(语文) FROM [成绩表$] )是一个子查询,计算成绩表中语文的最低分,外面的那层SELECT查询语句是主查询。
整个语句的意思就是查询成绩表中语文成绩大于最低分的’姓名’记录。
可能有朋友问,为什么语句不直接写成:SELECT 姓名 FROM [成绩表$] WHERE 语文>MIN(语文)问的好,鼓掌,变脸——出门左拐,重看第10章吧:Excel VBA+ADO+SQL入门教程010:分组聚合……如上例所示,从语句形式上来看,子查询有两个特点:1),子查询需要包含在括号内。
2),子查询通常放在比较条件的右侧;这不是必需的,但系是约定成俗的。
另外,从查询结果上来看,子查询可以分为两个类别:1),单行子查询:或称单值子查询,顾名思义,子查询的结果集是一个值。
2),多行子查询:再次顾名思义,子查询的结果集是多行。
需要提前说明的是,单值子查询是常见且实用的;多行子查询则是相对少见的;从效率上来讲,多行子查询通常也不是解决问题的最优方案,大都可以使用连接查询代替;因此……建议初学者掌握单值子查询,了解多行子查询。
2.先说单值子查询……单值子查询,由于只返回一个值,我们可以使用<、>、=、>=、<><>等运算符对其进行判断运算。
ExcelVBAADOSQL入门教程020:INSERT新增数据
ExcelVBAADOSQL入门教程020:INSERT新增数据...关于SQL修改数据,我们前两期聊了删和改;还剩下的【增】,也就是INSERT语句;今个就来说它。
1.在SQL中,可以使用INSERT……VALUES语句直接向数据库中插入一行数据,其语法如下:INSERT INTO 表名 [(字段名1, 字段名2……)] VALUES(值1,值2……)在VALUES后列出的数据,其位置必须和INTO后字段名的排列位置保持一致,也就是说第1个值必须对应第1个字段名,第2个值对应第2个字段名……以此类推。
不过,字段名是可以省略的;当字段名省略时,默认读取插入表的所有字段名。
举个例子。
如下图所示,是一份名为‘工资表’的Excel表格。
假设我们现在需要在该表新增一条记录,姓名是‘萧才人’,性别是‘女’,工龄为1,工资3000。
INSERT INTO [工资表$] VALUES('萧才人','女',1,3000)语句省略了字段名,默认读取工资表的所有字段名,也就是姓名、性别、工龄和工资,VALUES列出的数据('萧才人','女',1,3000)和字段名一一对应;语句执行结果如下所示:再比如我们需要插入一行数据,但只知道姓名是’李麻花’,女生,1年工龄,工资未知。
倘若我们将语句写成如下:INSERT INTO [工资表$] VALUES('萧才人','女',1)执行后会得到错误提示:由于该语句省略了字段名,也就默认读取工资表的所有的4个字段名,但VALUES只提供了3个数据,因此会得到‘查询值的数目和目标字段中的数据不同“的错误提示。
语句可以修改如下:INSERT INTO [工资表$] VALUES('萧才人','女',1,null)也可以写成如下:INSERT INTO [工资表$] (姓名,性别,工龄) VALUES('萧才人','女',1)该语句提供了字段名,因此只插入指定字段名的数据。
ExcelVBAADOSQL入门教程003:SQL查询中字段技巧的总结
ExcelVBAADOSQL入门教程003:SQL查询中字段技巧的总结本章概要:1,几个概念1.1,数据库和Excel工作簿1.2,数据表和Excel工作表1.3,记录、字段和Excel的行与列2,SELECT基本语法3,如何使用SQL查询工作表中的字段3.1,单字段查询3.2,多字段查询3.3,别名的使用3.4,使用通配符查询所有字段3.5,含有特殊字符的字段查询3.6,无字段的字段查询1.诸君好~我们……过去……第1章讲述了SQL In Excel的优劣。
Excel VBA ADO SQL入门教程001:认识SQL In Excel第2章讲述了如何在VBA中执行SQL,也就是简单认识了下ADO。
Excel VBA ADO SQL入门教程002:简单认识ADO现在……总算可以开始逐步分享SQL语句和实例了……。
不过在这之前,还是需要对一些名词做出解释;这些名词是SQL 语句释义中经常使用到的,所以请先有一个大概的了解。
1.1数据库数据库是按照数据结构来组织、储存和管理数据的仓库,例如最基础的ACCESS软件等。
通常情况下,我们将一个Excel工作簿视为一个数据库。
是的,如您所知,Excel并不是数据库,但这并不妨碍我们把它看成一个数据库,进而使用SQL语言的某些功能处理数据。
这就好比尽管男人不是女人,但一样可以织毛衣、做月嫂……不过,得承认,生孩子之类的就确实太富有挑战性了。
1.2数据表数据表,或称之为表,是数据库最重要的组成部分之一,一个数据库由一个或一组数据表组成。
如果我们把这句话的“数据库”,替换成“Exce l工作簿”,就变成这样:表是Excel工作簿最重要的组成部分之一,一个Excel工作簿由一个或一组表组成,你看,同样也是成立的——因此,可以先将Excel工作表视为数据库中的“表”,至于异同,以后再聊。
1.3记录和字段如上图所示,和Excel表格一样,数据库的表由行和列组成,只是不存在行号和列标,相关值自然就不能使用A6、F4之类的Excel单元格地址来表述。
ExcelVBA+ADO+SQL入门教程002:简单认识ADO
ExcelVBA+ADO+SQL入门教程002:简单认识ADO1.诸君好。
这期我们聊下ADO。
ADO是什么?为什么要学ADO?ADO (ActiveX Data Objects,ActiveX数据对象)是微软提出的应用程序接口,用以实现访问关系或非关系数据库中的数据……更多概念信息请自行咨询百度君,无赖脸。
之所以要学习ADO,一个原因是ADO自身的一些属性和方法对于数据处理是极其有益的;而首要原因是,在EXCEL VBA中,一般只有通过ADO,才可以使用强大的SQL查询语言访问外部数据源,进而查、改、增、删外部数据源中的数据。
后面这话延伸在具体编程操作上,就形成了三步走发展战略(鼓掌)……1.引用ADO类库。
2.ADO建立对数据源的链接。
3.ADO执行SQL语言。
嗯,这就好比你先找个女(男)朋友,然后谈恋爱,最后结婚……2.在VBA中引用ADO类库一般有两种方式。
一种是前期绑定。
所谓前期绑定,是指在VBE中手工勾选引用Microsoft ADO相关类库。
在Excel中,按快捷键打开VBA编辑窗口,依次单击【工具】→【引用】,打开【引用-VBAProject】对话框。
在【可使用的引用】列表框中,勾选“Microsoft ActiveX Data Objects 2.8 Library”库,或“Microsoft ActiveX Data Objects 6.1 Library”库,单击【确定】按钮关闭对话框。
一种是使用代码后期绑定。
Sub 后期绑定()Dim cnn As ObjectSet cnn = CreateObject('adodb.connection')End Sub两种方式的主要区别是,前期绑定后,在代码编辑过程中,VBE 的“自动列出成员”功能,可以提供ADO的属性和方法,这便于代码快捷、准确的编写,但当他人的Excel工作簿并没有手工前期绑定ADO类库时,相关代码将无法运行;因此后期代码绑定ADO的通用性会更强些,它不需要手工绑定相关类库。
使用 ADO-SQL 处理 EXCEL 文件的程序架构(实例注释)
这是学习中的一个小结,其中必定存在错漏,需要各位朋友多多指正(hand)若要使用ADO 来处理Excel 文件,只要将以下6条基本的语句中的红色部分替换为实际内容即可:方式一:Set Conn = CreateObject("adodb.connection") …(1)设置对象…或Set Conn = New ADODB.ConnectionConn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" &文件全路径…(2)打开联接Sql = sql 语句& from [表的显示名称$] " & sql 语句…(3)设置sql 语句放置结果的区域的左上角单元格.CopyFromRecordset Conn.Execute(Sql)…(4)执行sql 语句Conn.Close…(5)关闭联接Set Conn = Nothing…(6)对象置空实例1:汉语中的“和”与逻辑运算中的“或”/dispbbs.asp?BoardID=2&ID=160318&replyID=353335&skin=0设表中有包括字段1 的多个字段Sub andor()Dim Sql$Set Conn = CreateObject("adodb.connection") (1)Conn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=c:\a\a.xls” (2)Sql = "select * from [Sheet1$] where 字段1='020009' or字段1='050023' or字段1='010024'" (3)…上一句查找字段值为020009、050023和010024 的记录,并显示所有字段的值…由此看出,汉语中的“和”对应的逻辑关系反而常常是“或”(or)'Sql = "select 字段1 from [Sheet1$] "…上一句可显示所有记录的字段1 的值Sheets(2).Range("a2").CopyFromRecordset Conn.Execute(Sql) (4)…将结果放在以表2的a2单元格为左上角的区域Conn.Close (5)Set Conn = Nothing (6)End Sub实例2:ADO查询/dispbbs.asp?BoardID=31&ID=153013&replyID=&skin=0Sub filterado()Dim strTbl$, , intTblCnt% , Sql$, sAddress$, str$Dim rng1 As Range, rngt As RangeDim a() As String…有关变量定义,参见:…/dispbbs.asp?boardid=2&id=477Set cn = New ADODB.Connection (1)With cn ...也可将一句分成三句写 (2).Provider = "Microsoft.Jet.OLEDB.4.0".ConnectionString = "Data Source=" & ActiveWorkbook.FullName & ";Extended Prop-erties=Excel 8.0"…活动工作簿的全路径.OpenEnd WithintTblCnt = ActiveWorkbook.Sheets.Count…工作表个数For t = 2 To intTblCnt …遍历工作表Set rngt = Sheets(t).Range("b4").CurrentRegion…包含b4 单元格的连续区域sAddress = rngt.Offset(3, 0).Address(0, 0)…区域向下偏移三行后的相对地址strTbl = ActiveWorkbook.Sheets(t).Name…第t 个表的名称str = Sheets(1).Cells(3, 2).ValueSql = "Select * FROM [" & strTbl & "$" & sAddress & "] Where 姓名='" & str & "'" (3)…显示第t 个表中的名称为变量sAddress的值的区域中查找姓名等于变量str 的值的记录的所有字段值…若第t 个表的名称为“02-1-1” ,查找区域为A4:K81 ,姓名为“王红”,则sql 语句实际为… Select * FROM [02-1-1$A4:K81] Where 姓名='王红‟… &为文字连接符,其中strTbl、sAddress、str 为变量,不能放在双引号中,故需将不变的文字与变量隔开并用& 连接成最后的可以变化的语句Set rng1 = Sheets(1).Cells(7, 1) …将A7 单元格存于区域变量rng1 中rng1.CopyFromRecordset cn.Execute(Sql)...将查询结果放在以A7 单元格为左上角的临时区域中 (4)If Len(rng1.Value) <> 0 Then…如果查询结果不为空,则复制到指定的位置Cells(3, 4) = Cells(7, 1)Cells(3, 6) = Cells(7, 3)Cells(4, 2) = Cells(7, 4)Cells(4, 4) = Cells(7, 5)Cells(4, 6) = Cells(7, 6)Cells(5, 2) = Cells(7, 7)Cells(5, 4) = Cells(7, 8)Cells(5, 4).VerticalAlignment = xlCenter…单元格内容居中Rows(7).Clear…清除第7 行的临时数据cn.CloseSet cn = NothingExit SubEnd IfNextcn.Close (5)Set cn = Nothing (6)End Sub实例3:带窗体进度条的筛选/dispbbs.asp?boardid=2&replyid=349626&id=159850&page=1&skin=0&Star=3 Sub withprogbar()Dim Sql$, i&, sAddress$Sheets("单井属性提取程序(系列3)").ActivateApplication.ScreenUpdating = False '关闭屏幕更新Application.EnableEvents = False '关闭事件响应'Application.Interactive = False '禁止所有的键盘输入和鼠标输入'Set Conn = CreateObject("adodb.connection") (1)Conn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName…(2)宏所在工作簿的文件全路径UserForm1.Show…显示窗体进度条totalrow = Range("C4").ValuesAddress = Range("A7:" & Range("B4").Value & totalrow).Address(0, 0)…取出数据库区域的地址For i = Range("C3").Value + 1 T o totalrowSql = "Select 单井标准编码,新老井标注from [单井属性提取程序(系列3)$" & sAddress & "] where 井号='" & Cells(i, 1) & "'" (3)…从指定表、指定区域中取出“井号”字段值为当前遍历井号的记录的“单井标准编码”和“新老井标注”两个字段值(更详细的解释参见例2)Cells(i, 2).CopyFromRecordset Conn.Execute(Sql) …将结果置于当前行的B列、C列单元格 (4)'产生进度条jj = CStr(Int(i / totalrow * 16))…其中:i/totalrow 为当前行号与总行号的比值… int 函数对参数取整… CStr函数将数值转为字符串UserForm1.TextBox2 = CStr(Int(i / totalrow * 100)) & "%"…在进度条窗体的TextBox2 中显示进度的百分数DoEvents …后台运行With UserForm1.TextBox1…在进度条窗体的TextBox1 中显示图形进度.Value = Application.WorksheetFunction.Rept("n", jj) …图形进度方块用重复写字母”n”来产生 = "Wingdings"…所写字母的字体为 Wingdings.ForeColor = &HFF0000 …颜色为蓝色.Font.Size = 18…大小为18 号End WithNextConn.Close (5)Set Conn = Nothing (6)Application.Interactive = TrueApplication.EnableEvents = TrueApplication.ScreenUpdating = TrueEnd Sub实例4:通用多文件条件汇总/dispbbs.asp?boardid=2&id=151855Sub Multifile()Dim sName As String , Sql As String ,strTbl As String , a() As StringDim intTblCnt As Integer, intColCnt As Integer, t As Integer, c As Integer, f As Integer, Count As IntegerDim Filename As Variant '预先无法知道此数组大小,因预先无法知道要打开的文件数intColCnt = Cells(1, 256).End(xlToLeft).Column'要查找的字段个数ReDim a(intColCnt + 2) …确定数组的大小,此数组用于存放要查找的字段名Filename = Application.GetOpenFilename("Microsoft Office Excel Files (*.xls), *.xls", , "请选取文件", , MultiSelect:=True)…打开选取文件对话框,将选取的各文件全路径名存于Filename 数组中If Not IsArray(Filename) Then Exit Sub…如果未选取文件,则退出程序For Each fn In Filename'在整个选择的范围内循环, fn 为Filename 数组中的一项,是其中的一个全路径名'Application.ScreenUpdating = False …不显示处理过程sName = Dir(fn) …从文件的全路径中取出文件名Workbooks.Open fn'打开文件以检查是否存在需要的字段名Set cn = New ADODB.Connection (1)With cn (2).Provider = "Microsoft.Jet.OLEDB.4.0".ConnectionString = "Data Source=" & fn & ";Extended Properties=Excel 8.0;".OpenEnd WithintTblCnt = ActiveWorkbook.Sheets.Count …当前打开文件中的工作表数For t = 1 To intTblCnt '对文件中的表遍历Count = 0 '用于统计不被当前表包含的汇总字段的个数ActiveWorkbook.Sheets(t). Activate…激活当前遍历的表Sql = ""…准备循环产生sql 查询字符串intFldsCnt = ActiveWorkbook.Sheets(t).Cells(1, 256).End(xlToLeft).Column…当前表第一行的列数,若为0,则为空表,Sql 会保持为空“”strTbl = ActiveWorkbook.Sheets(t).Name …当前表的名称For c = 1 To intColCnt '对于表中每个要汇总的字段进行遍历sign = 0…用此标识表中是否存在要汇总的字段a(c) = ThisWorkbook.Sheets(1).Cells(1, c).Value…将要汇总的字段名存入a中a(c + 1) = ThisWorkbook.Sheets(1).Cells(1, c + 1).Value …要汇总的下一个字段存入 a 的下一个元素中For f = 1 T o intFldsCnt '遍历表中的每一列With ActiveWorkbook.Sheets(t)…对于当前表If Cells(1, f) = a(c) Then'若字段存在sign = 1 …将标志置为1Sql = Sql & a(c) & ","…逐次连接字段名End IfEnd WithNext '遍历表中的列结束If sign = 0 Then '若表中不存在此汇总字段Sql = Sql & a(c + 1) & "," '则用下一个汇总字段代替Count = Count + 1…不被当前表包含的汇总字段的个数加1End IfNext '对于表中要查找的字段遍历结束…若要汇总的字段为“借款单位”、“借款人”,则以上遍历结束后,若存在这两个字段,则连接字段名表为… 借款单位,借款人,…在查询时,字段名表位于Select 与from 之间,字段名之间用逗号分隔,而最后一个字段名后无逗号,所以需要将它去掉,可采用以下方法:Sql = Left(Sql, Len(Sql) - 1)…Len 函数得到字符串的长度,Left 函数对字符串从左边截取第二个参数所指定长度的字符串,如字符串长度为8 ,只要从左边截取7 个字符,则新字符串中不再包含最后一个字符If Len(Sql) = 0 Or Count = intColCnt Then…假如连接字符串为空,说明当前表为空表…或者不被当前表包含的汇总字段的个数等于汇总字段的总数,说明当前表不包含任何汇总字段GoTo Label1 …则进行下一个表的遍历End If…否则,说明存在汇总字段,需进行汇总Sql = "Select " & Sql & " FROM [" & strTbl & "$] " (3)ThisWorkbook.Sheets(1).Cells(65535,1).End(xlUp).Offset(1,0).CopyFromRecordset cn.Execute(Sql) (4)…其中Offset(行数,列数) 可进行偏移…其中Cells(65535, 1).End(xlUp) 为第1 列最下面的有数据的单元格,如果是A30…则Cells(65535, 1).End(xlUp).Offset(1, 0) 为向下偏移一行的单元格,则为A31…所以每次循环后得到的汇总表总是接在上一次显示结果的后面显示,故能将每次从不同文件、不同表中得到的…汇总结果依次显示在一个表中Label1:Next '对文件中的表遍历结束cn.Close ...关闭当前文件连接 (5)Workbooks(sName).Close False …关闭当前文件,不保存Next '文件遍历结束Set cn = Nothing (6)End Sub实例5:/dispbbs.asp?boardid=2&replyid=349626&id=159850&page=1&skin =0&Star=3Sql = "Select 商品号,min(价格) from [A$] where 性质='正常' and (商品号=‘129 002 003‟ or商品号= …128 002 003‟) group by 商品号"查找出“商品号”字段值为129 002 003 或者128 002 003 ,并且“性质”字段值为“正常”的记录,在这些记录中继续找出“价格”字段值最小的记录,返回该记录的商品号、价格的字段值实例6:/dispbbs.asp?boardid=2&replyid=347742&id=158259&page=1&skin =0&Star=4Sql = "select 品号,品类,sum(数量),sum(金额),'','','','','','',类型from [明细表$] where month(日期)=" & Month(Range(“J2”)) & " group by 品号,类型,品类order by 品号,类型desc"其中:Month 函数可从包含年月日的日期中取出月份来,故以上查询为:查询月份与J2 单元格中的月份相同的记录,按照品号分类,以品号、品类字段作为第一和第二关键字进行排序,其中类型字段为降序(desc)排列,按照字段名表指定的顺序:品号,品类,sum(数量),sum(金额),'','','','','','',类型进行显示,其中“数量”、“金额”字段显示的是符合条件的记录按“品号”分类的数值和,而“品号”、“品类”、“类型”字段,显示的是符合条件的记录在表中的原值,而显示时“金额”字段与类型字段之间相隔6 个字段的距离,在显示区域的这6 列为空白;在字段名表中不显示的字段用两个单引号('')代替,并仍然用逗号与其它字段名相隔。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1, 包含空值的记录f13 is null‘‘订单生成系统.xls‘f6-第6列,f2-第2列Private Sub Worksheet_Activate()On Error Resume NextDim x As Object, yy As Object, sql As StringSet x = CreateObject("ADODB.Connection")x.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;hdr=no;';Data Source=" & ActiveWorkbook.FullNamesql = "select f6,f2,f3,f4,f5,f7,f13,f24 -f25 from [sheet1$] where f24 -f25<f17 and (f13<>'C3' or f13 is null)" ‘不等于字符串用‘C3’包含空值用is nullSet yy = x.Execute(sql)Range("a:h").ClearContentsRange("a1:h1") = Array("编号", "品名", "规格", "产地", "单位", "件装", "属性", "计划") ‘表头另外赋值[a2].CopyFromRecordset yySet yy = NothingSet x = NothingEnd Sub2,用ADO Connection对象查询Option ExplicitPublic conn As ADODB.ConnectionSub Myquery()Dim sConnect$, sql1$Set conn = CreateObject("adodb.connection")Sheets("sheet1").Cells.ClearContentssConnect = "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;" & _"Data Source=" & ThisWorkbook.Path & "\" & sql1 = "select 物料代码,物料描述,属性,单位from [物料代码表$] where 属性= '采购' " '表格名要用[$],条件部分用单引号''ThisWorkbook.Sheets("sheet1").Cells(2, 1).CopyFromRecordset conn.Execute(sql1) 'copy 后面紧接SQL查询执行语句With Sheets("sheet1").Range("A1") = "物料代码" '建立表头.Range("B1") = "物料描述".Range("C1") = "属性".Range("D1") = "单位"End With'conn.Close '可不用每次关闭数据源的连接End Sub3,用记录集执行单个查询Option ExplicitSub Myquery()Dim rd As ADODB.RecordsetDim i%, j%, k%, sConnect$, sql1$, str$Set rd = New ADODB.Recordsetstr = "外协"Sheets("sheet1").Cells.ClearContentssConnect = "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;" & _"Data Source=" & ThisWorkbook.Path & "\" & 'conn.Open sConnect '打开数据源sql1 = "select 物料代码,物料描述,属性,单位from [物料代码表$] where 属性= '采购' " '表格名要用[$],条件部分用单引号''rd.Open sql1, sConnect, adOpenForwardOnly, adLockReadOnlyThisWorkbook.Sheets("sheet1").Cells(2, 1).CopyFromRecordset rdWith Sheets("sheet1").Range("A1") = "物料代码" '建立表头.Range("B1") = "物料描述".Range("C1") = "属性".Range("D1") = "单位"End Withrd.Close '关闭记录集Set rd=Nothing '关闭End Sub4,引用一列,如A列‘引用单列、单行、单个单元格.xls'引用一列,如A列Sub onecolumn()Dim Sql$Set Conn = CreateObject("Adodb.Connection")Conn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;hdr=no';data source=" & ThisWorkbook.Path & "\1.xls"Sql = "select f1 from [sheet1$]"Cells.Clear[a1].CopyFromRecordset Conn.Execute(Sql)Conn.CloseSet Conn = NothingEnd SubSub dgzbhz()'2008/12/2‘‘Book12021.xls‘由于分表的第2列表头是“金额”,不用它,改为“一中”,所以要用hdr=no无标题,拷贝时把第一行表头归零,所以最后要加表头。
Dim Sql$Set Conn = CreateObject("Adodb.Connection")[b2:d4] = ""arr = Array("一中", "二中", "三中")For i = 0 To UBound(arr)Conn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;hdr=no';data source=" & ThisWorkbook.Path & "\" & arr(i) & ".xls"Sql = "select f2 from [sheet1$]"Cells(1, i + 2).CopyFromRecordset Conn.Execute(Sql)Conn.CloseNext iSet Conn = Nothing[b1:d1] = arrEnd Sub‘test1203.xls EH‘有标题不用hdr=no,列名用编码文字,可往下连续取数据。
Private Function cnn() As ObjectSet cnn = CreateObject("ADODB.Connection")cnn.Open "Provider=Microsoft.Jet.Oledb.4.0;Extended Properties ='Excel 8.0;HDR=no';Data Source= " & ThisWorkbook.FullNameEnd FunctionSub onecolumn()Dim Sql$, Sht1 As Worksheet, Sht As WorksheetDim nSet Sht1 = Sheets("汇总")Sht1.Activate‘Set Conn = CreateObject("Adodb.Connection")‘Conn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0';data source=" & ThisWorkbook.FullNameFor Each Sht In SheetsIf <> "汇总" ThenSql = "select 编码from [" & & "$]"n = [b65536].End(xlUp).Row + 1Sht1.Cells(n, 2).CopyFromRecordset Cnn.Execute(Sql)End IfNext ShtCnn.CloseSet Cnn = NothingEnd Sub5,引用一行,如第1行'引用一Sub onerow()Dim Sql$Set Conn = CreateObject("Adodb.Connection")Conn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;hdr=no';data source=" & ThisWorkbook.Path & "\1.xls"Sql = "select * from [sheet1$a1:iv1]"Cells.Clear[a1].CopyFromRecordset Conn.Execute(Sql)Conn.CloseSet Conn = NothingEnd Sub6,引用一个单元格,如k1 单元格‘2013-3-14‘2260-1-1.htmlDim Sql$, ConnSub testit()Dim myPath$, mvvar, i&, myName$, Myr&Sheet1.Activate[a4:h500].ClearContentsSet Conn = CreateObject("Adodb.Connection")myPath = ThisWorkbook.Path & "\"myName = mvvar = (myPath)If TypeName(mvvar) <> "Boolean" ThenFor i = LBound(mvvar) To UBound(mvvar)If mvvar(i) <> myName ThenConn.Open "provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;hdr=no';data source=" & ThisWorkbook.Path & "\" & mvvar(i)Sql = "select * from [sheet1$h6:h6]"Myr = [a65536].End(xlUp).Row + 1If Myr < 4 Then Myr = 4Cells(Myr, 3).CopyFromRecordset Conn.Execute(Sql)Cells(Myr, 1) = Myr - 3Cells(Myr, 2) = Left(mvvar(i), Len(mvvar(i)) - 4)Sql = "select * from [sheet1$c14:c14]"Cells(Myr, 4).CopyFromRecordset Conn.Execute(Sql)Sql = "select * from [sheet1$c15:c15]"Cells(Myr, 5).CopyFromRecordset Conn.Execute(Sql)Sql = "select * from [sheet1$c16:c16]"Cells(Myr, 6).CopyFromRecordset Conn.Execute(Sql)Conn.CloseEnd IfNextElseMsgBox "没有找到文件。