繁体   English   中英

使用 VBA 从 Excel 文件导入时,如何更改 Access 2007 的 ACE TypeGuessRows 注册表值以正确确定字段数据类型

[英]How to change ACE TypeGuessRows Registry Value for Access 2007 to Determine Field Data Type Properly When Importing From Excel File Using VBA

我有一个 Access 数据库,它从一个外部 Excel 电子表格导入数据,该电子表格包含一列名为Date Delivered的数据。 虽然此列中的大多数数据实际上是日期类型,但有时会使用4/5/15,5/1/15等条目来表示两个交货日期。

使用以下方法导入数据时,会触发 Access:

DoCmd.TransferSpreadsheet acImport, 5, "Delivery Data", "\\File\Path.xlsx", True 

这导致它使列成为日期类型,而不是从那些有问题的字段中删除任何值的字符串。 我发现这里似乎是一个有用的解决方案,建议将TypeGuessRows注册表值更改为 0,以使 Jet 在确定字段数据类型时查看所有行。

我使用以下代码创建并更改了注册表值:

Dim RegLoc As String
Dim myWS As Object

'Writes registry value to make Jet check all rows (0) not just first 25 (Default value = 8) to determine type
RegLoc = "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows"
Set myWS = CreateObject("WScript.Shell")
myWS.RegWrite RegLoc, 0, "REG_DWORD"

不幸的是,这似乎不起作用,因为在更改值并重新启动 Access 和 Excel 后问题仍然存在。

Access 与 Excel Jet 引擎是否有单独的注册表值,或者这根本没有做我认为应该做的事情?

编辑:

看起来对于 Excel 2007 和更新版本(我使用的是 2007),注册表值应该是:

HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows

但是它仍然无法正常工作。

编辑2:

这是执行@PractLogical 建议的代码:

SQL = "CREATE TABLE [Delivery Data Import] ([F1] TEXT, [F2] TEXT,[F3] TEXT, ...)"
CurrentDb.Execute SQL

DoCmd.TransferSpreadsheet acImport, 5, "Delivery Data Import", "\\File\Path.xlsx", False

SQL = "INSERT INTO [Delivery Data] ( Buyer, [PO #], [Receipt Status],...) SELECT [Delivery Data Import].F1, [Delivery Data Import].F2, [Delivery Data Import].F3,...] WHERE (Get rid of headers);"
CurrentDb.Execute SQL

如果存在,我仍在寻找通过注册表项为所有导入完成的解决方案(知道它不存在也很有用)。

我无法重新创建这个问题,但在过去遇到过这个问题。 不知道为什么他们放弃了非常适合这些事情的导入规范,但我很幸运地做了以下(与 TypeGuessRows 无关)。

复制您的 [Delivery Data] 表并将其命名为 [Import_DeliveryData]。 删除副本中的任何数据,进入设计视图并将所有列更改为短文本数据类型。 有点麻烦,但您需要将所有列重命名为 F1、F2、F3 等,从顶部列开始为 F1。 *你马上就会明白为什么。

现在,将您的工作表传输到导入表中(首先删除任何现有行)并确保 *HasFieldNames 为 false。 一切都应该像文本一样好。 在附加到“真实”[Delivery Data] 表之前,您需要对导入表的数据进行一些清理,但至少您可以控制什么是什么。

根据我的经验,Access 只检查第一行数据以确定该列是什么数据类型; 如果 HasFieldNames 为真,则为第二行。 在这里,我们告诉它检查应该是文本的第一行,因为它是字段名称。 不仅如此,我们还告诉它附加到所有文本列的现有表,而不是(重新)创建表。 这有助于当 Access 认为一列是日期,为其创建一个日期列,然后尝试附加非日期......这很可能是您的问题的原因。

从 Excel 导入时,我总是使用这种类型的导入代理表,因为数据非常难以预测。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM