症状
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 経由で接続する場合は、次の手順に従います。
- コントロール パネルを開き、[ODBC データ ソース 管理者] を選択します。
- DSN をダブルクリックします。
- [ODBC Microsoft Excel セットアップ] ダイアログ ボックスで、[オプション] を選択します。
- [ReadOnly] チェック ボックスがオフになっていることを確認します。
DSN レス接続を使用している場合は、接続文字列に "ReadOnly=0" オプションを含めるようにしてください。 例えば次が挙げられます。
cn.Open "Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\MyDoc.xls;ReadOnly=0;"
ステータス
この動作は設計によるものです。
詳細情報
動作を再現する手順
Visual Basic で新しい Standard EXE プロジェクトを作成します。
[プロジェクト] メニューの [参照] を選択し、Microsoft ActiveX データ オブジェクト ライブラリへの参照を追加します。
Form1 にコマンド ボタンを追加します。
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
アプリケーションを保存します。
新しい Excel ワークシートを作成し、そのワークシートを Test.xlsとして保存します。
[挿入] メニューの [名前] をポイントし、[定義] を選択します。
Excel ワークシート内に新しいテーブルを作成し、テーブルに TB1 という名前を付けます。
ワークシートを Visual Basic アプリケーションと同じフォルダーに保存します。
F5 キーを押してアプリケーションを実行します。
リファレンス
詳細については、「 Office スペース: Microsoft Office アプリケーションのスクリプト作成のヒントとテクニック」を参照してください。