乔山办公网我们一直在努力
您的位置:乔山办公网 > excel表格制作 > 如何在<em>EXCEL</em>中自动<em>读取ACCESS数据</em&

如何在<em>EXCEL</em>中自动<em>读取ACCESS数据</em&

作者:乔山办公网日期:

返回目录:excel表格制作


实现你的要求有编程和非编程两种办法

先说编程的方法:

可以在数据库端编写程序,每当ACCESS数据库表发生变化时同时将变更写入EXCEL文档中;也可在电子表格端用EXCEL工作表显示来自ACCESS数据库某张表的内容,并用VBA编写代码每隔一段时间自动刷新其数据源。编程的方法说起来简单但是实施起来涉及的技术细节很多、工作量不小,尤其是数据库端编程更是如此,挺费事的,就不提供具体程序了。

再说非编程方法,以你的程度来看这种方法也许更加适合:

打开EXCEL文档选择其中一个工作表,点击 数据——导入外部数据——新建数据库查询 打开 选择数据源对话框 在数据库选项卡选择“MS Access Database*”点击确定按钮 打开选择数据库对话框 选择要连接的ACCESS数据库文件所在的驱动器、文件夹和数据库文件名 点击确定按钮 打开 查询向导 - 选择列 对话框 双击 左边“可用的表和列” 中的某张表 点击 “>”按钮将需要输出的字段送到右边“查询结果中的列”之中,连续点击“下一步”直到“完成”按钮 出现 选择 “将数据返回Microsoft Office Excel”点击“完成”按钮 打开 导入数据对话框 选择 “现有工作表”点击“确定”按钮后 系统会将ACCESS表中的数据导入到EXCEL工作表中。

数据导入工作表后,如要反映ACCESS数据表的最新变动情况,请右击其中一个有数据的单元在弹出菜单中选择点击“刷新数据”即可。

你还可以随时调整“数据区域属性”以便实现“自动刷新数据”等功能,办法如下:

右击其中一个有数据的单元在弹出菜单中选择点击“数据区域属性”打开 外部数据区域属性 对话框 设置适合自己要求的属性后 点击“确定”按钮即可

涉及的图片较多,这里只给出“数据区域属性”对话框截图供参考 

2.使用非编程方法虽然可以自动刷新跟进数据库的变动情况,但是其刷新频率最短只能设定为1分钟,如果需要将刷新频率缩短至秒级则需要编写VBA程序。下面是相关VBA代码:

首先导入数据库表的方法请参照上列手动非编程方法之说明

导入数据后请右击其中一个有数据的单元格,在弹出菜单中选择点击“数据区域属性”打开 外部数据区域属性 对话框(见附图) 修改外部数据区域的各个属性如下,然后点击确定

名称:QuertTbl

允许后台刷新复选框:不勾选

刷新频率复选框:不勾选

打开工作簿时,自动刷新复选框:勾选

第二步 编写VBA程序

1)使用快捷键Alt+F11 打开VBE(Visual Basic Editor)编辑器

2)单击菜单 插入——模块,打开模块代码窗口

3)在右边代码窗口输入以下代码:

'这段代码执行刷新数据源动作

Sub AutoRefresh()

    Sheets("sheet1").QueryTables("QueryTbl").Refresh

    Call AUTO_OPEN

End Sub

'这段代码设定刷新频率为10秒。注意刷新频率越高系统开销越大在数据量较大时更要注意这个问题,请尽量设定较长的刷新时间间隔。

Sub AUTO_OPEN()

    Application.OnTime Now + TimeValue("00:00:10"), "AutoRefresh"   

End Sub

4)在左边对象窗口,双击Microsoft Excel对象下的 Sheet1(Sheet1),在右边代码窗口输入以下代码:

'这段代码,令每次从其他工作表转到工作表1时刷新数据源

Private Sub Worksheet_Activate()

    Sheets("sheet1").QueryTables("QueryTbl").Refresh   

End Sub

第三步退出VBE编辑器,关闭工作簿,记得保存修改。

重新打开工作簿后,系统会提示安全警告,请点击“启用宏按钮”,跟着系统会提示查询刷新,请点击“启用自动刷新”按钮。之后工作簿就会每5秒自动刷新数据源,当你从其他工作表跳回工作表1时,即使未到刷新时间系统也7a686964616fe4b893e5b19e364会立即刷新数据。

附:用代码创建新的工作表并写入值的函数使用方法。

