Access把每一天的数据累加_VBA+SQL篇(第一章 查询编辑数据的ADO技术)

对于一个标准、规范的数据表单,即第一行是标题(字段名称)、每列是一个字段、每行是一条业务数据记录,那么这样的表单就可以当作数据库来操作,使用ADO建立连接,使用SQL进行查询汇总,使用数据透视表快速制作各种各样的统计分析报表。

1.1ADO对象模型

1.1.1引用ADO

在使用ADO之前,首先必须引用ADO对象库,可以按照下面的步骤进行。

步骤1:在Excel VBE编辑器窗口中执行“工具”-“引用”命令, 在打开的“引用-VBAPorject”对话框,在“可使用的引用”列表框中拖动右侧滚动条,找到ADO对象库 Microsoft ActiveX Data Objects 6.1,或者根据自己计算机的具体情况选择一个恰当的版本。如下图所示:

59781b6b43e7eb751e4b3cdac0686459.png

1.1.2什么是ADO

ADO是Active Data Objects的缩写。简单地说,ADO就是一个访问数据库中数据的编程接口。在Excel VBA中,可以使用ADO对象来创建或修改、查询数据表、查询满足条件的数据等。

利用ADO建立与Access数据库、工作簿,SQL Server数据库的连接,从而进行查询、修改等操作。

ADO对象模型主要包括连接(connection)、错误(Errors)、命令(Command)、参数(Parameters)、记录集(Recordset)和字段(Fields)等对象,各个对象都有自己的集合。

ADO的核心对象是connection、Command、Recordset,这3个对象可独立使用,也可以互相连接使用。在使用这些对象之前,都必须先声明对象变量。

声明连接、记录、命令对象的语句如下:

Dim cnn as ADODB.connection ‘声明一个连接对象

Set cnn= New ADODB.connection ‘新建一个连接类型的变量,并赋值给这个变量

Dim rs as ADODB.recordset

Set rs= New ADODB. recordset

首先定义一个xx类型的对象,再新建一个xx类型的变量并赋值给变量。

这两句代码可以简写成

Dim rs As New ADODB.recordset

ADO对象的功能如下:

connection对象:提供与包含路径、口令和连接选项的数据源的连接。

Command对象:保存一个针对数据源的将被执行的命令,最常见的是SQL命令。

Recordset对象:保存在记录集中执行查询参数的记录以及漫游记录的光标。

Errors对象:包含关于数据访问期间可能发生的错误贪睡。

Parameters对象:存储由Commana对象使用的单个参数。

Fields对象:记录集中包含所有的字段的集合。

Property对象:是由Data Provider驱动程序返回的数据源的属性。

1.2Connection对象及其使用

Connection对象代表打开的、与数据源的连接。每一个成功的连接都代表和数据源的一次会话,包括打开数据源到关闭数据源的连接之间的所有操作。

在建立与数据源的连接后,可以使用Connection对象的方法和属性来执行各种操作。

使用ConnectionString属性对连接进行初始化。

使用Provider属性指定OLEDB的提供者。

使用Open方法建立到数据源的物理连接。

使用Close方法切断与数据源的物理连接。

使用Execute方法执行针对连接的命令。

1.2.1声明并初始化Connection对象

为了能够访问数据库,首先必须建立与数据的连接。建立与数据库的连接是通过声明与打开Connection对象来实现的。

下面的语句就是首先声明一个Connection对象变量cnn,然后初始化该对象变量,即创建一个新的Connection对象。

Dim cnn as ADODB.connection

Set cnn= New ADODB.connection

也可以直接使用一句语句来实现:

Dim cnn as New ADODB.connection

当对cnn对象变量进行声明并初始化后,就可以使用Connection对象的ConnectionString、Provider属性和Open方法等来建立与数据库的连接了。

1.2.2Connection对象的常用属性

1.ConnectionString属性

ConnectionString属性是指用于建立到数据源的连接的信息。在Excel VBA中,它要写成如下形式。

