ACCESS中用VBA如何导入当前目录内的指定EXCEL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACCESS中用VBA如何导入当前目录内的指定EXCEL相关的知识,希望对你有一定的参考价值。

我的ACCESS中有个表名称为: 养老保险个人资料汇总表,在当前数据库所在目录内有一个EXCEL表名称为:60岁以下资料备份.请问如何能自动导入这个表到ACCESS中(不用先择文件路径),我写了一段可总提示在我的文档中找不到文件!请高手指教!Dim Expath As String
impath = CurrentProject.Path & "\"
'Debug.Print Expath
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "养老保险个人资料汇总表", "60岁以下资料备份.xls", False, "养老保险个人资料汇总表"
End Sub

参考技术A 部分中文详文:

在导入数据的时候,有的时候,Access会把一些数据作为数值型的数据,实际上,我们需要作为字符型的数据,那么如何在导入的时候,指定导入的各种规格和细节呢?

答案是利用Schema.ini即可(导入/导出规格文件)。

有几种方式创建Schema,第一种是利用Access自身的文本数据导入导出向导:

在这个对话框中,点击[高级...]按钮,弹出对话框:

然后只要设定好各种格式,然后点击[另存为]保存即可。这种方式创建的Schema,只能集成在数据库中,无法灵活单独使用,因此我们需要用到另外一种方式:INI文件,推荐使用INI文件这种方式。

Schema.ini格式如下(参考:MSDN主题 Schema.ini File):

Schema.ini用于提供文本数据中的记录规格信息。每个Schema.ini的条目用于指明表的5个特征之一:

文本文件名
文件名有方括号括起来,例如如果要对Sample.txt使用Schema,那么它的对应的Schema条目应该是

[Sample.txt]

文件格式
指令如下:

Format=Value

Value可以取下面的值之一:

TabDelimited 用Tab分隔

CSVDelimited 用逗号分隔

FixedLength 固定长度