Dim xlapp As Excel.Application

    Dim xlbook As Excel.Workbook

    Dim xlsheet As Excel.Worksheet

    Set xlapp = CreateObject("excel.application")

    Set xlbook = xlapp.Workbooks.Add

    xlbook.Saveas "c:\aaa.xls"'你要保存的文件路径

    xlapp.Visible = True '设置EXCEL对象可见(或不可见)

    Set xlsheet = xlbook.Worksheets(1) '设置活动工作表

    xlsheet.Cells(1, 1) = "aa" '给单元格(row,col)赋值

    xlsheet.Cells(1, 2) = "bb"

    xlbook.Close (True) '关闭工作簿

    xlapp.Quit '结束EXCEL对象

    Set xlapp = Nothing '释放xlApp对象



用access自动获取excel里的数据的方法就是通过代码的方式导入。
如果是手动导入比较清楚的话,这个实现起来不难,请参考下面的介绍来实现:
首先,新建一个工程,在工程中引用如下对象ADO对象(用于连接ACCESS数据库,可用其它方式),添加一个窗体(from1),在窗体上添加如下控件:
两个文本框,用来显示EXCEL文件路径和ACCESS路径;
四个扭钮,两个用来游览,另两个是导入和退出;
两个通用对话框控件,用来打开ACCESS和EXCEL文件,一个进度条控件,用来显示导入进程。
该实例的导入是将ACCESS数据库中表的字段名单独存放7a686964616fe4b893e5b19e333在另外一个表中,导入时按表中所存字段名的顺序进行导入,不是按EXCEL表的顺序导入,这样在实际中是很实用的.
因为好多时候EXCEL表中字段顺序和ACCESS中字段顺序有可能不是一致的.
代码如下:
Dim v
Option Explicit
Private Sub cmdLoad_Click()
Dim excel_app As Object
Dim excel_sheet As Object
If txtExcelFile.Text = "" Then
MsgBox "请选择EXCEL表"
Else
Dim new_value As String
Label2.Caption = "正在导入,请稍候..."
Screen.MousePointer = vbHourglass
DoEvents
'' Create the Excel application.
Set excel_app = CreateObject("Excel.Application")
'' Uncomment this line to make Excel visible.
excel_app.Visible = True
'' Open the Excel spreadsheet.
excel_app.Workbooks.open FileName:=txtExcelFile.Text
'' Check for later versions.
If Val(excel_app.Application.Version) >= 8 Then
Set excel_sheet = excel_app.ActiveSheet
Else
Set excel_sheet = excel_app
End If

Dim u ''求EXCEL表中记录的条数,以便控制进度条
u = 1
Do
If Trim$(excel_sheet.Cells(u, 1)) = "" Then Exit Do
u = u + 1
Loop
bar.Max = u - 1
strSQL = "select * from TestValues"
yourRecord.open strSQL, myConn, adOpenDynamic, adLockOptimistic ''打开记录集
Dim sql As String

sql = "select * from fields order by xue"
myRecord.open sql, myConn, adOpenDynamic, adLockBatchOptimistic ''打开字段记录集
myRecord.MoveFirst
'' Get data from the Excel spreadsheet and insert
'' it into the TestValues table.

Dim v ''导入记录,用了两层循环
v = 1
Do
If Trim$(excel_sheet.Cells(v, 1)) = "" Then Exit Do ''外层,
yourRecord.AddNew
Dim i
For i = 1 To myRecord.RecordCount
'' Get the next value.
new_value = Trim$(excel_sheet.Cells(v, i))
'' See if it''s blank.
''If Len(new_value) = 0 Then Exit Do
'' Insert the value into the database.
Dim bb As String
bb = myRecord("name")
yourRecord(bb) = new_value
myRecord.MoveNext
Next i
bar.Value = v
v = v + 1
myRecord.MoveFirst
Loop
yourRecord.Update

'' Comment the rest of the lines to keep
'' Excel running so you can see it.
'' Close the workbook without saving.
excel_app.ActiveWorkbook.Close False
'' Close Excel.
excel_app.Quit
Set excel_sheet = Nothing
Set excel_app = Nothing
myRecord.Close
yourRecord.Close
Set myRecord = Nothing
Set yourRecord = Nothing
Label2.Caption = "导入完毕"
Screen.MousePointer = vbDefault
MsgBox "共导入" & Format$(v - 1) & "条记录"

