tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルAccess2010を起動してマクロを実行を実行した際のエラーについて
記事No11035
投稿日: 2013/02/04(Mon) 16:06
投稿者まち
はじめまして。

【環境】
VB2010(Visual Studio 2010 Ver 10.0.30319.1)
Access2010

VB2010からAccess2010を起動し、マクロを実行したいと思います。
(マクロの中でインポートモジュールを実行)
VBから起動するとDoCmdのところで、、


 COMExceptionはハンドルされませんでした。
 アクションの実行は取り消されました。


というエラーメッセージが表示され、マクロが実行できません。
Access単体でマクロを実行した場合には、
エラーは起きずにマクロが正常終了出来ています。
下記ソースでどこか間違っている点はありますでしょうか。
ご教示お願いいたします。


Dim objAccess As Object

objAccess = CreateObject("Access.Application")
objAccess.Visible = False
objAccess.OpenCurrentDataBase("D:\Test.accdb")
objAccess.DoCmd.RunMacro("mcr_Import")
objAccess.CloseCurrentDataBase()
objAccess = Nothing

[ツリー表示へ]
タイトルRe: Access2010を起動してマクロを実行を実行した際のエラーについて
記事No11037
投稿日: 2013/02/05(Tue) 00:18
投稿者VBレスキュー(花ちゃん)
> Dim objAccess As Object
>
> objAccess = CreateObject("Access.Application")
> objAccess.Visible = False
> objAccess.OpenCurrentDataBase("D:\Test.accdb")
> objAccess.DoCmd.RunMacro("mcr_Import")
> objAccess.CloseCurrentDataBase()
> objAccess = Nothing

Access は使った事がないので...。

Access 2010 なら下記のようになるかと?

   Dim objAccess As New Microsoft.Office.Interop.Access.Application
   objAccess.Visible = False
   objAccess.OpenCurrentDatabase("D:\Test.accdb")
   objAccess.DoCmd.RunMacro("mcr_Import")
   objAccess.CloseCurrentDatabase()
   objAccess.Quit()
   objAccess = Nothing

だめなようなら、下の3行をコメントにして試して見て下さい。
マクロを実行してすぐ閉じるのはどうかと思うので。
又、Excel 同様解放処理が必要になりますので、COMオブジェクトの参照カウントの
デクリメント 処理を追加しておいて下さい。

[ツリー表示へ]
タイトルRe^2: Access2010を起動してマクロを実行を実行した際のエラーについて
記事No11038
投稿日: 2013/02/05(Tue) 09:28
投稿者まち
ご教示ありがとうございました!
が、

>    Dim objAccess As New Microsoft.Office.Interop.Access.Application

これを記述すると名前空間が不適切というエラーになります。
InportsでMicrosoft.Office.Interop.Accessしても変わりませんでした。
(Microsoft Access 14.0 Object Libraryは参照設定済)
何か他に特別な記述が必要なのでしょうか。

質問ばかりで申し訳ございません。
宜しくお願い致します。


> > Dim objAccess As Object
> >
> > objAccess = CreateObject("Access.Application")
> > objAccess.Visible = False
> > objAccess.OpenCurrentDataBase("D:\Test.accdb")
> > objAccess.DoCmd.RunMacro("mcr_Import")
> > objAccess.CloseCurrentDataBase()
> > objAccess = Nothing
>
> Access は使った事がないので...。
>
> Access 2010 なら下記のようになるかと?
>
>    Dim objAccess As New Microsoft.Office.Interop.Access.Application
>    objAccess.Visible = False
>    objAccess.OpenCurrentDatabase("D:\Test.accdb")
>    objAccess.DoCmd.RunMacro("mcr_Import")
>    objAccess.CloseCurrentDatabase()
>    objAccess.Quit()
>    objAccess = Nothing
>
> だめなようなら、下の3行をコメントにして試して見て下さい。
> マクロを実行してすぐ閉じるのはどうかと思うので。
> 又、Excel 同様解放処理が必要になりますので、COMオブジェクトの参照カウントの
> デクリメント 処理を追加しておいて下さい。

[ツリー表示へ]
タイトルRe^3: Access2010を起動してマクロを実行を実行した際のエラーについて
記事No11039
投稿日: 2013/02/05(Tue) 10:08
投稿者VBレスキュー(花ちゃん)
> >    Dim objAccess As New Microsoft.Office.Interop.Access.Application
>
> これを記述すると名前空間が不適切というエラーになります。

