【问题标题】:Reading and working with strings longer than 255 with ADODB Excel 2010 VBA使用 ADODB Excel 2010 VBA 读取和处理超过 255 个字符串
【发布时间】:2014-11-05 16:17:10
【问题描述】:

给你们一个东西:

我想在 VBA EXCEL 中使用 ADODB 从已关闭的工作簿中读取信息。 有时excel中单元格中的字符串长度大于255。

然后是这个限制:http://support.microsoft.com/kb/189897

“如果要截断的字段的前 8 条记录包含 255 个或更少字符,则您的数据可能会被截断为 255 个字符。默认情况下,Microsoft Excel ODBC 驱动程序会将数据的前 8 行扫描到确定每一列中的数据类型。”

对此有一个“解决方案”:在注册表中将 TypeGuessRows 值设置为零 (0),但是:

“出于性能原因,如果您的 Excel 表非常大,不建议将 TypeGuessRows 值设置为零 (0)。当此值设置为零时,Microsoft Excel 将扫描您表中的所有记录以确定类型每一列的数据。"

这是我的问题:

有没有一种方法可以告诉(谎言)驱动程序读取超过 255 个字符(除了在每列的第一行放置一个虚拟字符串或将 TypeGuessRows 值设置为零 (0))。

如果我不能;有没有办法写入已关闭的 Excel 工作簿并保存更改,以便在从已关闭的工作簿中读取信息之前,我可以在每列的顶部插入虚拟第一行。

【问题讨论】:

  • 你用TypeGuessRows = 0实际测试过性能吗?首先看看对性能有多大影响是有意义的......
  • 顺便说一句。您可以使用 cn.Execute("INSERT INTO [namedRange] Values ('" & String(255, "i") & "'))" 插入值,但它不会接受超过 255 个字符的字符串,因此不要依赖此作为解决方案。
  • 我没有用 TypeGuessRows = 0 测试过性能但是我的文件很大,有很多信息,很多行,其中一些是共享的,我不想弄乱注册表设置。所以这对我来说不是解决方案。
  • 我想知道微软为什么不解决这个愚蠢的问题。
  • @user2781180 我认为公认的答案给了我们原因:“旧的 Excel 二进制格式逐渐过时”。我不希望这会得到解决。

标签: vba excel ado adodb


【解决方案1】:

编辑:

除非你愿意经历unzipping and editing the underlying XML data的艰辛过程,否则答案是否定的。

但是,如果您可以放宽不打开这些源文件的限制,那么下面的过程将起作用。

原答案:

由于您已经在 Excel VBA 中工作并且愿意添加虚拟数据行,因此在查询数据之前将以下内容添加到您的宏中:

  • 在 Excel 中以本机方式打开文件
  • 插入虚拟行
  • 关闭并保存文件

然后您可以继续使用 ADODB 从已关闭的 Excel 文件中查询数据。

【讨论】:

  • 我想从已关闭的工作簿中读取信息。我想写入已关闭的 Excel 工作簿并保存更改。关闭的工作簿。我不想打开它们。如果我愿意,我不会使用 ADODB。不过感谢您的回答。
  • @МартинП。尽管描述了一些公式黑客,例如在vba4all.wordpress.com/2013/10/11/… 在 Excel 中以不可见的方式打开工作簿 (stackoverflow.com/questions/579797/…) 对我来说似乎是最简单的解决方案。也许应该重新考虑您正在解决的整个用例(问题中未描述)(及其约束)。将“大量信息”从 Excel 泵入本地 SQL Express 引擎可能就是这样一种选择
【解决方案2】:

几年前你的问题会非常有趣和最新。

自 2007 年以来(请参阅 MSDN: Introducing the Office (2007) Open XML File Formats),旧的 Excel 二进制格式逐渐过时,被留在封闭源代码空间中,一些遗留 API(连同其局限性)被替代品取代,尤其是 Microsoft: Open XML SDK 2.5

我不知道您是否可以破解旧版 ADODB 驱动程序以使其行为不同,但肯定有其他方法和库可以完成工作。

一些相关的 Stack Overflow 问题以及可能有用的解决方案的链接:

一些相关的 API(用于 C#)替换 ADODB 并消除其限制:

【讨论】:

  • 非常感谢。我想我应该开始学习 C#。我希望我只能使用 VBA 来做到这一点......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多