End If
End Sub
Private Sub Command1_Click()
Unload Me
End Sub
Private Sub Command2_Click(Index As Integer)
''寻找ACCESS数据库
CommonDialog1.Filter = "ACCESS 文件(*.mdb)|*.mdb"
CommonDialog1.CancelError = True
CommonDialog1.ShowOpen
txtAccessFile.Text = CommonDialog1.FileName
End Sub
Private Sub Command3_Click()
''寻找excel数据库
CommonDialog2.Filter = "excel 文件(*.xls)|*.xls"
CommonDialog2.CancelError = True
CommonDialog2.ShowOpen
txtExcelFile.Text = CommonDialog2.FileName
End Sub

Private Sub Form_Load()
Call Module1.lianjie
txtAccessFile.Text = datapath
End Sub
模块(module1)中的代码如下:
Public myConn As New ADODB.Connection ''定义连接字符串
Public myRecord As New ADODB.Recordset ''定义记录集(字段)
Public yourRecord As New ADODB.Recordset ''定义记录集(数据)
Public cntoad As Boolean ''是否正常连接
Public ml ''姓名字段所在列
Public strSQL ''查询字符串
Public MyDatabase As Database ''定义数据库名
Public MyTable As TableDef, MyField As Field ''定义表名和字段名
Public xuehao ''读取字段序号
Public goshiRecord As New ADODB.Recordset ''定义记录集(公式)
Public hxfyn As Boolean
Public hxfbds '' 公式或条件
Public duan ''要统计的字段
Public islinshi As Boolean ''是否为临时公式
Public leiRecord As New ADODB.Recordset ''定义记录集(工资类别)
Public datapath As String ''数据库路径及名
Public table As String ''工资表名
Public lei As String '' 工资类别
Public Sub lianjie() ''打开数据库
On Error Resume Next
myConn.Close
Dim mySQL As String
''设定连接字符串
mySQL = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;"
mySQL = mySQL + "Data Source=" & datapath
myConn.ConnectionString = mySQL ''设定连接
myConn.open ''打开连接
myRecord.ActiveConnection = myConn ''设定RecordSeet的连接对象为Connection
myRecord.CursorLocation = adUseClient
goshiRecord.ActiveConnection = myConn ''设定RecordSeet的连接对象为Connection
goshiRecord.CursorLocation = adUseClient
yourRecord.ActiveConnection = myConn ''设定RecordSeet的连接对象为Connection
yourRecord.CursorLocation = adUseClient
End Sub

1)用代码:引用dao或ADO对象建立access数据库的连接以读取数据

2)在excel中直接导入:(推荐使用此法)

点数据选项卡左侧按钮

选择数据库

建立连接

 

输入密码,选择待导入数据表,确认导入地址



用access自动获取excel里的数据的方法就是通过代码的方式导入。如果是对手动导入比较清楚的话,这个实现起来不难。请参考下面的介绍来实现:
首先,新建一个工程,在工程中引用如下对象ADO对象(用于连接ACCESS数据库,可用其它方式)
添加一个窗体(from1),在窗体上添加如下控件:
两个文本框,用来显示EXCEL文件路径和ACCESS路径;
四个扭钮,两个用来游览,另两个是导入和退出;
两个通用对话框控件,用来打开ACCESS和EXCEL文件,一个进度条控件,用来显示导入进程。

实例的导入是将ACCESS数据库中表的字段名单独存放在另外一个表中,导入时按表中所存字段名的顺序进行导入,不是按EXCEL表的顺序导入,请大家注
意.这样在实际中是很实用的.因为好多时候EXCEL表中字段顺序和ACCESS中字段顺序有可能不是一致的.

代码如下:
Dim v
Option Explicit
Private Sub cmdLoad_Click()
Dim excel_app As Object
Dim excel_sheet As Object
If txtExcelFile.Text = "" Then
MsgBox "请选择EXCEL表"
Else
Dim new_value As String
Label2.Caption = "正在导入,请稍候..."
Screen.MousePointer = vbHourglass
DoEvents
'' Create the Excel application.
Set excel_app = CreateObject("Excel.Application")
'' Uncomment this line to make Excel visible.
excel_app.Visible = True
'' Open the Excel spreadsheet.
excel_app.Workbooks.open FileName:=txtExcelFile.Text
'' Check for later versions.
If Val(excel_app.Application.Version) >= 8 Then
Set excel_sheet = excel_app.ActiveSheet
Else
Set excel_sheet = excel_app

End If