cnn. ConnectionString=”provider=Microsoft.ace.oledb.12.0;datasource=数据源”

其中,cnn表示用户定义的Connection对象名称,provider=Microsoft.ace.oledb.12.0为用于连接的提供者名称,2007以上的版本都是12.0。“datasource=数据源”表示指定的数据源,数据源必须是带路径的数据库(工作簿)的名字。

2.Provider属性

Provider属性用来指示Connection对象的提供者的名称。对于Excel工作簿和Access数据库,Provider属性值为Microsoft.ace.oledb.12.0。

1.2.3Connection对象的常用方法

1.Open方法

Open方法用于打开到数据源的连接,其语法如下:

cnn.OpenconnectiongString,UserID,Password,Options

其中参数说明如下:

connectiongString:可选参数,表示连接信息的字符串。

UserID:可选参数,包含建立连接时要使用的用户名称。

Password:可选参数,包含建立连接时要使用的密码。

Options:可选参数,确定在建立连接之后(同步)还是在建立连接之间(异步)。默认值为adConnectUnspecified(值1),表示同步打开连接。

2.Close方法

Close方法用于关闭打开的Connection对象,断开与数据库的连接。其语法为:

cnn.close

3.Execute方法

Execute方法用于执行指定的查询、SQL语句等,其返回值是一个Recordset对象。
Execute方法有以下两种语法格式。

(1)对于不是以行返回的命令字符串的语法格式为:

cnn.Execute CommandText,RecordsAffected,Options

(2)对于以行返回的命令字符串的语法格式为:

Setrs=cnn.Execute(CommandText,RecordsAffected,Options)

其中参数说明如下:

rs:表示定义的Recordset对象

CommandText:表示要执行的SQL语句文本。

RecordsAffected:可选参数,指定提供者向其返回操作影响的记录数目。

Options:可选参数,指定提供者计算CommandText参数的方式。

1.2.4利用ADO连接Access数据库和Excel工作簿的连接字符串

不同类型的数据库,利用ADO建立连接的字符串是不一样的。

(1)Access(.accdb)数据库的连接字符串

cnn.ConnectionString=” provider=Microsoft.ace.oledb.12.0;datasource=带路径的Access数据库名”

(2)Excel工作簿(.xlsx)的连接字符串:

cnn.ConnectionString="Provider=microsoft.ace.oledb.12.0;"Extended Properties=Excel 12.0;Data Source=带路径的工作簿名称字符串”

1.2.5易读的ADO连接语句

一般情况下,我们可以把ADO连接语句写成更易读的结构。

(1)Access(.accdb)数据库

With cnn

    .Provider=”Microsoft.ace.oledb.12.0”

    .ConnectionString=”datasource=带路径的Acess数据库名”

    .Open

End with

假如文件夹d:\temp下有一个Acess数据库“数据.accdb”,那么建立ADO连接的语句如下:

With cnn

    .Provider=”Microsoft.ace.oledb.12.0”

    .ConnectionString=”datasource=d:\temp\数据.accdb”

    .Open

End with

(2)Excel工作簿(.xlsx)的连接字符串

With cnn

    .Provider=”Microsoft.ace.oledb.12.0”

    .ConnectionString=”ExtendedProperties=Excel 12.0;data source=带路径的Acess数据库名”

    .Open

End with

假如文件夹d:\temp下有一个工作簿“数据.xlsm”,那么建立ADO连接的语句如下:

With cnn

    .Provider=”Microsoft.ace.oledb.12.0”

    .ConnectionString=”ExtendedProperties=Excel 12.0;data source= d:\temp\数据.xlsm”

    .Open

End with

1.3Recordset对象

Recordset对象代表记录集,是基于某个连接的表的执行结果。在ADO对象模型中,所有对数据源的操作几乎都是由Recordset对象完成的。通过使用Recordset对象,可以浏览记录、修改记录、添加、删除记录。

1.3.1声明并初始化Recordset对象

在建立了与数据库的边接后,就可以声明并初始化一个新的Recordset对象。打开该对象,就可以浏览、编辑、查询、删除数据表数据等。

