如何用access自动获取excel里面的数据
涉及的问题如下:每个月都会收到excel基础表,名称如201401,201402。。。里面sheet及表中的结构都是固定的。我想有没有方法可以做到,我把这些表都放在一个文...
涉及的问题如下:
每个月都会收到excel基础表,名称如201401,201402。。。里面sheet及表中的结构都是固定的。
我想有没有方法可以做到,我把这些表都放在一个文件夹下,用access去抓取,在access建立新的汇总表。而且,当来了新的一个月excel数据后,我只需要把这张excel表丢进这个文件夹,access汇总表中的数据就会自动将新表的数据收集进来。
以前人家在做网页数据库时好像用javascript能做到,但现在仅仅是access应用,不知道该如何处理,麻烦大家帮我指点一下,谢谢了! 展开
每个月都会收到excel基础表,名称如201401,201402。。。里面sheet及表中的结构都是固定的。
我想有没有方法可以做到,我把这些表都放在一个文件夹下,用access去抓取,在access建立新的汇总表。而且,当来了新的一个月excel数据后,我只需要把这张excel表丢进这个文件夹,access汇总表中的数据就会自动将新表的数据收集进来。
以前人家在做网页数据库时好像用javascript能做到,但现在仅仅是access应用,不知道该如何处理,麻烦大家帮我指点一下,谢谢了! 展开
3个回答
展开全部
用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 ''定义记录集(字段)
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
首先,新建一个工程,在工程中引用如下对象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 ''定义记录集(字段)
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
2014-08-05
展开全部
如果 你已经能够在access 中建立汇总查询等 建立 汇总表了……
那么 你现在只需要 将 这些固定位置和名称的 excel 表链接到 access 数据库中 就可以像 access 数据表一样来使用里边的数据了……
对于 你要使用的表 如果 每个月 都不一样的表名称 或者 表数量 就比较麻烦了 需要使用VBA 才可以做到 如果对代码不是很熟悉 不建议这样做……
建议:首先 固定表名称 以及 表的数量(可以预先设置 没有数据的 空表) 然后链接到access中 以后excel 数据更新了 就把 同名的表直接覆盖 粘贴到 这个目录中…………
这样 用常规的 查询基本上 就可以 做了……
看了 一下 你上传的表格,似乎这个表格 不太符合 你实际的使用!要知道 你举例子 也要贴近实际 否则 会打给你的答案 对你的帮助不大! 你目前这样的 数据结构的表格 在access 中 只能是 求 数据 求和的操作 别无其他选择!也就是 数据信息 过于单一……弄到 access 中来处理 也不比在excel 环境下处理 来的容易 哦……所以 还请认真滴针对你的具体实际使用来 贴表格的结构吧!
那么 你现在只需要 将 这些固定位置和名称的 excel 表链接到 access 数据库中 就可以像 access 数据表一样来使用里边的数据了……
对于 你要使用的表 如果 每个月 都不一样的表名称 或者 表数量 就比较麻烦了 需要使用VBA 才可以做到 如果对代码不是很熟悉 不建议这样做……
建议:首先 固定表名称 以及 表的数量(可以预先设置 没有数据的 空表) 然后链接到access中 以后excel 数据更新了 就把 同名的表直接覆盖 粘贴到 这个目录中…………
这样 用常规的 查询基本上 就可以 做了……
看了 一下 你上传的表格,似乎这个表格 不太符合 你实际的使用!要知道 你举例子 也要贴近实际 否则 会打给你的答案 对你的帮助不大! 你目前这样的 数据结构的表格 在access 中 只能是 求 数据 求和的操作 别无其他选择!也就是 数据信息 过于单一……弄到 access 中来处理 也不比在excel 环境下处理 来的容易 哦……所以 还请认真滴针对你的具体实际使用来 贴表格的结构吧!
追问
谢谢您详尽的回答,我的基础数据也就是一些数量和价格,实际数据可能比较大一些,可能每个月会有好几万条。所以我在例子中仅仅是简单的列了几个项目,我想如果能解决例子中的问题,我实际的问题也能够解决。
现况就是excel表的文件名称不一样,其他sheet名称,表中结构都一样的。我们有时候在一些财务软件中常常可以使用到这样的功能:将本月数据导入进去后,就能够查询整个期间了。
追答
哦!是这样啊……看你的意思是要把这些表的数据都放到一个数据表中了……那么可以使用vba 来抓取 目录下的每一个工作簿中的工作表数据 各个表的数据 结构都一致的话,可以 逐一导入并追加的 access 数据表中……
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
能否提供测试数据及更详细功能说明呢?
更多追问追答
追问
http://pan.baidu.com/s/1hqwxWJ6
数据我举了个简单的例子如上链接:
要处理的问题
1.201401-02在一个文件夹中,如何让access自动抓取。
2.将201403也再放进这个文件夹,access也能自动抓取汇总。
追答
直接用Access访问Excel导入没有想到什么好的方法,不过通过程序我给你做了个Demo,解压压缩包,运行exe主程序就可将Data下的Excel数据导入到Access,导完后会将Excel移动到done文件夹下
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询