Dim u ''求EXCEL表中记录的条数,以便控制进度条
u = 1
Do
If Trim$(excel_sheet.Cells(u, 1)) = "" Then Exit Do
u = u + 1
Loop
bar.Max = u - 1

strSQL = "select * from TestValues"
yourRecord.open strSQL, myConn, adOpenDynamic, adLockOptimistic ''打开记录集
Dim sql As String

sql = "select * from fields order by xue"
myRecord.open sql, myConn, adOpenDynamic, adLockBatchOptimistic ''打开字段记录集
myRecord.MoveFirst

'' Get data from the Excel spreadsheet and insert
'' it into the TestValues table.

Dim v ''导入记录,用了两层循环
v = 1
Do
If Trim$(excel_sheet.Cells(v, 1)) = "" Then Exit Do ''外层,如果EXCEL表中读取到空行,结束

yourRecord.AddNew

Dim i
For i = 1 To myRecord.RecordCount
'' Get the next value.
new_value = Trim$(excel_sheet.Cells(v, i))
'' See if it''s blank.
''If Len(new_value) = 0 Then Exit Do

'' Insert the value into the database.

Dim bb As String

bb = myRecord("name")

yourRecord(bb) = new_value

myRecord.MoveNext

Next i
bar.Value = v
v = v + 1
myRecord.MoveFirst
Loop
yourRecord.Update

'' Comment the rest of the lines to keep
'' Excel running so you can see it.
'' Close the workbook without saving.
excel_app.ActiveWorkbook.Close False
'' Close Excel.
excel_app.Quit
Set excel_sheet = Nothing
Set excel_app = Nothing
myRecord.Close
yourRecord.Close
Set myRecord = Nothing
Set yourRecord = Nothing
Label2.Caption = "导入完毕"
Screen.MousePointer = vbDefault
MsgBox "共导入" & Format$(v - 1) & "条记录"

End If
End Sub
Private Sub Command1_Click()
Unload Me
End Sub
Private Sub Command2_Click(Index As Integer)
''寻找ACCESS数据库
CommonDialog1.Filter = "ACCESS 文件(*.mdb)|*.mdb"
CommonDialog1.CancelError = True
CommonDialog1.ShowOpen
txtAccessFile.Text = CommonDialog1.FileName
End Sub
Private Sub Command3_Click()
''寻找excel数据库
CommonDialog2.Filter = "excel 文件(*.xls)|*.xls"
CommonDialog2.CancelError = True
CommonDialog2.ShowOpen
txtExcelFile.Text = CommonDialog2.FileName
End Sub

Private Sub Form_Load()
Call Module1.lianjie
txtAccessFile.Text = datapath
End Sub
模块(module1)中的代码如下:
Public myConn As New ADODB.Connection ''定义连接字符串
Public myRecord As New ADODB.Recordset ''定义记7a64e78988e69d83331录集(字段)
Public yourRecord As New ADODB.Recordset ''定义记录集(数据)
Public cntoad As Boolean ''是否正常连接
Public ml ''姓名字段所在列
Public strSQL ''查询字符串
Public MyDatabase As Database ''定义数据库名
Public MyTable As TableDef, MyField As Field ''定义表名和字段名
Public xuehao ''读取字段序号
Public goshiRecord As New ADODB.Recordset ''定义记录集(公式)
Public hxfyn As Boolean
Public hxfbds '' 公式或条件
Public duan ''要统计的字段
Public islinshi As Boolean ''是否为临时公式
Public leiRecord As New ADODB.Recordset ''定义记录集(工资类别)
Public datapath As String ''数据库路径及名
Public table As String ''工资表名
Public lei As String '' 工资类别
Public Sub lianjie() ''打开数据库
On Error Resume Next
myConn.Close
Dim mySQL As String
''设定连接字符串
mySQL = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;"
mySQL = mySQL + "Data Source=" & datapath

myConn.ConnectionString = mySQL ''设定连接

myConn.open ''打开连接
myRecord.ActiveConnection = myConn ''设定RecordSeet的连接对象为Connection
myRecord.CursorLocation = adUseClient
goshiRecord.ActiveConnection = myConn ''设定RecordSeet的连接对象为Connection
goshiRecord.CursorLocation = adUseClient
yourRecord.ActiveConnection = myConn ''设定RecordSeet的连接对象为Connection
yourRecord.CursorLocation = adUseClient
End Sub

相关阅读

关键词不能为空
极力推荐

ppt怎么做_excel表格制作_office365_word文档_365办公网