ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: zhaogang1960

[原创] 用ExcelVBA将多个列数不完全相同的文本文件或csv数据导入到Access数据库中的三种方法

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-8-3 12:58 | 显示全部楼层
请问版主,如果想将不同内容的CSV(有不相同的列)写入到ACCESS的同一个表中,采用第3种方法该如何操作?谢谢!

TA的精华主题

TA的得分主题

发表于 2011-8-3 13:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 tangel 于 2011-7-27 03:37 发表
附上第四写法:其它写法相同
4.先合并txt文件为temp.txt
dim cmdstr as string
cmdstr ="cmd.exe/c  dir "& mypath &"*.txt/s >"&mypath&"temp.txt" '运用cmd命令合并所有txt文件为一个temp.txt文件
shell cmdst ...


如果文本文件的列不完全一致时能实现吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-8-3 18:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 commander777 于 2011-8-3 12:58 发表
请问版主,如果想将不同内容的CSV(有不相同的列)写入到ACCESS的同一个表中,采用第3种方法该如何操作?谢谢!

Sub 联合查询后导入() '引用Microsoft ActiveX Data Objects 2.x Library
    Dim cnn As New ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim myPath$, MyFile$, SQL$, a(), b(), arr(), s$, t$, i%, n%
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.Path & "\学生成绩.mdb" '连接数据库
    Set rs = cnn.Execute("成绩单")
    n = rs.Fields.Count
    ReDim a(1 To n)
    ReDim b(1 To n)
    For i = 1 To n
        a(i) = rs.Fields(i - 1).Name
        If rs.Fields(i - 1).Type <= 5 Then b(i) = 0 Else b(i) = "''"
    Next
    myPath = ThisWorkbook.Path & "\"
    MyFile = Dir(myPath & "*.txt")'csv文本修改为MyFile = Dir(myPath & "*.csv")
    Do While MyFile <> "" '创建多个文本文件的联合查询
        Set rs = cnn.Execute("[Text;FMT=Delimited;HDR=Yes;DATABASE=" & myPath & ";].[" & MyFile & "]")
        ReDim arr(1 To rs.Fields.Count)
        For i = 1 To rs.Fields.Count
            arr(i) = rs.Fields(i - 1).Name
            
        Next
        s = "," & Join(arr, ",") & ","
        t = ""
        For i = 1 To n
            If InStr(s, "," & a(i) & ",") Then '该文本文件存在该字段
                t = t & "," & a(i)
            Else
                t = t & "," & b(i) & " as " & a(i) '该文本文件不存在该字段要添加 '' as 字段或 0 as 字段
            End If
        Next
        t = Mid(t, 2)
        If Len(SQL) Then
            SQL = SQL & " union all select " & t & " from [Text;FMT=Delimited;HDR=Yes;DATABASE=" & myPath & ";].[" & MyFile & "]"
        Else
            SQL = "select " & t & " from [Text;FMT=Delimited;HDR=Yes;DATABASE=" & myPath & ";].[" & MyFile & "]"
        End If
        MyFile = Dir()
    Loop
    SQL = "insert into 成绩单 select * from (" & SQL & ")" '向access数据表中添加数据语句
    cnn.Execute SQL
    MsgBox "已经成功将文本文件数据保存为数据库!", vbInformation
    cnn.Close
    Set cnn = Nothing
End Sub

[ 本帖最后由 zhaogang1960 于 2011-8-4 02:01 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-8-4 11:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 zhaogang1960 于 2011-8-3 18:02 发表

Sub 联合查询后导入() '引用Microsoft ActiveX Data Objects 2.x Library
    Dim cnn As New ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim myPath$, MyFile$, SQL$, a(), b(), arr(), s$, t$, i%, ...

感谢版主的帮助与启发,我去试验一下!
另外有个问题想请教一下,如果我需要从其他数据库(例如SQL、SYBASE)中通过ODBC导出数据到ACCESS里面,需要将数据库中不同表(列数也是不一致)的数据组合后导入,我该怎样操作?
以前看到过个例子,是通过DOCMD来实现的,但是找不到了,麻烦版主指点一二!

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-8-4 12:41 | 显示全部楼层
原帖由 commander777 于 2011-8-4 11:40 发表

感谢版主的帮助与启发,我去试验一下!
另外有个问题想请教一下,如果我需要从其他数据库(例如SQL、SYBASE)中通过ODBC导出数据到ACCESS里面,需要将数据库中不同表(列数也是不一致)的数据组合后导入,我该怎样 ...

你所提到的这些数据库我没有用过,不知道它们是否和access兼容,记得ldy版主有过论述,可惜我们没有记住在那里了,建议发信息向ldy版主求助

TA的精华主题

TA的得分主题

发表于 2011-8-5 16:01 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-8-8 23:08 | 显示全部楼层
原帖由 zhaogang1960 于 2011-8-4 12:41 发表

你所提到的这些数据库我没有用过,不知道它们是否和access兼容,记得ldy版主有过论述,可惜我们没有记住在那里了,建议发信息向ldy版主求助


谢谢版主,已用你的方法实现了程序。
另外问一下在第2种方法中,在打开了2个Recordset之后,能用SQL直接在这2个Recordset之间传递数据吗?就是不采用工作表过渡

如果不行,那原因是什么呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-8-8 23:28 | 显示全部楼层
原帖由 commander777 于 2011-8-8 23:08 发表


谢谢版主,已用你的方法实现了程序。
另外问一下在第2种方法中,在打开了2个Recordset之后,能用SQL直接在这2个Recordset之间传递数据吗?就是不采用工作表过渡

如果不行,那原因是什么呢?

这不就是第一种方法吗?
就是因为这种方法需要用循环的方式交换两个查询记录集的信息,我才想到了用工作表过度,一次性写入工作表,再一次性写入数据库

TA的精华主题

TA的得分主题

发表于 2011-8-9 15:01 | 显示全部楼层
原帖由 zhaogang1960 于 2011-8-8 23:28 发表

这不就是第一种方法吗?
就是因为这种方法需要用循环的方式交换两个查询记录集的信息,我才想到了用工作表过度,一次性写入工作表,再一次性写入数据库


谢谢版主,我想的太多了,呵呵

TA的精华主题

TA的得分主题

发表于 2011-8-12 13:37 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 17:44 , Processed in 0.036995 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表