返回为 NULL 使用 DAO OpenRecordset PRB: Excel 值

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 194124
本文已归档。它按“原样”提供,并且不再更新。
症状
连接到使用 DAO OpenRecordset 方法一个 Excel 电子表格时, 在 Excel 中的某一专栏中某些值可能会返回 Null 作为基础值不为 Null 时。这种情况通常发生数字和文本数据类型混合相同的 Excel 列中。
原因
此问题是由 Excel ISAM 驱动程序的限制引起的因为它决定了 Excel 列的数据类型后它将返回的数据类型 ISAM 驱动程序不是任何值为 Null 具有默认为该列的 Excel。Excel ISAM 驱动程序通过检查在前几行中的实际值来确定一个列,Excel 的数据类型,然后选择类型的值,该值代表在其采样中值的大多数数据类型。
解决方案
有两种替代方法,此问题:
  1. 确保数据在 Excel 中的以文本形式输入。只重新格式化为文本 Excel 列将不完成此操作。后重新格式化 Excel 列中,您必须重新输入现有的值。在 Excel 中,您可以使用 F5 重新输入在所选单元格中的现有值。
  2. 您可以添加选项 IMEX = 1 ; 要将 Excel 连接 OpenDatabase 方法中的字符串。例如:
          Set Db = OpenDatabase("C:\Temp\Book1.xls", _            False, True, "Excel 8.0; HDR=NO; IMEX=1;")						
    注: 设置 IMEX = 1 通知驱动程序使用导入模式。在此的状态将注册表设置 ImportMixedTypes = 文本将会注意到。这将强制转换为文本的混合的数据。为此可靠地工作,还必须修改注册表设置 TypeGuessRows = 8。该 ISAM 驱动程序默认情况下查找前八行,并从该采样确定数据类型。如果此八行采样为所有数值,则设置 IMEX = 1 将不将默认数据类型转换为文本,它将保留数值。

    您必须注意该 IMEX = 1 不能使用不加区别地。这是导入模式以便结果可能是不可预测,如果您尝试执行追加或更新此模式中的数据。

    IMEX 的可能的设置是:
            0 is Export mode        1 is Import mode        2 is Linked mode (full update capabilities)						
    上述这些设置位于的位置的注册表项是:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.5\Engines\Excel

    当 Excel 电子表格具有文本的数字数据的列标题上看到信息,请参阅该文章的参考的部分。
状态
此行为是设计使然。
更多信息

重现行为的步骤

若要重复的这一问题首先要使用默认工作表 Sheet1 电子表格创建 Excel 工作簿。在工作表 Sheet1 的第一个列中输入以下值-123,aaa,456,bbb,789。将此工作簿保存在您的 C:\Temp 目录并将其命名 Book1.XLS。

在 Visual Basic 中创建一个新的标准 EXE 项目,请按照下列步骤操作:
  1. 请对 Microsoft DAO 3.5 对象库的引用。在 Visual 的基本 6.0 中,这将是 Microsoft DAO 3.51 对象库。
  2. 将命令按钮添加到新窗体。
  3. 将以下代码放在窗体的通用声明部分中:
          Dim Db As Database      Dim Rs As Recordset      Private Sub Command1_Click()          Set Rs = Db.OpenRecordset("Sheet1$")          'This will print the spreadsheet Text values as Nulls.          Do While Not Rs.EOF              Debug.Print Rs(0)              Rs.MoveNext          Loop      End Sub      Private Sub Form_Load()          'HDR refers to the Excel header row.      Set Db = OpenDatabase("C:\Temp\Book1.xls", _               False, True, "Excel 8.0; HDR=NO;")      End Sub      Private Sub Form_Unload(Cancel As Integer)          Db.Close          Set Db = Nothing      End Sub						
    通过按 F5 键运行项目,请注意在调试窗口中的文本值作为打印 Null。如果在 Excel 电子表格中值的大部分是文本,然后将结果从上面的代码将能反转。也就是数字值将作为 null 值返回呢。
参考
有关更多的信息,请参阅下面 Microsoft 知识库中相应的文章:

190195: HOWTO: 使用 DAO 的 Excel 工作表中提取信息
kbDSupport kbdse 电子表格的工作簿 kbDAO350 kbDAO300 kbDAO250 kbIISAM kbExceL kbVBp400 kbVBp500 kbVBp600 kbVBp kbRegistry

属性

文章 ID:194124 - 上次审阅时间:12/05/2015 09:27:54 - 修订版本: 4.0

Microsoft Visual Basic 4.0 专业版, Microsoft Visual Basic 5.0 专业版, Microsoft Visual Basic 6.0 专业版, Microsoft Visual Basic 4.0 企业版, Microsoft Visual Basic 5.0 企业版, Microsoft Visual Basic Enterprise Edition for Windows 6.0

  • kbnosurvey kbarchive kbmt kbprb KB194124 KbMtzh
反馈