如何更改ACE TypeGuessRows Access 2007的registry值,以便在使用VBA从Excel文件导入时正确地确定字段数据types

我有一个Access数据库从外部Excel电子表格导入数据,其中包含一个名为Date Delivered的数据列。 虽然这一栏中的大部分数据实际上是一个datetypes,但是有时候会有4/5/15,5/1/15这样的条目来表示两个交货date。

当使用以下命令导入数据时,它将访问Access:

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

这导致它使列成为datetypes而不是从那些有问题的字段中删除任何值的string。 我发现这里似乎是一个有用的解决scheme,build议将TypeGuessRowsregistry值更改为0,以使Jet在确定字段数据types时查看所有行。

我使用以下代码创build并更改了registry值:

 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后仍然存在。

有没有一个单独的registry值的Excel与Excel的Jet引擎或者这只是不做我认为应该?

编辑:

看起来像Excel 2007和更新(我使用2007年),registry值应该是:

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

但是它仍然没有工作。

编辑2:

这里是@PractLogicalbuild议的代码:

 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 

我仍然在寻找所有通过registry项import的解决scheme(如果它存在的话)(知道它不存在也是有用的)。

我无法重新创build这个问题,但过去碰到过这个问题。 不知道为什么他们放弃了对于这样的事情是完美的导入规范,但我有幸运行以下(不是TypeGuessRows相关)。

制作一份[Delivery Data]表格,并将其命名为[Import_DeliveryData]。 删除副本中的任何数据,进入devise视图并将所有列改为短文本数据types。 有点麻烦,但是你需要重新命名所有列为F1,F2,F3,等等。 *你会看到为什么在一秒钟。

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

根据我的经验,Access只检查第一行数据以确定列的数据types; 第二行如果HasFieldNames为true。 这里我们告诉它检查应该是文本的第一行,因为它是字段名称。 不仅如此,而且我们正在告诉它追加到所有文本列的现有表格,而不是(重新)创build表格。 这有助于当Access认为列是一个date,创build一个date列,然后尝试追加非date…这是最有可能的问题的原因。

从Excel导入时,我总是使用这种types的导入代理表,因为数据可能是不可预知的。