[PRB] DAO の OpenRecordset を使用すると Excel の値として NULL が返される

文書翻訳 文書翻訳
文書番号: 194124 - 対象製品
すべて展開する | すべて折りたたむ

目次

現象

DAO OpenRecordset メソッドを使用して Excel スプレッドシートに接続すると、本来 Null でない Excel 列内の一部の値が Null として返されることがあります。この現象は通常、Excel の同一列内に数値型のデータと文字列型のデータが混在している場合に発生します。

原因

この問題は、Excel ISAM ドライバの制限が原因で発生します。ISAM ドライバでは、Excel 列のデータ型をいったん認識すると、その Excel 列のデフォルトのデータ型とは異なる値に対して Null を返します。Excel ISAM ドライバでは、最初の数行の実際の値を調べ、そのサンプルから主要な値のデータ型を選択して、Excel 列のデータ型を決定します。

解決方法

この現象を回避する方法は、2 つあります。
  1. Excel のデータが文字列として入力されるようにします。Excel 列の書式を文字列に変更するだけでは、この変換を行うことはできません。Excel 列の書式を変更した後、既存の値を再入力する必要があります。Excel では、F5 キーを押すことで、選択されているセルの既存の値を再入力できます。
  2. OpenDatabase メソッドの Excel への接続文字列にオプション IMEX=1; を追加することができます。以下に例を示します。
          Set Db = OpenDatabase("C:\Temp\Book1.xls", _
                False, True, "Excel 8.0; HDR=NO; IMEX=1;")
    
    						
    : IMEX=1 を設定すると、ドライバでインポート モードが使用されます。この状態では、レジストリ設定 ImportMixedTypes=Text が認識されます。これにより、混在していたデータ型が強制的に文字列に変換されます。動作の信頼性を高めるには、レジストリ設定 TypeGuessRows=8 の変更も必要な場合があります。ISAM ドライバはデフォルトでは最初の 8 行をチェックして、そのサンプリングの結果でデータ型を決定します。サンプリング対象の 8 行に数値しか含まれていない場合、IMEX=1 を設定してもデフォルトのデータ型は文字列に変換されず、数値型のままです。

    IMEX=1 が無差別に使用されないように注意する必要があります。これはインポート モードであるため、このモードでデータの追加や更新を行った場合、予期しない結果になる可能性があります。

    IMEX で使用できる設定を以下に示します。
            0 はエクスポート モードです。
            1 はインポート モードです。
            2 はリンク モード (完全な更新が可能) です。
    
    上記の設定ができるレジストリ キーは次の場所にあります。

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

    Excel スプレッドシートの文字列型の列見出しに数値データが含まれている場合の関連情報については、この資料の「関連情報」を参照してください。

状況

この動作は仕様です。

詳細

現象の再現手順

この問題を再現するには、まずデフォルトのワークシート Sheet1 が含まれているブックを作成します。Sheet1 の最初の列に、123、aaa、456、bbb、789 と値を入力します。このブックに Book1.XLS という名前を付けて C:\Temp ディレクトリに保存します。

Visual Basic で、標準 EXE プロジェクトを作成し、以下の手順を実行します。
  1. Microsoft DAO 3.5 Object Library への参照を設定します。Visual Basic 6.0 では、Microsoft DAO 3.51 Object Library への参照を設定します。
  2. 新規フォームに CommandButton コントロールを追加します。
  3. フォームの General Declarations セクションに次のコードをコピーして貼り付けます。
          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 Knowledge Base) をクリックしてください。

190195 DAO を使用して Excel シートから情報を抽出する方法

プロパティ

文書番号: 194124 - 最終更新日: 2006年8月14日 - リビジョン: 4.0
この資料は以下の製品について記述したものです。
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 4.0 Enterprise Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition
キーワード:?
kbprb KB194124
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com