dポイントプレゼントキャンペーン実施中!

いつもお世話になっております。

現在、Access2003でDBを作成中です。
"テーブル1"をパラメータクエリで抽出します。"クエリ1"。
そのクエリを基にフォームを作成しています。"フォーム1"。これは抽出して印刷したり、Excelに出力するために作成しました。レポートではなく、フォームにした理由は、コマンドボタン等を配置できることからです。

Excelに出力する際のVBAでつまづいてしまいました。
DoCmd.OutputTo acOutputForm, "フォーム1", acSpreadsheetTypeExcel9

これで問題なく出力できています。が、、、
Access2007の一部のPCでこれを実行するとエラーが出ます。
原因は"OutputTo"が含まれているとエラーになるようです。
ちなみにエラーは「現在出力しようとしているオブジェクトの形式は無効です。」
「2007 Office スイート Service Pack 2」こちらをインストールすると良いそうなのですが、だめでした。
WindowsXP、Office2007はこのVBAだとエラーになります。
WindowsVista、Office2007は正常に使えました。
PCの何か設定?と考えたりもしたのですが、はっきりとした原因がわからないのでは、他の人にDBを使っていただけないので、エラーにならないVBAでいきたいです。

もうひとつ、
mFileName = InputBox("ファイル名を入力してください。")
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "フォーム1", mFileName

こちらのVBAはクエリの出力だとうまくいくのですが、フォームだとだめでした。
クエリから抽出して保存すれば良いのですが、理想はこの形です。

1.フォーム1を開くと「担当者を入力」とパラメータクエリが働き、抽出結果をフォーム1に表示される。
2.[出力]ボタンを押すと、ダイアログボックスが開いてファイル名を指定して保存する。または、ダイアログボックスが開かなくても名前を指定できれば良いです。最悪、指定できなくても良いですが、原因となる、"OutputTo"を避けたVBAでいきたい。
3.mFileName = InputBox("ファイル名を入力してください。")
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "クエリ1", mFileName
これだと、1.でパラメータクエリで抽出結果をフォームに表示させて、2.で[出力]ボタンを押すと、また、パラメータクエリで抽出しなければならなくなるのでできれば避けたいです。
こちらの条件でご教授お願い致します。
また、WindowsXP、Office2007でエラーが出ましたので、これを解決する方法でも良いです。
よろしくお願い致します。

A 回答 (1件)

> PCの何か設定?と考えたりもしたのですが、はっきりとした原因がわからないのでは、


> 他の人にDBを使っていただけないので、エラーにならないVBAでいきたいです。

こちらのOSはWinXPのみなので、そちらでの全ての状況を確認できたわけでは
ありませんが、対処法は(多分)見つかりましたのでご報告します。

【対処方法】
現状のコードを以下のように修正します(OutputToメソッドで対応可)。

<現状>
DoCmd.OutputTo acOutputForm, "フォーム1", acSpreadsheetTypeExcel9
(「WinXP&Acc2003」で出力可、「WinXP&Acc2007」で出力不可を確認)

<修正>
DoCmd.OutputTo acOutputForm, "フォーム1", acOutputXls
(「WinXP&Acc2003」、「WinXP&Acc2007」ともに出力可を確認)


【説明】
VBE画面で「OutputTo」のところにカーソルを移動した状態でF1キーを押すと、
対応するヘルプが表示されるので確認されることをお勧めしますが、このメソッドの
第3引数(OutputFormat)には、「AcFormat」クラスの定数(→「acFormat~」で
始まる形になっています)を指定することになっています。

・・・なのにAcc2003だと、本来「TransferSpreadsheet」メソッドで使用するはずの
「AcSpreadsheetType」クラスに属するacSpreadsheetTypExcel9を指定しても、
エラーにならずに出力できてしまうようです。

一方、Acc2007では、これが厳密に適用されるようになったため、提示されたコード
では、「現在出力しようとしているオブジェクトの形式は無効です」とのエラーが発生
するようになったものと推測されます。


・・・従って、上記の修正は、「本来Acc2003のOutputToでも使用されるべき
引数の型」を指定しただけ、ということになりますので、OS・Applicationの違いに
関係なく、エラーは発生しなくなるものと思います。
(なまじAcc2003で柔軟に対応されてしまったために、Acc2007への移行で余計な
 混乱を招かれてしまった、ということかと・・・(汗))


※TransferSpreadsheetメソッドの件は、元々OutputToメソッドの代替策として
  検討されたものと思いますので、省略します。
  (フォームの出力には対応していないので、強引にやるなら一時テーブルを
  作成してデータをコピーして・・・といったことになり、煩雑ですので)
    • good
    • 0
この回答へのお礼

大変参考になりました。上記の方法で解決できました。
とても詳しく解説して下さり、わかりやすくて、大変助かりました。ありがとうございました。

お礼日時:2009/12/24 14:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す