【问题标题】:VBA procedure to import csv file into access将csv文件导入访问的VBA过程
【发布时间】:2012-07-01 18:52:03
【问题描述】:

我需要 VBA 中的程序将数据导入到 csv excel 文件的访问中,而不需要一些记录,作为页眉和页脚。例如,我在 csv 文件中有一个表,其中包含一些 不属于表日期的句子


A1 这是一些句子的标题.......
A2标题
A3.......
A7 数据 数据 数据 数据 数据
A8 行数据数据数据数据数据数据 …… ....
A256 数据 数据 数据 数据
A257 这是一些句子


我的 Acess 应该只包含 A7 到 A256 之间的行。有谁知道解决我的问题的 VBA 程序或任何东西?

非常感谢


编辑

【问题讨论】:

  • 你能澄清一下吗? Excel 会打开一个 CSV,但 CSV 表示逗号分隔值,它是一个文本文件。你有 Excel 文件还是文本文件?
  • 我已将您的数据粘贴到您的问题中。如您所见,无法分辨线条在哪里。您需要选择编辑您的帖子并重新粘贴或整理它。分号 (;) 不是 csv 的标准分隔符。
  • 这似乎是一次性的,您对 VBA 并不完全熟悉,所以我强烈建议您先尝试@Olivier Jacot-Descombes 方法。
  • 我正在尝试,但它不起作用:(
  • 导入表中的错误,因为只创建了 3 个假列,但我的 csv,有 11 个用分号分隔..但是用这个 Oliver 程序分隔逗号......aandeverthing 是错误的

标签: ms-access vba csv


【解决方案1】:

最简单的方法是将 CSV 文件作为表格链接到 Access 数据库中。然后,您可以像处理普通访问表一样处理此表,例如,通过基于此表创建适当的查询来准确返回您想要的内容。

您可以手动链接表格,也可以像这样使用 VBA 链接表格

DoCmd.TransferText TransferType:=acLinkDelim, TableName:="tblImport", _
    FileName:="C:\MyData.csv", HasFieldNames:=true

更新

Dim db As DAO.Database

' Re-link the CSV Table
Set db = CurrentDb
On Error Resume Next:   db.TableDefs.Delete "tblImport":   On Error GoTo 0
db.TableDefs.Refresh
DoCmd.TransferText TransferType:=acLinkDelim, TableName:="tblImport", _
    FileName:="C:\MyData.csv", HasFieldNames:=true
db.TableDefs.Refresh

' Perform the import
db.Execute "INSERT INTO someTable SELECT col1, col2, ... FROM tblImport " _
   & "WHERE NOT F1 IN ('A1', 'A2', 'A3')"
db.Close:   Set db = Nothing

【讨论】:

  • 谢谢,:) 但我必须编写 VBA 代码,我的任务是找到如何从 excel csv 文件将数据导入到没有某些行的访问中的方法。我需要一些条件,因为需要行..不响应我,我在 aceess 中打开 imidiatly .... 一个月几次我得到了大约 2213 行的 csv 文件,我必须在开始和结束时导入一些行
  • 这正是我要告诉你的。将 CSV 文件链接到访问权限后,您可以以 INSERT INTO someTable SELECT col1, col2, ... FROM tblImport WHERE NOT F1 IN ('A1', 'A2', 'A3') 为例导入所需的行。
  • 问题是您的文件是否真的是 CSV 文件。为了成为 CSV 文件,它必须在每一行中包含相同数量的列!如果第 1-3 行和第 257 行包含一些纯文本,那么这不是 CSV 文件。
  • WHERE NOT F1 IN ('A1', 'A2', 'A3') 发生了什么?
  • F1 列中具有值“A1”、“A2”或“A3”的行将被跳过,即从结果集中排除。请注意,如果 CSV 文件在第一行中有字段名称并且您使用 HasFieldNames:=true 导入,那么这些名称将用作列名称,否则 Access 会自动分配列名称,如 F1F2F3... .
【解决方案2】:

您的文件看起来很小(297 行),因此您可以很快地读取和写入它们。您引用了不存在的 Excel CSV,并在示例中显示了以空格分隔的数据。此外,Access 被限制为 255 列,而 CSV 则不是,所以不能保证这会起作用

Sub StripHeaderAndFooter()
Dim fs As Object ''FileSystemObject
Dim tsIn As Object, tsOut As Object ''TextStream
Dim sFileIn As String, sFileOut As String
Dim aryFile As Variant

    sFileIn = "z:\docs\FileName.csv"
    sFileOut = "z:\docs\FileOut.csv"

    Set fs = CreateObject("Scripting.FileSystemObject")
    Set tsIn = fs.OpenTextFile(sFileIn, 1) ''ForReading

    sTmp = tsIn.ReadAll

    Set tsOut = fs.CreateTextFile(sFileOut, True) ''Overwrite
    aryFile = Split(sTmp, vbCrLf)

    ''Start at line 3 and end at last line -1
    For i = 3 To UBound(aryFile) - 1
        tsOut.WriteLine aryFile(i)
    Next

    tsOut.Close

    DoCmd.TransferText acImportDelim, , "NewCSV", sFileOut, False
End Sub

编辑各种 cmets

可以手动将文本文件导入 MS Access,这将允许您选择自己的单元格分隔符和文本分隔符。您需要从菜单中选择外部数据,选择您的文件并逐步完成向导。

About importing and linking data and database objects -- Applies to: Microsoft Office Access 2003

Introduction to importing and exporting data -- Applies to: Microsoft Access 2010

使用向导完成导入后,您可以保存导入规范并在下一个 DoCmd.TransferText 中使用它,如 @Olivier Jacot-Descombes 所述。这将允许您使用非标准分隔符,例如分号和单引号文本。

【讨论】:

  • 我的文件不小,大约有 2213 行:)
  • 我在哪里写,在访问中?新的数据库、数据库工具、Visaul Basic...插入模块??真的需要帮助,我必须在星期一之前完成这个
  • 它是 MS Access VBA。如果您不了解 VBA,您会遇到问题,没有错误编码并且您没有发布文本文件的示例,所以我不知道它是否真的是 CSV——逗号分隔的文本文件。否则,测试代码运行。
  • 如果您不介意,我可以将我的 csv 文件示例发送到您的邮箱,我会看到 tath 是 csv 文件,如果您不难...上面的测试代码,然后告诉我我在哪里写,所以我可以在我的计算机上测试上面的代码:Sub StripHeaderAndFooter() Dim fs As Object ''FileSystemObject Dim tsIn As Object, tsOut As Object ''TextStream Dim sFileIn As String, sFileOut As String Dim aryFile As Varian
  • 不,我不会在公共网站上发布我的电子邮件,抱歉。您可以右键单击该文件并选择打开方式 --> 写字板。这是一个文本编辑器,您将看到文件的实际内容。将前几行剪切并粘贴到您的答案中。要测试代码,只需将其粘贴到 MS Access 模块中,然后按 F8 单步执行。如果您以前从未使用过 VBA,则需要阅读大量内容才能跟上进度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 2011-03-25
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
相关资源
最近更新 更多