声明和初始化一个新的Recordset对象并打开该对象的语句如下:

Dim rs As ADODB.Recordset

set rs=new ADODB.Recordset

或者直接使用下面一句语句:

Dim rs As New ADODB.Recordset

如果要进行多次查询,那么就需要使用第一种声明方法。如果仅做一次查询,则使用第二种声明方法即可。

1.3.2Recordset对象的游标类型和锁定类型

使用记录集时,记录对象的游标(CursorType)决定了不同的数据获取方式。

游标是用来控制记录定位、数据可更新性,以及决定是否可见其他用户对数据库所做的更改的数据库元素的,不同的设置各有一定的使用范围。

ADO中定义了4种不同的游标类型。

1、动态游标(adOpenDynamic):是功能最强的游标,可以看到其他用户所做的添加、更改和删除,支持Recordset对象中所有的移动类型。

2、键集游标(adOpenKeyset):其行为类似动态游标,不同的只是它禁止查看其他用户添加的记录,并且禁止访问其他用户删除的记录,其他用户所做的数据更改依然可见。

3、静态游标(adOpenStatic):提供记录集的静态副本,可用来查找数据或生成报告;支持Recordset 中的所有移动类型。其他用户所做的添加、更改或删除将不可见。

4、仅向前游标(adOpenForwardOnly):只允许Recordset中向前滚动。其他用户所做的添加、更改或删除将不可见。当只需要对Recordset进行一次传递时,仅向前游标在性能上有明显优势。

2.锁定类型

锁定类型(LockType)将影响Recordset对象的并发事件的控制处理方式,还决定了记录集的更新是否能批量进行。ADO中定义的锁定类型有4种:

(1)开放式批更新(adLockBatchOptimistic):当编辑记录时不会被锁定、修改、插入及删除是在批量处理的方式下进行的,只有在批处理更新时才锁定。

(2)开放式(adLockOptimistic):逐个记录开放式锁定的方式,数据提供者只是在调用update方法时锁定记录,在此之前可以对不前记录进行各种更新操作。

(3)保守式(LockPessimistic):逐个记录保守式锁定的方式,数据提供者要确保记录编辑成功,通常在编辑时立即在数据源锁定记录。这是一种最安全的方式,同时也会降低并发程度。

(4)只读(LockReadOnly):记录集的记录是只读的,无法改变数据。

1.3.3Recordset对象的常用属性

1. Recordcount属性

Recordcount属性返回LongLong值(Excel2010以前版本是Long值),表示Recordset对象中的记录数目。

例如,rs. Recordcount 的结果就是查询结果的记录数目。

在使用Recordcount属性时,要特别注意Recordset对象的游标类型将影响是否能确定记录的数目。对于仅向前游标,Recordcount属性将返回1;对于静态或键集游标,将返回实际计数;而对于动态游标,则返回1或实际计数。

一般情况下,建议将Recordset对象的游标类型设置为键集游标(adOpenKeyset)。

2.BOF属性和EOF属性

BOF属性表示当前记录的位置在Recordset对象的第一个记录之前。

EOF属性表示当前记录的位置在Recordset对象的最后一个记录之后。

BOF属性和EOF属性返回Boolean值。

当记录指针指向某个记录时,BOF属性和EOF属性的值均为false,表示没有到达记录集的开始处和结束处。

当记录指针指向某个记录的开始处时,BOF属性值为true,而EOF属性值为false。

当记录指针指向某个记录的结束处时,BOF属性值为false,而EOF属性值为true。

如果BOF属性和EOF属性的值均为true,表示记录集中没有记录。

3.Fields属性

Recordset对象的Fields属性是Fields集合的一个引用对象,包含与当前记录有关的字段。例如:

rs.fields(0).value表示引用记录集的第一个字段值。

rs.fields(0).name表示引用记录集的第一个字段名称。

当然,也可以直接使用字段名引用记录集的字段信息。例如:

