700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > EXCEL之VBA窗体应用实例

EXCEL之VBA窗体应用实例

时间:2022-04-10 07:42:49

相关推荐

EXCEL之VBA窗体应用实例

EXCEL查询ACCESS数据小工具演示

初始化窗口界面

连接并提取数据后的界面

今天突然想学习弄个在EXCEL中查询ACCESS数据库的小工具,给大家分享一下。

首先介绍一下这小工具的功能。

一、自行选择要查询的ACCESS数据库文件,并把详细路径及文件名显示出来。

二、查询数据库后把当前的查询语句整体显示出来。

三、连接数据库后,把数据库所有的字段名提取出来,然后可以自行选择需要的字段查询及提取数据,可以重复使用不同条件查询。

四、手动设置要打开的数据库的表名,如果不设置默认和表名和数据库名一样。

五、指定显示数量

六、支持单个字段排序(暂时没设置多字段排序)

七、可自定义筛选条件

八、添加数据到EXCEL工作表

九、显示连接状态

在连接数据的时候有一个注意事项,比如 “select 订单号,收货人,手机 from 订单信息”可以正常查询,但“select 订单号,商品数量(件),收货人,手机 from 订单信息”就会出错,括号读取不了,表名也会存在同样的情况,这时可以把这些字段名或表名都用英文的中括号[]括起来就可以正常读取。

比如:select [订单号],[商品数量(件)],[收货人],[手机],[省],[市],[区],[街道],[商品规格],[商家备注] from [订单信息] where 订单状态="待签收" order by [订单确认时间] asc

通过变量连接查询条件,注意留空格。

下面附上代码,有兴趣的可以新建一个窗口,加上对应的控件测试。

Public cnn As Object数据库连接

Public strcnn As String ACCESS连接语句

Public sql As String sql查询语句

Public rs As Object 临时数据表纪录

Public fileToOpen 数据库的完整路径和名称

Public mytable As String 数据表名称

Public arr

Private Sub CommandButton5_Click()

rs.Close

cnn.Close

Set rs = Nothing

Set cnn = Nothing

Label3.Caption = "已断开连接"

断开连接并把连接状态显示为“已断开连接”

End Sub

Private Sub CommandButton6_Click()

Cells.EntireColumn.AutoFit 自动调整列宽

End Sub

一个名为开始链接的按钮单击事件

Private Sub 开始连接_Click()

Set cnn = CreateObject("ADODB.Connection")

Select Case Application.Version * 1 设置连接字符串,根据版本创建连接

Case Is <= 11

strcnn = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" & fileToOpen

Case Is >= 12

strcnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & fileToOpen

End Select

cnn.Open strcnn 打开数据库

设置sql查询语句

Set rs = CreateObject("ADODB.Recordset")

mytable = "[" & 数据表名称.Text & "]" 获取文件框中输入的数据表名

sql = "select * from " & mytable 第一次连接数据库时选择所有字段

Set rs = cnn.Execute(sql) 执行查询,并将结果输出到记录集对象

ReDim arr(0 To rs.Fields.Count) 改变数组大小

For i = 0 To rs.Fields.Count - 1 获取字段名,并保存到数组里

arr(i) = rs.Fields(i).Name

Next

For i = 0 To UBound(arr) 从数组里把字段名填写到列表框和复合框(下拉选择框)

ListBox1.AddItem arr(i) 为什么先把记录集保存到数组再从数组添回到列表框和复合框呢?

ComboBox1.AddItem arr(i) 因为后面要重新选择字段名,记录集对象会变化,这里需要的是全部字段名

Next

Label3.Caption = "已连接" 设置显示连接状态

End Sub

一个名字为"选择文件"的按键单击事件

Private Sub 选择文件_Click()

Dim fileN

fileToOpen = Application.GetOpenFilename("Text Files (*.accdb), *.mdb")

打开一个打开对话框,选择文件并不会真正打开文件,只是提取文件路径,后面设定显示的文件类型,不设置为全部类型。

If fileToOpen = False Then

MsgBox "没有选择文件"

Else

TextBox1.value = fileToOpen

End If

fileN = Split(fileToOpen, "\")

fileN = fileN(UBound(fileN))

fileN = Replace(fileN, ".accdb", "") 这里把扩展名去掉,由于已经知道扩展名,直接把扩展名去掉,如果不确定扩展名,可以再使用一次Split函数以英文句点"."分界,然后再取值就可以了。

数据表名称.Text = fileN

上面4行代码是从文件路径中把文件名提取出来,去掉扩展名

End Sub

Private Sub 清空当前工作表_Click()

提取数据到工作表的时候已经添加了一个清除工作表的代码,这个按钮可有可无,可能有时也能用上。

Cells.Clear

End Sub

Private Sub 提取数据到EXCEL表_Click()

不懂英语,所以变量名都是起得很随意的

Dim px As String 排序

Dim tj As String 筛选条件

Dim zd As String 要显示的字段

Dim sl As String 显示数量

Dim a As Integer 统计是否有选择要显示的字段

这个文本框是设置要显示的数量的

If TextBox3 <> "" Then

sl = "top " & TextBox3.Text & " "

Else

sl = ""

End If

一个名为textbox2的文本框的值如果不为空的时候执行,这个是用来设置筛选条件的。

If TextBox2.Text <> "" Then

tj = " where " & TextBox2.Text

Else

tj = ""

End If

读取选择的字段名,变量a用于计算有几个字段被选择了

zd = ""

a = 0

For i = 0 To UBound(arr)

If ListBox1.Selected(i) = True Then 如果列表框对应行选择状态为ture时,就是被选择了,从0开始,0是第一行。

a = a + 1

zd = zd & ",[" & arr(i) & "]" 注意,这里为每一个字段名都用中括号括起来,如果不用中括号括起来,字段名有括号会报错

End If

Next

根据变量判断是否选择了要显示的字段,如果没有选择默认为全部

If a > 0 Then

zd = Mid(zd, 2, Len(zd))

Else

MsgBox "没有选择要显示的字段,默认显示全部字段"

zd = "*"

End If

一个名为ComboBox1的复合框,用于设置排序条件信息

If ComboBox1.Text <> "" And OptionButton1.value = ture Then

px = " order by [" & ComboBox1.Text & "] desc"

ElseIf ComboBox1.Text <> "" And OptionButton2.value = ture Then

px = " order by [" & ComboBox1.Text & "] asc"

Else

px = ""

End If

sql = "select " & sl & zd & " from " & mytable & tj & px

TextBox4.Text = sql

Set rs = cnn.Execute(sql) 执行查询,并将结果输出到记录集对象

ActiveSheet.Cells.Clear 清除当前活动工作表

For i = 0 To rs.Fields.Count - 1 填写字段名

Cells(1, i + 1) = rs.Fields(i).Name

Next i

Range("A2").CopyFromRecordset rs 从A2开始填入提取的数据

Cells.EntireColumn.AutoFit 自动调整列宽

End Sub

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。