Excel to Access导入false列

时间:2015-10-13 14:47:46

标签: excel vba excel-vba ms-access

我正在处理大量历史数据,我制作了一个宏来将这些excel电子表格格式化为Access友好信息。但是,在将这些excel文件导入Access时遇到问题。无论我在VBA中编码什么,Access仍然认为在前四个实际数据之后大约有30个空白列。防止这种情况的唯一方法是手动进入并删除列。出于某种原因,我的VBA代码不会阻止它。我正在处理很多电子表格,因此手动删除这些列需要相当长的时间。我的代码如下;关于如何让Access正确解释这些问题的任何想法?

Timer timer = new Timer ();
TimerTask t = new TimerTask () {
    @Override
    public void run () {
        // some code
    }
};

timer.schedule (t, 0l, 1000*60*60*24);

1 个答案:

答案 0 :(得分:3)

Access将'used range'作为表导入,这与'所有带数据的单元'不完全相同。

'UsedRange'属性选取空字符串,格式化和(有时)实时选择和命名范围......

......有时候雷德蒙德以外的任何人都不会知道超大尺寸的使用范围。

因此,您接下来的工作是重新定义“访问友好”一词

最常用的“访问友好”方法是导出csv文件 - 您可能会听到相反的意见,但不是那些经常在JET OLEDB 4 Excel驱动程序中遇到内存泄漏的人。 / p>

但最简单的方法是在链接表中指定范围,或者 - 更好的是 - ODBC连接的SQL查询:


SELECT *
  FROM [Sheet1$D3:E24] 
    IN "" [Excel 8.0;HDR=YES;IMEX=0;DATABASE=C:\Temp\Portfolio.xls];

请注意指定工作表和范围的格式:'$',而不是'!'分隔工作表名称和地址。你可以使用Sheet $,但你会回到整个猜测使用范围的东西。

请注意,我已经说过有一个标题行,单元格D3:E3,列出字段名称'HDR = YES'。您没有,但我建议它:按名称调用列对于数据库引擎更容易。

请注意,我还指定了'IMEX = 0',这应该意味着'不要猜测字段类型,它们都是文本'但是JET数据库驱动程序用骑士来对待它漠视。因此,将其导入到包含文本列的表中,并在这些文本字段的后续MS-Access查询中使用您的数据类型和格式。

'IN'之后的那两个引号?不要问。

我正在使用'.xls'文件,Excel版本8.0。查找ConnectionStrings.com以获取更高版本,或在MS-Access中构建所需文件类型的链接表,并询问Tabledef.Connect属性。

现在您可以动态构建查询,为大量电子表格文件夹中的连续导入提供文件名和工作表名称;所以这是最后一段SQL,以及指定字段名称的原因:

JET SQL,用于将行直接从Excel范围插入MS-Access表:


INSERT INTO Table1 (Name, PX_Last, USD, Shares) 
SELECT *
  FROM [Sheet1$D3:E24] 
    IN "" [Excel 8.0;HDR=YES;IMEX=0;DATABASE=C:\Temp\Portfolio.xls];

这将在MS-Access数据库中运行:不要尝试从您导出的电子表格文件中的ADODB连接执行它。