どこでこのエラーがでていますか?
正確なエラーメッセージは?
Inports で宣言しているものはどのようなものがありますか?

> InportsでMicrosoft.Office.Interop.Accessしても変わりませんでした。
> (Microsoft Access 14.0 Object Libraryは参照設定済)

下図の参照設定の結果はどのようになっていますか?
(エラーメッセージが表示していませんか?)
又、パスのDLL名は?
http://hanatyan.sakura.ne.jp/yybbs/upl/1359624436-1.gif


> InportsでMicrosoft.Office.Interop.Accessしても変わりませんでした。
やりすぎです。
Inports Microsoft.Office.Interop
でなら、Microsoft.Office.Interop の部分は省略して
Dim objAccess As New Access.Application
のように書く事はできますが、今回のエラーの件とは関係がありません。

[ツリー表示へ]
タイトルRe^4: Access2010を起動してマクロを実行を実行した際のエラーについて
記事No11040
投稿日: 2013/02/05(Tue) 11:11
投稿者まち
ご教示ありがとうございました!

> > >    Dim objAccess As New Microsoft.Office.Interop.Access.Application
> >
> > これを記述すると名前空間が不適切というエラーになります。
>
> どこでこのエラーがでていますか?

宣言のところでエラーが起きてましたが、ご指摘通り修正したらエラーは消えました。
が、実行エラーは同じ場所(マクロを実行している部分)で起こってしまいました。
(COMException はハンドルされませんでした)
下3行目(マクロ実行部分)をコメントアウトすれば問題なく動作しましたが。。。

他に何か抜けている部分があるのでしょうか・・・


> Inports で宣言しているものはどのようなものがありますか?

Imports System.Data.OleDB

です。
他のサブルーチンでOleDbConnectionを使用しています。


> 下図の参照設定の結果はどのようになっていますか?
> (エラーメッセージが表示していませんか?)
> 又、パスのDLL名は?
> http://hanatyan.sakura.ne.jp/yybbs/upl/1359624436-1.gif

参照設定は、

Microsoft Access 14.0 Object Library
Microsoft Office 14.0 Object Library
Microsoft Visual Basic for Application Extensibility 5.3

です。

[ツリー表示へ]
タイトルRe^5: Access2010を起動してマクロを実行を実行した際のエラーについて
記事No11042
投稿日: 2013/02/05(Tue) 12:56
投稿者VBレスキュー(花ちゃん)
> 下3行目(マクロ実行部分)をコメントアウトすれば問題なく動作しましたが。。。
>
> 他に何か抜けている部分があるのでしょうか・・・

最初の回答にも書いていますが、マクロの実行中に、Access を閉じてしまうので
本来は、マクロの作業が終わってから終了処理をするべきです。


> Microsoft Access 14.0 Object Library
なら、DLL 名が、Microsoft.Office.Interop.Access.dll になっていませんか?
それなら、Dim objAccess As New Microsoft.Office.Interop.Access.Application が正しい
はずで、
>これを記述すると名前空間が不適切というエラーになります。
といったエラーがでるはずがないのですが(その箇所で)

Access や Excel のような Com オブジェクトを VB2010 等から操作する場合は、Com オブジェクト
を解放する処理が必要になります。
詳しくは、ここの Excelのプロセスが正常に終了しない理由(その1 その2)をご覧下さい。
http://www.hanatyan.sakura.ne.jp/dotnet/Excel08.htm
http://www.hanatyan.sakura.ne.jp/dotnet/Excel09.htm

[ツリー表示へ]
タイトルRe^6: Access2010を起動してマクロを実行を実行した際のエラーについて
記事No11045
投稿日: 2013/02/05(Tue) 15:28
投稿者まち
ご教示ありがとうございます!

> 最初の回答にも書いていますが、マクロの実行中に、Access を閉じてしまうので
> 本来は、マクロの作業が終わってから終了処理をするべきです。

あ、意味を取り違えて、マクロの部分をコメントアウトして実行してました!
しかし終了処理部分をコメントアウトしても、結果は同じでした。
やはりマクロ実行部分で、

COMExeptionはハンドルされませんでした

となってしまいます(ErrCode=-2146825787)。


> なら、DLL 名が、Microsoft.Office.Interop.Access.dll になっていませんか?
> それなら、Dim objAccess As New Microsoft.Office.Interop.Access.Application が正しい
> はずで、