Delimited(C) 指定字符,其中C可以为除了双引号(")外的任何字符,也可以为空

字段名、字段宽度和类型
格式为:Coln=字段名 数据类型 [width 宽度]

字段名可以是任意字符,如果字段名包含空格,请使用双引号括起来。

数据类型可以为:

Bit

Byte

Short(Integer)

Long

Currency

Single

Double(Float)

DateTime(Date DateFormat)

Text(Char)

Memo(LongChar)

其中DateFormat是日期的格式字符串例如:Date YYYY-MM-DD

字符集
格式:CharacterSet=ANSI | OEM

格式只有两种:ANSI和OEM

特殊数据类型转换
特殊数据类型转换一般使用的比较少,主要是自定义日期、货币等等的数据格式,一般不用理会。在此也不作详细叙述。请自己查看MSDN帮助:Schema.ini File

 

 

下面给出一个简单的例子,假设有一个表Contacts.txt类似下面:

First NameLast NameHireDate

Nancy Davolio 10-22-91

Robert King 10-23-91

那么Schema.ini个是类似下面的INI文件(我加了注释):

[Contacts.txt] ///需要导入的文本文件名

ColNameHeader=True ///是否有数据头

Format=FixedLength ///字段固定长度

MaxScanRows=0 ///最多导入行

CharacterSet=OEM ///字符集

Col1="First Name" Char Width 10 ///第一列格式

Col2="Last Name" Char Width 9 ///第二列格式

Col3="HireDate" Date Width 8 ///第三列格式

////依此类推

我们可以根据数据自动创建这个Schema.ini文件!

注意,Schema.ini必须和需要导入的文本文件在同一目录!!!如果不在同一个目录,必须指定Schema.ini的全路径!

此后,我们就可以利用下面的语句来导入数据了:

DoCmd.TransferText acImportFixed, , "Contacts", "C:Documents.txt"

或者

DoCmd.TransferText acImportFixed, "C:Documents.ini", "Contacts", "C:Documents.txt"

下面给出TransferText的语法(摘自Access帮助):

DoCmd.TransferText [TransferType][, SpecificationName], TableName, FileName[, HasFieldNames][, htmlTableName][, CodePage]

TransferType 可选 AcTextTransferType。

AcTextTransferType 可以是下列 AcTextTransferType 常量之一:

acExportDelim

acExportFixed

acExportHTML

acExportMerge

acImportDelim 默认

acImportFixed

acImportHTML

acLinkDelim

acLinkFixed

acLinkHTML

如果将该参数留空,则采用默认常量 (acImportDelim)。

SpecificationName 可选 Variant 型。字符串表达式,表示在当前数据库中创建并保存的导入或导出规格的名称。对于固定长度的文本文件, 必须指定参数或使用 schema.ini 文件,该文件还必须保存在导入、链接或导出的文本文件的同一个文件夹中。若要创建一个方案文件, 可使用文本导入/导出向导创建此文件。对于分隔的文本文件和 Microsoft Word 邮件合并数据文件,可以将该参数留空,以便选择默认的导入/导出规格。

TableName 可选 Variant 型。字符串表达式,表示要向其导入文本数据、从中导出文本数据或链接文本数据的 Microsoft Access 表的名称,或者要将其结果导出到文本文件的 Microsoft Access 查询的名称。

FileName 可选 Variant 型。字符串表达式,表示要从中导入、导出到或链接到的文本文件的完整名称(包括路径)。

HasFieldNames 可选 Variant 型。使用 True (-1) 可以在导入、导出或链接时,使用文本文件中的第一行作为字段名。使用 False (0) 可以将文本文件中的第一行看成普通数据。如果将该参数留空,则采用默认值 (False)。该参数将被 Microsoft Word 邮件合并数据文件忽略,这些文件的第一行中必须包含字段名。

HTMLTableNam 可选 Variant 型。字符串表达式,表示要导入或链接的 HTML 文件中的表或列表的名称。除非 transfertype 参数设为 acImportHTML 或 acLinkHTML,否则该参数将被忽略。如果将该参数留空,则导入或链接 HTML 文件中的第一个表或列表。如果 HTML 文件中存在 <CAPTION> 标记,则 HTML 文件的表或列表名称取决于该标记指定的文本。如果没有 <CAPTION> 标记,则名称由 <TITLE> 标记指定的文本决定。如果有多个表或列表具有相同的名称,则 Microsoft Access 将通过给每个表或列表名称结尾添加一个数字,如“雇员1”和“雇员2”来区分它们。

CodePage 可选 Variant 型。Long 型值,用于标识代码页的字符集。

更详细的英文参考:
Schema.ini File (Text File Driver)
When the Text driver is used, the format of the text file is determined by using a schema information file. The schema information file, which is always named Schema.ini and always kept in the same directory as the text data source, provides the IISAM with information about the general format of the file, the column name and data type information, and a number of other data characteristics. A Schema.ini file is always required for accessing fixed-length data; you should use a Schema.ini file when your text table contains DateTime, Currency, or Decimal data or any time you want more control over the handling of the data in the table.

Note The Text ISAM will obtain initial values from the registry, not from Schema.ini. The same default file format applies to all new text data tables. All files created by the CREATE TABLE statement inherit those same default format values, which are set by selecting file format values in the Define Text Format dialog box with <default> chosen in the Tables list. If the values in the registry are different from the values in Schema.ini, the values in the registry will be overwritten by the values from Schema.ini.
Understanding Schema.ini Files
Schema.ini files provide schema information about the records in a text file. Each Schema.ini entry specifies one of five characteristics of the table:

The text file name
The file format
The field names, widths, and types
The character set
Special data type conversions
The following sections discuss these characteristics.

Specifying the File Name
The first entry in Schema.ini is always the name of the text source file enclosed in square brackets. The following example illustrates the entry for the file Sample.txt:

[Sample.txt]
Specifying the File Format
The Format option in Schema.ini specifies the format of the text file. The Text IISAM can read the format automatically from most character-delimited files. You can use any single character as a delimiter in the file except the double quotation mark ("). The Format setting in Schema.ini less than 1 and greater than –1 should contain leading zeros; this value can either be False (no leading zeros) or True.
CurrencySymbol Indicates the currency symbol to be used for currency values in the text file. Examples include the dollar sign ($) and Dm.
CurrencyPosFormat Can be set to any of the following values:
Currency symbol prefix with no separation ($1)
Currency symbol suffix with no separation (1$)
Currency symbol prefix with one character separation ($ 1)
Currency symbol suffix with one character separation (1 $)

CurrencyDigits Specifies the

CurrencyThousandSymbol
[ 本贴由 大熊 于 2003-4-1 16:33 最后编辑 ]收藏 分享
参考技术B 新建一个空数据库(或打开已有数据库文件),在弹出的数据库对话框中点击“新建”----导入表---在“导入”对话框中的“导入类型”中选“MS EXCEL”按路径找出你要导入的的EXCEL文件,就样就可以了
如果你要将EXCEL文件导入已有数据库表中,应注意EXCEL文件的字段设置与ACCESSS的字段应一致。

导入ACCESSS后如果插入新的字段点击“设计视图”--插入列---
参考技术C 楼主你好,看见你提问Excel的这个问题,嘿嘿,好像在那里看见过,所以我来解答你,不过我怕我说的不是很清楚,这样好了我给你个网址你进去看看,里面绝对可以解决你的问题的答案,我基本都是在那边学的,什么都有,绝对全面,网址是 http://www.blue1000.com/bkhtml/c118/,你记得只找你的问题,看的太多小心眼花!@ 参考技术D 123456789

如何使用sql语句和vba将数据从MS-Access导入excel power查询?

在我工作的公司中,有一个文件夹,其中包含许多由系统生成的访问数据库文件。它们具有相同的结构但数据不同。我正在尝试构建一个Excel工具来比较和分析其中一些使用电源查询(连接到工作簿数据模型并使用DAX)。将使用该系统的人不熟悉vba,电源查询(我也不熟悉)或SQL语句。所以,我想要做的是编写一个vba函数来允许人们选择他们想要分析的文件,然后使用这些数据更新工作簿电源查询。电源查询源数据应该是SQL语句。

我正在使用“公式”属性来进行所需的所有更改(实际上,新数据源文件,附加带有文件名的列,并将结果附加到其他数据源文件(如果选择了多个)。下面的代码可以工作,如果我导入一个表,但我无法使用SQL语句。我试图改变一些Access.Database参数,如使用Query =“Select XXX”而不是Item =“TableXXX”但它没有用。我发现了一些关于使用ODBC的信息,但我不想使用ODBC,因为在我看来,该工具可以导致许多连接处理(打开和删除)用户决定更改数据源。

下面是一个只有两个数据源文件的“公式”属性的例子。我没有写循环来构建字符串strSource,因为我没有问题。我想问题是在Access.Database中使用SQL语句。谢谢您的帮助。

strSource = "let
    Fonte = Access.Database(File.Contents("PathNameFile01Name.mdb")),
    _TbEx_1 = Fonte{[Schema="",Item="TableExample"]}[Data],
    _TbEx_C1 = Table.AddColumn(_TbEx_1, "Case", each "File01Name", type text),
    Fonte_2 = Access.Database(File.Contents("PathNameFile02Name.mdb")),
    _TbEx_2 = Fonte_2{[Schema="",Item="TableExample"]}[Data],
    _TbEx_C2 = Table.AddColumn(_TbEx_2, "Case", each "File02Name", type text),
    _TbExComb = Table.Combine({_TbEx_C1 , _TbEx_C2})
in
    _TbExComb"

ActiveWorkbook.Queries("PwQry01").Formula = strSource
ThisWorkbook.Connections("Qry-PwtQry01").Refresh

在互联网上搜索,我发现了一种使用SQL语句的方法,但问题是在同一个电源查询中组合不同文件的连接。按照我发现的代码,但我认为“公式”属性更接近最终答案。

cnString = "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
        "PathNameFile01Name.mdb;Mode=Read"

    ThisWorkbook.Connections.Add2 _
        Name:="MyConnect", _
        Description:="Testing connection", _
        ConnectionString:=cnString, _
        CommandText:="SELECT * FROM TableExample", _
        lCmdtype:=XlCmdType.xlCmdSql, _
        CreateModelConnection:=True, _
        ImportRelationships:=True

天真,我希望看到的是:

strSource = "let
    Fonte = Access.Database(File.Contents("PathNameFile01Name.mdb")),
    _TbEx_1 = Fonte{[Schema="",Query="SELECT XXXXX"]}[Data],
    _TbEx_C1 = Table.AddColumn(_TbEx_1, "Case", each "File01Name", type text),
    Fonte_2 = Access.Database(File.Contents("PathNameFile02Name.mdb")),
    _TbEx_2 = Fonte_2{[Schema="",Query="SELECT XXXX"]}[Data],
    _TbEx_C2 = Table.AddColumn(_TbEx_2, "Case", each "File02Name", type text),
    _TbExComb = Table.Combine({_TbEx_C1 , _TbEx_C2})
in
    _TbExComb"

ActiveWorkbook.Queries("PwQry01").Formula = strSource
ThisWorkbook.Connections("Qry-PwtQry01").Refresh

答案

使用Access对单个mdb文件“连接”所有数据并使用它来完成剩下的工作会容易得多。

另一答案

我按照@Wedge的建议并使用了ODBC方法。为了使它工作,我创建了一个ODBC,没有与Windows ODBC数据源关联的ms-access文件。在Excel中,用户选择他想要分析的文件,此信息是strPath()变量。使用循环,所有文件都包含在Formula属性中。变量tpPQSQLMap是一个自定义类型(我相信可能是一个字典),其中strPQNames为查询名称,strPQSQL为SQL语句。遵循最终代码

For pq = 1 To ThisWorkbook.Queries.Count
    strSource = ""
    strSrcComb = ""
    For k = 1 To UBound(strPath)
        strSource = strSource + "SourceC" + CStr(k) + "=Odbc.Query(""dbq=" + strPath(k) + ";dsn=MyODBC"", """ + tpPQSQLMap(pq).strPQSQLs + """), " + vbCrLf
        strSrcComb = strSrcComb + "SourceC" + CStr(k) + ","
    Next k
    strSrcComb = Left(strSrcComb, Len(strSrcComb) - 1)
    strSource = "let " + vbCrLf + strSource + "Final = Table.Combine({" + strSrcComb + "}) " + vbCrLf + "in " + vbCrLf + "Final "


    ThisWorkbook.Queries(pq).Formula = strSource
    ThisWorkbook.Connections("Query - " + tpPQSQLMap(pq).strPQNames).Refresh
Next pq

以上是关于ACCESS中用VBA如何导入当前目录内的指定EXCEL的主要内容,如果未能解决你的问题,请参考以下文章

在access中用vba如何把SQL语句查询到的一个值赋给变量?

将 Excel 文件导入 Access VBA 时更改数据类型

在 VBA Access 中用 null 替换撇号

导入规范访问 vba

从 VBA 获取当前目录

Access VBA:如何在导入之前检查所选文件是否为excel格式