|
▼小僧 さん:
回答ありがとうございます。
お礼が遅れて申し訳ありません。
>Workbook.Close は Excel のメニューから
>[ファイル] → [閉じる] の動作、
>
>Application.Quit は Excel のメニューから
>[ファイル] → [終了] の動作と同意です。
>
>
>Set xx = Nothing については
>以前に同じ様な事を回答した事があるので
>ご参考までに紹介させて頂きます。
>
>h tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=9646;id=access
上記確認しました。
いろいろな考えがあるようですが、開けたドアは閉じてみたほうがいいのかな・・?。
参考になりました。
ありがとうございます。
>
>> Set qdf = DB.QueryDefs("Q_社保エクスポート用")
>> qdf.SQL = str
>> qdf.Close
>>
>> 'レコードセットを開く
>> Set rst = DB.OpenRecordset("Q_社保エクスポート用")
>
>何回かレコードセットを開きなおしているようですが、
>QueryDef オブジェクトをそのまま使って
>qdf.OpenRecordset なんて使い方もできますよ。
>
>また、3回目にセットしている箇所も
>Dynaset タイプで開く必要がなさそうですので、
>1回だけ開けば問題なさそうですね。
レコードセットを開くということをいまいち理解できていないので、
上記のことがよくわかりません。
Dynaset タイプもヘルプで調べてみたんですが、どういう場合にこのタイプがいいのかまで理解できませんでした・・。
ただ、1回開けばいいとのご指摘でしたので、ご指摘を参考に次のように記述してみたら、エラーもなく実行されました。
でも、何回か試していると、なぜか、エクセルが読み取り専用で開かれたりします。
どこかおかしい記述があるんでしょうか?
ご指摘いただけたら幸いです。
'クエリの作成
str = str & constr & ";"
Debug.Print str
Set DB = CurrentDb()
Set qdf = DB.QueryDefs("Q_社保エクスポート用")
qdf.SQL = str
'qdf.Close ←これを削除
'レコードセットを開く
Set rst = qdf.OpenRecordset ←これを追加
'Set rst = DB.OpenRecordset("Q_社保エクスポート用")←これを削除
If rst.RecordCount = 0 Then
MsgBox "対象者がいません。", vbOKOnly, "データなし"
rst.Close
DB.Close
Else
'rst.Close ←これを削除
'DB.Close ←これを削除
'オブジェクトの作成
Set xlsApp = CreateObject("Excel.Application")
'ファイルを開く
MyFile = "D:\My Documents\2008\社会保険届出関連\WT_社保資格喪失.xls"
Set xlsWkb = xlsApp.Workbooks.Open(MyFile)
'Set rst = CurrentDb.OpenRecordset("Q_社保エクスポート用", dbOpenDynaset) ←これを削除
xlsWkb.Worksheets("T_社保資格喪失").Range("A11.M100").ClearContents
xlsWkb.Worksheets("T_社保資格喪失").Range("A11").CopyFromRecordset rst
MsgBox "処理が終了しました。" & vbCr & "D:\My Documents\2008\社会保険届出関連\WT_社保資格喪失.xlsを開いて届出帳票を印刷してください。"
xlsApp.UserControl = True
xlsApp.Visible = True
AppActivate "Microsoft Excel"
>
>> オブジェクトがないというエラーメッセージが出ます。
>
>上の方にある
>
>> xlsApp.Quit: Set xlsApp = Nothing
>
>という箇所で、変数:xlsApp への参照を切ってしまったために
>
>xlsApp.Workbooks.Open (MyFile)
>
>がうまくいってないですね。
>
>kohjiさんご指摘の通り、Excelを閉じないのが一番の回避策ですが、
>Quit を後にすればもう一度開く事もできるかと思われます。
こちらのご指摘は、時間がなくてまだ確認していません。
試してみて分からなければ、また質問させてください。
|
|