rs.fields(“客户名称”).value

rs.fields(“客户名称”).name

1.3.4Recordset对象的常用方法

Recordset对象常用方法有以下:

1.Open方法

Open方法用于打开一个Recordset对象,其语法如下:

rs.OpenSource,ActiveConnection,CursorType,LockType,Options

其中参数说明如下:

Source:可选参数,可以是Command对象、SQL语句、数据库的表名等。

ActiveConnection:可选参数,表示一个ADO连接。

CursorType:可选参数,用于确定打开Recordset对象时使用的游标类型,默认值为adOpenForwardOnly。一般建议使用adOpenKeyset。

LockType:可选参数,用于确定打开Recordset时提供者应使用的锁定类型,默认值为adLockReadOnly(只读)。如果要对数据库进行修改、删除、更新等操作,则必须设定为adLockOptimistic。

Options:可选参数。

下面的语句就是打开用户定义的记录集rs,数据源是SQL语句,ADO连接是cnn,使用键集游标adOpenKeyset,锁定类型为adLockOptimistic。

rs.open SQL,cnn, adOpenKeyset, adLockOptimistic

当要取得表的全集,即所有行、所有列数据,可以直接用表名作为数据集来源。

例如,下面语句是查询Access数据库中的“资料表”的所有数据。

rs.open “资料表”,cnn, adOpenKeyset, adLockOptimistic

下面语句是查询指定工作簿中的工作表Sheet1的所有数据。

rs.open “[Sheet1$]”,cnn, adOpenKeyset, adLockOptimistic

2.close方法

close方法用于关闭一个打开的recordset对象。其语法如下:

rs.close

3.AddNew方法

AddNew方法用于为数据表创建一条新记录。其语法如下:

rs.AddNew Fieldlist,values

其中参数说明如下:

Fieldlist:可选参数,表示新记录中字段的单个名称,名称数组或序号位置数组。

values:可选参数,表示新记录中字段的单个值或值的数组。

例如,下面的语句是为“合同信息”数据表增加一条新记录。

with rs

    .addnew

.fields(“合同号”)=”00001”

.fields(“合同金额”)=10000

.update

end with

4.Update方法

Update方法用于保存对recordset对象的当前行或者recordset对象的fields集合所做的更改。Update方法的语法如下:

rs.update

5.Delete方法

Delete方法用于删除当前记录或记录组。其语法如下:

rs.Delete AffectRecords

其中,参数AffectRecords确定delete方法影响的记录数目。

注意,delete方法支持数据库,但不支付excel工作表。

6.Move及其系统方法

Move及其系列方法可以例指针相对于某一条记录移动,也就是做相对移动。这些方法非常直观,容易控制,是很常用的方法。其语法如下:

rs.move rows,start

其中参数说明如下:

rows:表示要相对移动的行数,如果为正值,表示向后移动;如果为负值,表示向前移动。

start:一条记录的bookmark值,表示从哪条记录开始相对移动。如果这项不给出,则从当前记录开始移动指针。

除了直接使用move方法之外,还有一些move系列方法,可以很方便地控制指针的移动,包括movefirst方法、movelast方法、movenext方法、moveprevious方法。其语法如下:

rs.movefirst

rs.movenext

movefirst:移动指针到表中第一条记录。

movelast:移动指针到表中最后一条记录。

movenext:移动指针到当前记录的下一条记录上,等于recordset.move 1.

movePrevious:将指针移动到当前记录的上一条记录上,等于recordset.move -1

1.4Fields集合与Field对象

Recordset对象包含一个由Field对象组成的Field集合。每个Field对象对应于Recordset对象的一列(字段)。使用Field对象的value属性可设置或返回当前记录的数据。

1.4.1Fields集合的常用属性和方法

Fields集合的常用属性是count,返回一个记录集的字段数目。例如,下面的语句是返回记录集的字段个数。

rs.fields.count

Fields集合的常用方法有Append方法和Delete方法。

1. Append方法

