[英]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.