アプリ版:「スタンプのみでお礼する」機能のリリースについて

オフィス2007です。

//////////////////////////////////////////////////////////
‘Excel側の標準モジュール
//////////////////////////////////////////////////////////

Sub Excelのプロシージャー()
MsgBox "Excelです"
End Sub

//////////////////////////////////////////////////////////
‘Access側の標準モジュール
//////////////////////////////////////////////////////////

Sub Accessのプロシージャー()
Dim xlsWB As Object
Dim MyFileName As String
MyFileName = "D:\Accessからプロシージャーの実行テスト用ファイル.xlsm"

Set xlsWB = GetObject(MyFileName)
xlsWB.Application.Run xlsWB.Name & "!Excelのプロシージャー"
Set xlsWB = Nothing

End Sub

の状態で、アクセス側から Accessのプロシージャー実行すると、

//////////////////////////////////////////////////////////
マクロ'Accessからプロシージャーの実行テスト用ファイル.xlsm!Excelのプロシージャー'
を実行できません。
このブックでマクロが使用できないか、
またはすべてのマクロが無効になっている可能性があります。
//////////////////////////////////////////////////////////
となります。

エクセル側は、「すべてのマクロを有効にする」にしているし、エクセルファイルを単独で開き、
Excelのプロシージャーを実行すると問題なく動きます。

同じ条件で、2003で検証すると問題なく動きます。(拡張子は適宜変えてます)

エクセルのパスが間違ってるのかな?と思い、適当なパスに変えたところ、
「オートメーション操作中にファイル名またはクラス名を見つけられませんでした。(Error 432)」
というエラーがでたので、パスは合ってます。

原因がわかる方、ご回答よろしくお願いします。

A 回答 (2件)

こんにちは。



ご質問を何度か読みなおしてみて、はっきりしない部分がいくつかありました。今は、回答に足るだけの情報を持ちあわせていません。

不明な点は、
 ・One PC に、2つのバージョンが入っているかどうか。
 ・Access 2007 から、Excel 2003 と Excel2007 を使いわけようとしているのか。
 ・Access 2003 - Excel 2003 が成功して、Access 2007 - Excel 2007が不成功なのか。

どうやら、最初のOne PCに、2つのバージョンが入っているのではなさそうだ、ということだけは、検証の上分かりました。

あくまでも、オートメーションということで考えてみました。
 Access 2007 - Excel 2007 ×(失敗)
 Access 2003 - Excel 2003 ?(2 Versionsの中で、これは難しい)
 Access 2007 - Excel 2003 ?(2 Versionsの中で、これも難しいはずです)

[難しいというのは簡単ではないというだけで、可能です。しかし、そのようなことは、ほぼありえない。]

PCによって違うなら、
 Access 2003 - Excel 2003 ○(成功)

ご質問から、以上の推論を立ててみました。

ご質問のコードは、Accessユーザー独特(MS側のサンプルがそうです)のコードのようです。

>Set xlsWB = GetObject(MyFileName) 'Excelファイル名指し

これで、問題はないはずですが、私自身は、Office 2007で、このようなことはしたことがありません。このコードは、特定のインスタンスの開いていることが条件で、そのインスタンスに接続しているのですから、Excelが起動できない状態だったら、成立しません。だから、Excel VBAやVBプログラマでは、このようなダイレクトにファイル名の名指しはしていません。それは、エラーを想定してコードを組むからです。

こういう場合は、一旦、CreateObject("Excel.Application") で、Excelのオートメーション・オブジェクトを作ってしまえば、セキュリティは通るはずです。

Set xlsWB = CreateObject("Excel.Application")
xlsWB.Run xlsWB.Name & "!Excelのプロシージャー"
Set xlsWB = Nothing

元の質問を読み違えていたら、この回答は、すべて無意味です。その場合は、どうか、ご質問内容を、もう一度検証した上で、こちらの回答は、お見捨てください。
    • good
    • 0
この回答へのお礼

説明不足で申し訳ございません。

一つのPCに対してオフィスは1つです。
会社のPCと自宅のPCで検証してました。
バージョンを跨いで使おうとはしていません。
会社のPCではacces2003からexcel2003へ
自宅のPCでは、access2007からExcel2007へ
行なおうとしてました。

>・Access 2003 - Excel 2003 が成功して、Access 2007 - Excel 2007が不成功なのか。

そうなんです。

仰る通りAccess 2003 - Excel 2003 は成功します。ご明察です。

GetObjectをCreateObjectに変更したらうまくいきました!
GetObjectが原因のようですね。
ありがとうございました。大変参考になりました。

お礼日時:2012/10/18 23:39

あまり参考にならないかもしれませんが、


渡辺ひかる の「ExcelVBA  実用サンプルコレクション(ISBN4-7973-2087-7)]
Office連携 P589 にExcelからAccessを起動し、reportを印刷する。
と言うサンプルがあります。

ExcelにてAccessのObjectを設定し、そのObjectを操作することで、
実態としてのAccess(Acessのマクロ等)を動かすというものです。

dim myAcApp as Access.Application
Set myAcApp = CreateObject("Access.Application")
With myAcApp
--
--
End With
Set myAcApp = noyhing
    • good
    • 0
この回答へのお礼

アクセスからエクセルのプロシージャーを実行させたいので逆にして実行してみましたが、
ピボットテーブルの操作なども含まれている為、
エクセル側で作成したsubプロシージャーを実行したいのです。

ちなみにアクセス側で、

Call Excelのプロシージャー

を追加してみたところ、コンパイルエラーになってしまいます。

お礼日時:2012/10/17 19:52

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