Append方法用于创建的新的Field对象(字段)追加到Fields集合中。其语法如下:

fields.AppendName,Type,DefinedSize,Attrib,FieldValue

其中参数说明如下:

Name:新Field对象的名称(字段名),该名称不能与Fields集合中其他任何对象的名称相同。

Type:指定新字段的数据类型,用VBA常量或具体的数值表示。例如,adCurrency表示货币类型,adChar表示字符串型,adInteger表示整型等。

DefinedSize:可选参数,表示新字段的定义大小(以字符或字节为单位)。

Attrib:可选参数,指定新字段的一个或多个属性,其默认值为adFldEefault。

FieldValue:可选参数,表示新字段的值,如果未指定,将把null值追加到字段中,需要注意的是,Append方法只适合于数据库,不适合excel工作表。

2.Delete方法

Delete方法用于删除数据表中的的字段。其语法如下:

fields.delete field

其中,field指定要删除的field对象。此参数可以是field对象的名称(字段名),或者field对象本身的序号位置。

需要注意的是,Delete方法只适合于数据库,不适合excel工作表。

1.4.2Fields对象的常用属性

每个Field对象都对应于recordset中的一列(也就是字段)。由于所有的Field对象组成了一个Fields集合,因此引用每个字段有以下几种方法。

(1)使用Fields集合的序号,即Fields(n),其中n是一条记录中字段从左到右排列的序号。注意,第一个字段的序号为0,第二个字段的序号为1,依次类推。

(2)使用字段名,即Fields(“编号”),Fields(“姓名”)等。

(3)使用“!”号,直接在记录集对象中引用字段名称,如“rs!姓名”

(4)直接在记录集对象中引用字段名称,但不使用“!”,则是使用”()”,例如,“rs(“编号”)”、“rs(“姓名”)”等。

注意:Fields(“字段名”),“rs(“字段名”)”中的字段名一定要与数据表中的字段名一致,不能有空格等符号。

Field对象的常用属性有name、value属性。

Name属性:返回字段名。

Value属性:返回字段值。Value为Field对象的默认属性,在实际使用中可以不写value。

1.5ADO查询数据的例子

1.5.1从Access数据库查询数据

在工作簿同路径文件夹下有销售记录.accdb文件,要统计2020数据表中销售额大于10000的数据,并保存在查询数据工作表中。

6ecb723260fff6d89ce473ecfdf020d0.png

Sub 查询数据()

Dim cnnAs New ADODB.Connection

Dim rsAs New ADODB.Recordset

Dim SQLAs String

Dim wsAs Worksheet

Dim i AsInteger

Set ws =ThisWorkbook.Worksheets("查询数据")

ws.Cells.Clear

'建立与access数据库的连接

With cnn

    .provider ="microsoft.ace.oledb.12.0"

    .connectionstring = "datasource=" & ThisWorkbook.Path & "\销售记录.accdb"

    .Open

End With

'设置查找语句

SQL ="select * from 2020年 where 销售额>=10000"

rs.OpenSQL, cnn, adopenkeyset, adlockoptimistic

'复制字段列表,制作报表标题

For i =1 To rs.Fields.Count

    ws.Cells(1, i) = rs.Fields(i - 1).Name

Next i

'用CopyFromRecordset方法复制记录到查询表中

ws.Range("a2").CopyFromRecordsetrs

'关闭连接,释放变量

rs.Close

cnn.Close

Set rs =Nothing

Set cnn= Nothing

End Sub

执行代码后,查询效果如下:

06dde947e52f3f37ff58c0ca0329b4d6.png

1.5.2从Excel表中查询数据

销售记录表中有以下数据,现要查询销售额大于10000的记录,并保存在查询数据工作表中。

6e19b3a6bf7aa0333cb7454c5286a7a7.png

Sub 从工作簿查询数据()

Dim cnnAs New ADODB.Connection

Dim rsAs New ADODB.Recordset

Dim SQLAs String

Dim wsAs Worksheet

Dim i AsInteger

Set ws =ThisWorkbook.Worksheets("查询数据")

