Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 访问带有导入工作表列的匹配表标题_Vba_Ms Access - Fatal编程技术网

Vba 访问带有导入工作表列的匹配表标题

Vba 访问带有导入工作表列的匹配表标题,vba,ms-access,Vba,Ms Access,新来的,希望有人能帮我。。。我正在尝试将.CSV文件导入DB,这一切都很好。问题是.CSV文件将具有不同的列,并且可能与DB表中设置的顺序不同。看起来access正在导入一行中的所有列,而与列名无关 在下面使用此Do.Cmd: strPathFile = strPath & strFile DoCmd.TransferText acImportDelim, "pimmig2", strTable, strPathFile, blnHasFieldNames 例如,Access中的表标题

新来的,希望有人能帮我。。。我正在尝试将.CSV文件导入DB,这一切都很好。问题是.CSV文件将具有不同的列,并且可能与DB表中设置的顺序不同。看起来access正在导入一行中的所有列,而与列名无关

在下面使用此Do.Cmd:

strPathFile = strPath & strFile
DoCmd.TransferText acImportDelim, "pimmig2", strTable, strPathFile, blnHasFieldNames
例如,Access中的表标题:

Action, Type, Retek Hierarchy, ID, Name
.CSV文件头:

Action, Type, Banner, From Banner, Retek Hierarchy, Master Catalogue, ID
因此,在导入之后,“From Banner”列以“Retek Hierarchy”结尾,表中的所有数据都是scewd up


我已经设置了主键,所有的,规格都设置好了,没有选项了…:(请帮忙…

一个非常简单的处理方法

导入到临时表中。因此,清空该表(或将其删除)。现在导入到此表中

然后启动查询生成器,创建追加查询。这种方法的优点在于,不仅可以设置字段到字段的映射,而且在字段名称不完全匹配的情况下也可以设置字段到字段的映射。一旦创建了包含所有字段映射的追加查询,您是否可以执行此操作

保存该查询

因此,现在您的步骤是: 将数据导入该表 执行追加查询

您甚至可以在追加查询中添加格式或数据类型转换。因此,您可以映射字段,而无需在代码中编写/键入字段

因此,您仍然有少量的代码,但追加查询的关键概念将使您能够将导入表中的列映射到生产表,甚至可以映射名称不完全相同的字段

因此,从理论上讲,您可以为生产数据选择好的列名,导入可以有您想要的任何字段名。追加查询可以100%使用查询生成器创建,选择哪些列转到哪些生产列的受欢迎功能都是通过在查询生成器中选择带组合框的字段映射来完成的


这个临时表的另一个很好的功能是什么?好吧,你可以运行一些更新查询,甚至是一些VBA循环代码来清理,或者在运行一个附加查询之前对数据进行处理,以便将数据发送到最终的生产表中。因此,你不仅可以得到字段映射(不必编写代码),但您也有机会在发送(追加)之前清理甚至删除坏的数据行将导入的数据导入到实际生产表。

以防有人遇到与我相同的问题。我使用了上面Albert所述的逻辑。因此,将其移动到临时表中,然后将某些列插入通过ODBC连接的表中:

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

由于我的.CSV文件的名称中有空格,因此必须将它们放在括号中,如:
[名字]

我没有处理规范文件,但我想知道是否存在问题。此外,如果您不喜欢这种方式,可以考虑将CSV作为表附加(或导入到新表)然后运行select insert查询。是的,如果我将csv导入一个新表,它会以正确的顺序检索它们。但是,我的表位于ODBC连接上,因此不确定在本地导入新表将如何工作。除非有方法在本地导入表,然后通过ODBC连接将字段移动到现有表…但这超出了范围我的知识。。。