PRB: "操作は更新可能なクエリを使用する必要があります" ODBC を使用して Excel にアクセスする場合

現象

ADO と ODBC を使用して Excel ワークシートを編集すると、ADO DataControl オブジェクトを使用すると、次のエラー メッセージが表示されることがあります。

[Microsoft][ODBC Excel Driver] Operation must use an updateable query.

ADO コードで生成される Recordset オブジェクトを使用する場合、ADO と ODBC を使用して Excel ワークシートを編集するときに、次のエラー メッセージが表示されることがあります。

Run-time error '-2147467259(80004005)': [Microsoft][ODBC Excel Driver] Operation must use an updateable query.

原因

この問題は、ReadOnly として保存または開かれたワークシートを編集しようとすると発生します。

注:

ReadOnly は、データ ソース名 (DSN) の有無にかかわらず、Excel への ODBC 接続の既定の設定です。 そのため、ユーザーは常にその設定を変更してデータを編集する必要があります。

解決方法

この問題を解決するには、次の方法を使用します。

  • Recordset オブジェクトの LockType プロパティが ReadOnly に設定されていないことを確認します。

  • 開こうとしているファイルが ReadOnly として保存されていないことを確認します。

  • DSN を介して接続する場合は、次の手順に従います。

    1. コントロール パネルを開き、[ODBC データ ソース管理者] をクリックします。
    2. DSN をダブルクリックします。
    3. [ODBC Microsoft Excel セットアップ] ダイアログ ボックスで、[オプション] をクリックします。
    4. [ReadOnly チェック] ボックスが選択されていないことを確認します。
  • DSN レス接続を使用している場合は、必ず 接続文字列に "ReadOnly=0" オプションを含めます。 例:

    cn.Open "Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\MyDoc.xls;ReadOnly=0;"
    

状態

この動作は仕様です。

詳細情報

動作を再現する手順

  1. Visual Basic で新しい Standard EXE プロジェクトを作成します。

  2. [プロジェクト] メニューの [参照] をクリックし、Microsoft ActiveX データ オブジェクト ライブラリへの参照を追加します。

  3. [コマンド] ボタンを Form1 に追加します。

  4. Form1 に次のコードを追加します。

    Dim rs As ADODB.Recordset
    Dim cn As ADODB.Connection
    
    Private Sub Form_Load()
      Command1.Caption = "Edit"
    End Sub
    
    Private Sub Command1_Click()
      Dim DocPath As String
    
      DocPath = App.Path & "\Test.xls"
    
      Set cn = New Connection
      Set rs = New Recordset
    
      cn.Open "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & DocPath & ";ReadOnly=1"
      rs.LockType = adLockOptimistic
      rs.Open "TB1", cn
      rs.AddNew
      rs.Fields(1).Value = "New Value"
      rs.Update
    
      rs.Close
      cn.Close
      Set rs = Nothing
      Set cn = Nothing
    End Sub  
    
  5. アプリケーションを保存します。

  6. 新しい Excel ワークシートを作成し、ワークシートを Test.xls として保存します。

  7. [挿入] メニューの [名前] をポイントし、[定義] をクリックします。

  8. Excel ワークシート内に新しいテーブルを作成し、テーブルに TB1 という名前を付けます。

  9. Visual Basic アプリケーションと同じフォルダーにワークシートを保存します。

  10. F5 キーを押してアプリケーションを実行します。

関連情報

詳細については、次の記事を参照してください。

Office スペース: Microsoft Office アプリケーションをスクリプト化するためのヒントとテクニック