ws.Cells.Clear

'建立与Excel工作表的连接

With cnn

    .provider ="microsoft.ace.oledb.12.0"

    .connectionstring = "extendedproperties =excel 12.0;data source=" & ThisWorkbook.Path & "\实例.xlsm"

    .Open

End With

'设置查找语句

SQL ="select * from [销售记录$] where 销售额>=10000"

rs.OpenSQL, cnn, adopenkeyset, adlockoptimistic

'复制字段列表,制作报表标题

For i =1 To rs.Fields.Count

    ws.Cells(1, i) = rs.Fields(i - 1).Name

Next i

'用CopyFromRecordset方法复制记录到查询表中

ws.Range("a2").CopyFromRecordsetrs

'关闭连接,释放变量

rs.Close

cnn.Close

Set rs =Nothing

Set cnn= Nothing

End Sub

1.5.3设计窗体,实现Excel工作簿的条件查询

仍然以“销售记录”工作表中数据为例,按照地区,城市和销售额的任意组合进行查询。

26c17f8df1a163e55d746b0bbc47ccf7.png

当地区发生变化时,把选择的城市添加到ComboBox2,用ComboBox1的Change事件,代码如下:

PrivateSub ComboBox1_Change()

Dim conAs New ADODB.Connection

con.Open"Provider=microsoft.ace.oledb.12.0;" & "ExtendedProperties=Excel 12.0;" & "Data Source=" &ThisWorkbook.FullName

    Dim rscs As ADODB.Recordset

        Dim sqlcs As String

            Dim i As Integer

            sqlcs = "select distinct 城市 from [销售记录$]where 地区='" & ComboBox1.Value &"'"

            Set rscs = New ADODB.Recordset

            rscs.Open sqlcs, con, adOpenKeyset,adLockOptimistic

        With ComboBox2

                .Clear

                .Visible = True

                .Font.Size = 16

          For i = 1 To rscs.RecordCount

             .AddItem rscs("城市").Value

             rscs.MoveNext

            Next i

    End With

    rscs.Close: Set rscs = Nothing

    con.Close: Set con = Nothing

End Sub

当销售额发生变化时,根据不同的选择显示textbox1,textbox2这两个文本框。用ComboBox3的Change事件,代码如下:

PrivateSub ComboBox3_Change()

Dim conAs New ADODB.Connection

con.Open"Provider=microsoft.ace.oledb.12.0;" & "ExtendedProperties=Excel 12.0;" & "Data Source=" &ThisWorkbook.FullName

    If ComboBox3.Value = "大于" Or ComboBox3.Value = "小于" Or ComboBox3.Value = "大于等于"Or ComboBox3.Value = "小于等于" OrComboBox3.Value = "等于" Then

        Label2.Visible = False

        TextBox2.Visible = False

    Else

        Label2.Visible = True

        TextBox2.Visible = True

    End If

    con.Close: Set con = Nothing

End Sub

查询语句:

PrivateSub CommandButton1_Click()

Dim cnnAs New ADODB.Connection

Dim rsAs New ADODB.Recordset

Dim SQLAs String

Dim wsAs Worksheet

Dim i AsInteger

Set ws =ThisWorkbook.Worksheets("查询数据")

ws.Cells.Clear

'建立与access数据库的连接

With cnn

    .provider = "microsoft.ace.oledb.12.0"

    .connectionstring = "extendedproperties =excel 12.0;data source=" & ThisWorkbook.Path & "\实例.xlsm"

    .Open

End With

'设置查找语句

