Excel VBAでSQL ServerからRecordSetを受け取るときなどに,どうみてもコードは問題ないのに 「オブジェクトが閉じている場合は、操作は許可されません。」 というエラーが出ることがある.
ストアド内で複数のSQL文を使っている場合などに出る.
一時テーブルやテーブル変数を使う場合は複数のSQL文になるのが普通なのでこのエラーが出がちである.
SQLOLEDB,SQLNCLI どちらも出る.
この場合,「SET NOCOUNT ON」を付けるとエラーが出なくなる.

プログラミング覚え書きなど
Excel VBAでSQL ServerからRecordSetを受け取るときなどに,どうみてもコードは問題ないのに 「オブジェクトが閉じている場合は、操作は許可されません。」 というエラーが出ることがある.
ストアド内で複数のSQL文を使っている場合などに出る.
一時テーブルやテーブル変数を使う場合は複数のSQL文になるのが普通なのでこのエラーが出がちである.
SQLOLEDB,SQLNCLI どちらも出る.
この場合,「SET NOCOUNT ON」を付けるとエラーが出なくなる.
Microsoft Excel Object Libraryを参照する事前バインディングではビルドしたPCと配布先のPCでExcelのバージョンが違うとエラーで動かない.
バージョンが違っても動くようにするには遅延バインディングを使う.
遅延バインディングでは,Option Strict Offにしなければならないが,
Option Strictはファイル単位で指定できるのでExcel操作のコードだけ別にしてそこだけOption Strict Offにするのが良い.
または,プロジェクトのプロパティー – [コンパイル]で「遅延バインディングです~」を「なし」に設定する.
Public Sub Excel()
‘Excelを起動
Dim oExcel As Object = CreateObject(“Excel.Application”)
oExcel.Visible = True ‘Excelを表示する場合
Dim oBooks As Object = oExcel.Workbooks
Dim FilePath As String = “c:\Test.xls”
Dim oBook As Object = oBooks.open(FilePath) ‘既存ファイルを開く場合
‘Dim oBook As Object = oBooks.Add ‘新規作成の場合
Dim oSheets As Object = oBook.Worksheets
Dim oSheet As Object = oSheets.Item(1) ‘Sheet1
‘Excelファイル操作
Dim oRange As Object = oSheet.Cells(1, 1) ‘A1セル
oRange.value = “abc”
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oRange) ‘解放(使うたびに解放する)
oRange = oSheet.Cells(2, 1) ‘A2セル
oRange.value = “def”
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oRange) ‘解放
‘Excelファイル保存
oExcel.DisplayAlerts = False ‘保存しますか?を表示しない
oSheet.SaveAs(FilePath) ‘ファイル保存
oExcel.DisplayAlerts = True ‘非表示を元に戻す
‘Excelオブジェクト解放
‘FinalReleaseComObject:参照を0にする(全て解放)
‘ReleaseComObject:参照を1つデクリメントする(1つ解放)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oSheet) ‘解放
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oSheets) ‘解放
oBook.Close(False) ‘xlBookを閉じる
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oBook) ‘解放
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oBooks) ‘解放
oExcel.Quit() ‘Excelを閉じる
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oExcel) ‘解放
End Sub
注意:解放がうまくいかないと画面上でExcelが消えていてもプロセスが残ってしまうので,タスクマネージャの[プロセス]でEXCEL.EXEが残っていないことをリリース前によく確認すること.解放がうまくいかなくても普通はアプリを終了するとEXCEL.EXEも消えるが,そんなことでごまかさずに解放したらすぐにEXCEL.EXEも終了するようにすること.
参考:
Visual Basic .NET による Office オートメーション サーバーでのバインディング MS
Visual Basic .NET からオートメーションを使用して Office マクロを実行する方法 MS
.NET 開発者の観点から捉えた Excel オブジェクト モデル MS
C#によるExcel制御
http://hanatyan.sakura.ne.jp/dotnet/Excelflm.htm VBレスキュー(花ちゃん)
異なるSQL Server間でバックアップを復元した時にアクセスできなくなり,ログインのプロパティーなどでユーザーマッピングを割り当てようとすると,「ユーザー’test’の作成に失敗しました。」~「ユーザー、グループ、またはロール’test’は現在のデータベースに既に存在します。」
というようなエラーメッセージが表示されてしまうことがある.

・不明なユーザー一覧を表示する方法
USE データベース名
EXEC sp_change_users_login ‘Report’
・ユーザーマッピングの修復方法
USE データベース名
EXEC sp_change_users_login ‘Update_One’, ‘test’, ‘test’
(EXEC sp_change_users_login ‘Update_One’, ‘現在のDBに存在するユーザー名’, ‘SQL Serverログイン名’)
参考:
http://www.microsoft.com/japan/sqlserver/2005/ssj/tips/03.mspx