• ベストアンサー
  • すぐに回答を!

AccessからExcelの起動、Excel単独起動と違う動作になる。

  • 質問No.4584419
  • 閲覧数1073
  • ありがとう数2
  • 回答数3

お礼率 74% (29/39)

お世話になります。

Access2007からExcel2003を起動しようとしています。
実際には、AccessVBAより、以下のような呼び方をしています。
-----------------------------------
Dim xlApp As Object
Dim xlBook As Object

Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
xlApp.AutomationSecurity = 2

Set xlBook = xlApp.Workbooks.Open("C:\分析.xls")

Set xlBook = Nothing
Set xlApp = Nothing
-----------------------------------
(手動で閉じる)

大体おおまかにこんな感じで作ってあります。
起動するExcelにはボタンが張り付けてあり
押すと処理が開始されます。

実際、起動そのものはされるのですが、同一ファイルにて
1.AccessからExcelを起動してボタンを押す
2.Excelを直接起動してボタンを押す
の場合、Accessからの起動では、うまく処理が行われません。

直接起動でうまくいくので、ExcelのVBAの問題ではなく、
起動時の指定、または起動のやり方がまずいのでは、と
とらえていますが、調べてもわからない状態が続いています。
(開き方や、マクロの呼び出し等方法を変えましたが
 うまくいきません)
Excelでは主に、ピポットテーブルを利用してPasteSpecialで値を
設定している作りになっています。
Access2007でもAccess2003でも同じだったと思います。

同様な経験をされ解決した方、方法をご存じの方、
ぜひ教えていただければと思います。

質問者が選んだベストアンサー

  • 回答No.3
  • ベストアンサー

ベストアンサー率 57% (3570/6233)

こんにちは。

>Set xlApp = CreateObject("Excel.Application")

これは、オートメーション・オブジェクトであって、Excel本体で起動するのとは、若干違います。というか、オートメーション・オブジェクトを作るのは、別の意図(つまり、Excel本体を含む他の影響を受けないため)を持って作るのであって、同じ働きとは必ずしも言えません。具体的には、たとえば、Excelの二重起動の際、片方が、読み取り専用になってしまいます。それでは、もうひとつのブックは保存することはできなくなってしまいます。

そして、大きな違いは、アドインやPersonal.xls を呼び出していません。また、Auto_Open などは素通りしていくこと、セキュリティが関係がなくなる、などがあります。

今回は、上記のような問題はないので、フル機能のExcelを使う場合は、このようにします。

ret = Shell("c:\Program Files\Microsoft Office\Office\EXCEL.EXE " & FileName,1)


または、
 Set WshShell = CreateObject("Wscript.Shell")

 WshShell.Run "EXCEL.EXE " & FileName , 1 , True

などとします。
注意:EXCEL.EXE のあとは、半角スペースを必ず空けて、ファイル名を付けてください。
お礼コメント
yasdon

お礼率 74% (29/39)

ありがとうございます。
Shellでうまくいかなかった、と思い込んでた様で
ご指摘の通りやるとうまく行きました。
あとはバージョンのパスの問題がありますが、なんとかします。

オートメーション・オブジェクトの考え方についても
とても参考になりました。

本当にありがとうございました。
投稿日時:2008/12/26 17:26

その他の回答 (全2件)

  • 回答No.2

ベストアンサー率 20% (8/39)

>xlApp.AutomationSecurity = 2
この1行でマクロを無効にしてるのでは?
xlApp.AutomationSecurity = msoAutomationSecurityLow
で、できるかも。
補足コメント
yasdon

お礼率 74% (29/39)

早速の回答ありがとうございます。
エクセルでの実行時に他ファイルでコピーされた値を
シートに張り付けているのですが、
その際に、貼り付けてない箇所に、IFやNETWORKDAYS関数が
うまく動いてないのが問題のようだとご指摘の内容を実行中に
気がつきました。

しかし、msoAutomationSecurityLow(=1)にしても、2でも結果は
同じです。

シート内の計算式は実行されないのであれば、
計算させる方法、
または、手動と同じ環境で起動できないものでしょうか。

原因が質問件名と変わってきたのですが、教えていただけませんか。
投稿日時:2008/12/26 14:56
  • 回答No.1

ベストアンサー率 67% (112/166)

情報が少ないので判断が難しいのですが、本当に起動方法の問題なのでしょうか?

実行されるマクロ内でのオブジェクトへの参照方法はオートメーションによる操作でも影響を受けないつくりでしょうか?
また、うまくいかないとはどういう現象が起きているのでしょうか?
補足コメント
yasdon

お礼率 74% (29/39)

早速のご回答ありがとうございます。

手動で起動した場合、うまくいって、VBAから起動させると
うまくいかない・・・なので、そう思ってました。

現象としては、ピポットテーブルの実行結果が
「#NAME?」となっていますようです。

VBAのソースを見る限り、外部のファイルのデータ取得も
絶対パスとなっているので、大丈夫だと思ってました。
・・・甘いですかね。

ピポットのピの字もわからないので、
集計しているテーブルみたいなものとしかとらえてなかったのですが
ソース的には、自ファイルにコピペしたシートから
情報と取っているようです。
(追いづらいので、読み切れてません)

すみません、補足になりましたでしょうか。
投稿日時:2008/12/26 14:41
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ページ先頭へ