IfComboBox1.Value <> "" And ComboBox2.Value <> ""Then

        If ComboBox3.Value = "等于" Then

            SQL = "select * from [销售记录$] where 地区='" & ComboBox1.Value & "'" & "and 城市='" & ComboBox2.Value & "'" & "and 销售额=" & TextBox1.Value

        ElseIf ComboBox3.Value = "大于" Then

            SQL = "select * from [销售记录$] where 地区='" & ComboBox1.Value & "'" & "and 城市='" & ComboBox2.Value & "'" & "and 销售额>" & TextBox1.Value

        ElseIf ComboBox3.Value = "小于" Then

            SQL = "select * from [销售记录$] where 地区='" & ComboBox1.Value & "'" & "and 城市='" & ComboBox2.Value & "'" & "and 销售额

        ElseIf ComboBox3.Value = "小于等于" Then

            SQL = "select * from [销售记录$] where 地区='" & ComboBox1.Value & "'" & "and 城市='" & ComboBox2.Value & "'" & "and 销售额<=" & TextBox1.Value

        ElseIf ComboBox3.Value = "大于等于" Then

            SQL = "select * from [销售记录$] where 地区='" & ComboBox1.Value & "'" & "and 城市='" & ComboBox2.Value & "'" & "and 销售额>=" & TextBox1.Value

        ElseIf ComboBox3.Value = "介于" Then

            SQL = "select * from [销售记录$] where 地区='" & ComboBox1.Value & "'" & "and 城市='" & ComboBox2.Value & "'" & "and 销售额 between " & TextBox1.Value & " and " &TextBox2.Value

        End If

End If

IfComboBox1.Value <> "" And ComboBox2.Value = "" Then

        If ComboBox3.Value = "等于" Then

            SQL = "select * from [销售记录$] where 地区='" & ComboBox1.Value & "'" & "and 销售额=" & TextBox1.Value

        ElseIf ComboBox3.Value = "大于" Then

            SQL = "select * from [销售记录$] where 地区='" & ComboBox1.Value & "'" & "and 销售额>" & TextBox1.Value

        ElseIf ComboBox3.Value = "小于" Then

            SQL = "select * from [销售记录$] where 地区='" & ComboBox1.Value & "'" & "and 销售额

        ElseIf ComboBox3.Value = "小于等于" Then

            SQL = "select * from [销售记录$] where 地区='" & ComboBox1.Value & "'" & "and 销售额<=" & TextBox1.Value

        ElseIf ComboBox3.Value = "大于等于" Then

            SQL = "select * from [销售记录$] where 地区='" & ComboBox1.Value & "'" & "and 销售额>=" & TextBox1.Value

        ElseIf ComboBox3.Value = "介于" Then

            SQL = "select * from [销售记录$] where 地区='" & ComboBox1.Value & "'" & "and 销售额 between " & TextBox1.Value & " and " &TextBox2.Value

        End If

End If

rs.OpenSQL, cnn, adOpenKeyset, adLockOptimistic

'复制字段列表,制作报表标题

For i =1 To rs.Fields.Count

    ws.Cells(1, i) = rs.Fields(i - 1).Name

Next i

'用CopyFromRecordset方法复制记录到查询表中

ws.Range("a2").CopyFromRecordsetrs

'关闭连接,释放变量

rs.Close

cnn.Close

Set rs =Nothing

Set cnn= Nothing

End Sub

窗体初始化,

PrivateSub UserForm_Initialize()

Dim conAs New ADODB.Connection

con.Open"Provider=microsoft.ace.oledb.12.0;" & "ExtendedProperties=Excel 12.0;" & "Data Source=" &ThisWorkbook.FullName

   Dim rsdq As ADODB.Recordset

        Dim sqldq As String

            Dim i As Integer

            sqldq = "select distinct 地区 from [销售记录$]"

            Set rsdq = New ADODB.Recordset

            rsdq.Open sqldq, con, adOpenKeyset,adLockOptimistic

            With ComboBox1

                .Clear

                .Visible = True

                .Font.Size = 16

          For i = 1 To rsdq.RecordCount

             .AddItem rsdq("地区").Value

             rsdq.MoveNext

            Next i

    End With

       rsdq.Close: Set rsdq = Nothing

       con.Close: Set con = Nothing

    ComboBox3.List = Array("大于", "小于", "大于等于", "小于等于", "等于", "介于")

    ComboBox3.Font.Size = 16

End Sub

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值