DLL名は Microsoft.Office.Interop.Access.dll になっていました。
Dim objAccess As New Microsoft.Office.Interop.Access.Applicationに修正しても、
やはり結果は変わりませんでした。


> Access や Excel のような Com オブジェクトを VB2010 等から操作する場合は、Com オブジェクト
> を解放する処理が必要になります。
> 詳しくは、ここの Excelのプロセスが正常に終了しない理由(その1 その2)をご覧下さい。
> http://www.hanatyan.sakura.ne.jp/dotnet/Excel08.htm
> http://www.hanatyan.sakura.ne.jp/dotnet/Excel09.htm

ありがとうございます!
これに関しましては、まずマクロが動作してから考えます・・・

[ツリー表示へ]
タイトルAccess2010を起動してマクロを(18:01 追加修正)
記事No11046
投稿日: 2013/02/05(Tue) 15:53
投稿者VBレスキュー(花ちゃん)
新規のAccessのファイルに簡単なマクロを作成して
マクロを動作させるだけのコード(下記)を新規に作成して試してみてください。
その時マクロがセキュリティに引っかからないようにしておいて下さい。
(Access の参照設定はしておいて下さい)

Excel なら下記のように(Access も同様の設定があるはずですので)
ファイル→オプション→セキュリティセンター→セキュリティセンターの設定→マクロの設定→
VBA プロジェクト オブジェクト モデルへのアクセスを信頼する にチェックを入れておく事。
(ひょっとすれば、上記だけで直るかも知れませんが。)


Option Strict On

Public Class Form1

Private Sub Button1_Click(sender As System.Object, _
             e As System.EventArgs) Handles Button1.Click
   Dim objAccess As New Microsoft.Office.Interop.Access.Application
   objAccess.Visible = False
   objAccess.OpenCurrentDatabase("D:\Test.accdb")
   objAccess.DoCmd.RunMacro("マクロ1")
  ' objAccess.CloseCurrentDatabase()
  ' objAccess.Quit()
  ' objAccess = Nothing
End Sub

End Class

上記以外書かないで、実行してどうなるか教えて下さい。

因みに、私の環境では、メッセージボックスを表示するだけのマクロのファイルなら
特にコメントの部分を実行しても問題なく、何のエラーもでませんでした。
Windows 7  VB 2010 SP1Rel  .NET Framework 4.0.30319 SP1Rel  Access 2010
Access 2010 は、インストールした状態のまま。

[ツリー表示へ]
タイトルRe: Access2010を起動してマクロを(18:01 追加修正)
記事No11050
投稿日: 2013/02/05(Tue) 19:32
投稿者まち
ご教示ありがとうございます!

> ファイル→オプション→セキュリティセンター→セキュリティセンターの設定→マクロの設定→
> VBA プロジェクト オブジェクト モデルへのアクセスを信頼する にチェックを入れておく事。
> (ひょっとすれば、上記だけで直るかも知れませんが。)

ご指示通り設定してみました。


> 上記以外書かないで、実行してどうなるか教えて下さい。

まず新規にプログラムを作成し、上記をコピペしてみました。
その結果、無事マクロは実行されました。
ちなみに作成したaccdbは、今まで動かなかったVBで使用していたものでした。
(プログラム終了後、Accessのプロセスはタスクマネージャからは消えてました)

この結果を元に、今まで動かなかったプログラムを実行してみたのですが、
確かにエラー表示で止まることはなくなりました。
が、マクロは実行されていないですね。
(Access単体でマクロを実行すれば動作しますが)

とにかくマクロは動作するということはわかりました。
再度プログラムを新規で作り直した方が良さそうですか?
ただ原因がわからないと同じ轍を踏むと思われますが・・・

[ツリー表示へ]
タイトルRe^2: Access2010を起動してマクロを実行を実行した際のエラーについて
記事No11051
投稿日: 2013/02/05(Tue) 20:48
投稿者VBレスキュー(花ちゃん)
> ただ原因がわからないと同じ轍を踏むと思われますが・・・
原因は、マクロじゃないのですか?
マクロを差し替えて見たら動作したのでしょう。
問題のマクロを作り直すなり、部分的に動作させるようにするなりなりすれば
マクロのどこに問題があるのか解るはずですが。
又、セキュリティセンターの設定→マクロの設定 はどのようになっていますか?

それと、プログラムを終了してから、プロセスが残っていないか確認してもあまり意味が
ありません。

プログラムを起動中で、プログラムから Access を閉じた時点で確認しないと。
エラーがでた状態でプログラムを終了すれば、起動したファイルが開いている状態等で
マクロが実行できなくなっていたりしますので、起動前にタスクマネジャーに
Access が残っていないか確認してから起動しないといつまでたっても原因が確定できませんよ。
最初に投稿されたプログラムのようなものなら、 objAccess.Quit() せずに objAccess = Nothing
しているので、Access が閉じずに残ったままになっているはずです。
まず、問題なく解放されるようなプログラムを作ってから、テストすべきです。

[ツリー表示へ]
タイトルRe^3: Access2010を起動してマクロを実行を実行した際のエラーについて
記事No11052
投稿日: 2013/02/05(Tue) 23:34
投稿者まち
> 原因は、マクロじゃないのですか?
> マクロを差し替えて見たら動作したのでしょう。
> 問題のマクロを作り直すなり、部分的に動作させるようにするなりなりすれば
> マクロのどこに問題があるのか解るはずですが。

マクロは差し替えずに行いました。
Access単体でマクロは動作しました。


> 又、セキュリティセンターの設定→マクロの設定 はどのようになっていますか?

ご教示のあった通り、

 VBA プロジェクト オブジェクト モデルへのアクセスを信頼する

にチェックを入れています。


> まず、問題なく解放されるようなプログラムを作ってから、テストすべきです。

お恥ずかしい限りです。。
ご指摘頂いた内容を元にメモリ開放を含めて仕上げた上で、
きちっとデバッグしてみたいと思います。

再度トライする前に少し色々自分で調べてみますので、後日結果をご報告させて頂きます。
(また質問してしまう可能性もありますが・・・汗)
ありがとうございました!

[ツリー表示へ]
タイトルRe^4: Access2010を起動してマクロを実行を実行した際のエラーについて
記事No11054
投稿日: 2013/02/06(Wed) 00:02
投稿者VBレスキュー(花ちゃん)
>マクロは差し替えずに行いました。
>Access単体でマクロは動作しました。

なら

>まず新規にプログラムを作成し、上記をコピペしてみました。
>その結果、無事マクロは実行されました。

無事実行されたマクロは、どのマクロなのですか?
差し替えていないなら、元々動作しなかったマクロですか?

> > 又、セキュリティセンターの設定→マクロの設定 はどのようになっていますか?
> ご教示のあった通り、
>
>  VBA プロジェクト オブジェクト モデルへのアクセスを信頼する
> にチェックを入れています。

それは、Excel の話で、Access 2010 には、そのような項目はありましたか?
下記の4項目しかないとおもうのですが、どこにそのような項目がありましたか?
http://www.hanatyan.sakura.ne.jp/yybbs/upl/20130205asc.gif

どうも話がかみ合わない。
問題を整理して、どうしたら動かなくて、どうしたら動くのかを分けて絞り込めば、簡単に
原因が掴めるはずですが。

[ツリー表示へ]
タイトルRe^5: Access2010を起動してマクロを実行を実行した際のエラーについて
記事No11061
投稿日: 2013/02/07(Thu) 08:53
投稿者まち
レス遅くなって申し訳ございません。。

> 無事実行されたマクロは、どのマクロなのですか?
> 差し替えていないなら、元々動作しなかったマクロですか?

はい、VBからキックして動作しなかったマクロです。
ただ新規で作成したプログラムではこのマクロが動作したので、
別のところに要因があるのでしょうね。

投稿では記載してなかったですが、起動直後に管理用のAccessを開いて、
ユーザチェックを行っている箇所があります。
(個人情報を操作するのでログを取る意味も含めて)
もしかしてそこで何らかの障害が発生してマクロが動作してないかもしれないです。


> それは、Excel の話で、Access 2010 には、そのような項目はありましたか?
> 下記の4項目しかないとおもうのですが、どこにそのような項目がありましたか?
>  http://www.hanatyan.sakura.ne.jp/yybbs/upl/20130205asc.gif

すみません、一番最後の「全てのマクロを有効にする」でした(汗)


> 問題を整理して、どうしたら動かなくて、どうしたら動くのかを分けて絞り込めば、簡単に
> 原因が掴めるはずですが。

ユーザチェック部分をコメントアウト等してみてデバッグしてみます。
色々と申し訳ございません。

[ツリー表示へ]