tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルcreateobject
記事No15507
投稿日: 2012/06/13(Wed) 17:10
投稿者YFC
私は、今まで見よう見まねで、VBAでマクロを作成してきた、ほとんど素人の者です。

XP 32bitの環境で、excel2007 VBAを使って作成したマクロを長年問題なく使用してきてきたのですが、
このマクロ内で、createobjectを使って他の起動中のアプリケーションのオブジェクトを
取得していています。
このマクロをWin7x64の環境で実行すると、createobject実行時に、すでに起動中のオブジェクトを
取得せずに、新規にそのアプリケーションのオブジェクトを作成してしまい、マクロがうまく動作しません。(getobjectを使用すると、オブジェクトが取得できない旨のエラーがでます。)

コードを少し変更すれば、使えるようになる等の情報があれば助かります。
あるいは、wow64の根本的な問題で、
このマクロはこの環境の組み合わせでは、使用できないでしょうか?

いままで、簡単なコードということもあり、できるだけ自分で解決してきたのですが、さすがに
手に負えないと感じ、質問させていただいた次第です。よろしくお願いします。

[ツリー表示へ]
タイトルRe: createobject
記事No15508
投稿日: 2012/06/13(Wed) 17:34
投稿者魔界の仮面弁士
> createobjectを使って他の起動中のアプリケーションのオブジェクトを
> 取得していています。
何を CreateObject しているのでしょうか?
InternetExplorer.Application?
Shell.Application?
Excel.Application?


> このマクロをWin7x64の環境で実行すると、
OS は 64bit 版との事ですが、その上で動作させようとしている VBA7 は
64bit版でしょうか? それとも 32bit版ですか?


> createobject実行時に、すでに起動中のオブジェクトを取得せずに、
それが普通だと思いますよ、"Create" するのですから。

とはいえ、こうした動作は各オブジェクトごとに事情が異なるのも事実です。

たとえば起動済みの InternetExplorer オブジェクトを取得する場合、環境によって、
 Set IE = GetObject(, "InternetExplorer.Application")
で動作する場合もあれば、
 Set IE = GetObject("", "InternetExplorer.Application")
で動作する場合もあります。前者がエラーになるけど後者は使えるとか、その逆とか、
あるいは既存オブジェクトの取得になる環境と新規起動になる環境とがあったりと。

一応、InternetExplorer に限って言えば、ShellWindows コレクション経由で
 Set SO = CreateObject("Shell.Application")
 Set ShWins = SO.Windows()
 For Each IE In ShWins
  MsgBox IE.LocationURL
 Next
のようにして列挙すれば、GetObject よりは環境依存度を減らすことはできます。

ただ、すべてのオブジェクトが、こうした列挙機能を持っているわけでは無いので、
対象アプリケーションそれぞれで、個別に対応は必要になってくると思います。


ちなみに Excel や Access などであれば、ROT から辿る方法が使えます。
VBA7 向けのコードでは無いですが、VB.NET 向けのサンプルであればこのあたり。
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=10322&page=0


>(getobjectを使用すると、オブジェクトが取得できない旨のエラーがでます。)
> コードを少し変更すれば、使えるようになる等の情報があれば助かります。
現時点でどのようなコードを書いているのかが分からない以上、
それをどのように直すべきか指摘することは敵いません…。(^^;)

[ツリー表示へ]
タイトルRe^2: createobject
記事No15509
投稿日: 2012/06/13(Wed) 19:50
投稿者YFC
早速のレス、大変ありがとうございます。

excel2007で作成したマクロを、excel2007でそのままWin7x64で実行していただけで、VBAのバージョン調べたことが無かったのですが、確認すると6.5になっていました。
これをVBA7にアップデートできるのでしょか?あるいは、excel2010を購入する必要があるでしょうか?

業務で3DCADのSolidWork(64bit版)というソフトを使っていますが、そのオブジェクトを取得するのに
Set swapp = CreateObject("sldworks.application")
としています。教えていただいた
Set swapp = GetObject("", "sldworks.application")
を早速試したのですが、createobjectを実行したときと同じ動作になりました。
(Set swapp = GetObject(, "sldworks.application")はオブジェクトが取得できないとエラー)

原因はVBAのバージョンの可能性が高いでしょうか?
何度も申し訳ありませんがよろしくお願いします。

[ツリー表示へ]
タイトルRe^3: createobject
記事No15510
投稿日: 2012/06/13(Wed) 21:51
投稿者魔界の仮面弁士
> 確認すると6.5になっていました。
すみません、勘違いです。Excel 2007 は 6.5 で正しいです。
VBA7 は Excel 2010 で採用されているバージョンです。
http://msdn.microsoft.com/ja-jp/library/ee691831.aspx

<蛇足情報>
VBA7 では、LongLong 型や CLngLng 関数などの、64bit対応の機能が追加されています。
http://msdn.microsoft.com/en-us/library/ff520658%28PROT.10%29.aspx

なお、Office 2010 の DVD には 64bit 版のインストーラが同梱されていますが、
既定のセットアップのまま進めた場合は、32bit版がインストールされるようになっています。
</蛇足情報>


> SolidWork(64bit版)というソフトを使っていますが
  SolidWork ですか?
  SolidWorks ではなく?

> Set swapp = CreateObject("sldworks.application")
そのコードを実行した結果、そのアプリがどのように立ち上がるのかは、
アプリケーション(SolidWork)側の仕様によるもので、VBA 側のバージョンは関係ありません。
(同じアプリケーションでも、設定によって振る舞いが変わる可能性もありますし)


> Set swapp = GetObject("", "sldworks.application")
Excel などでは、
 Set xlBook = GetObject("C:\temp\依頼書.xls")
 'Set xlApp = xlBook.Application
 'Set xlWindow = xlApp.Windows(1)
 'xlApp.Visible = True
 'xlWindow.Visible = True
のように、文書ファイル名を指定して、既存のオブジェクトを得る手法もありますが、
(ファイルが開かれていない場合は、そのファイルが自動的に開かれる)
私はSolidWorkとかいうCADソフトを使ったことが無いため、あまり情報を持ち合わせていません。
Office 等に比べると利用者数が少ないでしょうし、回答は付きにくいかも知れませんね。


> を早速試したのですが、createobjectを実行したときと同じ動作になりました。
前回の回答に挙げた「ROT」を辿る方向でも調査してみてください。
もしも、下記の「VBのGetObjectで取得できるオブジェクトを列挙する」にて、
起動済みのオブジェクトが見つかるなら、そこから取得できるかと思います。
http://www1.koalanet.ne.jp/akiya/vbtaste/vbp/

[ツリー表示へ]
タイトルRe^4: createobject
記事No15511
投稿日: 2012/06/15(Fri) 20:42
投稿者YFC
レスありがとうございます。

その後、仕事にならないので、試しに、
Solidworks(タイプミスしました。。)64bit
office2007
の今問題がでている組み合わせをXPx64にインストールして、
同じマクロを実行すると問題なく動作しました。。

Win7とSolidworksの相性の問題かもしれません。
メーカーに確認したいと思います。
ありがとうございました。

[ツリー表示へ]
タイトルRe^3: createobject
記事No15512
投稿日: 2012/06/18(Mon) 12:43
投稿者オショウ
EXEやDLLからTLBを生成できれば、PowerShellで

$lw = New-Object -com WindowsLiveWriter.Application

のように、64bit上でもCreateObjectから書き換えて動作させる
ことができます。

※ VB6 でActiveX EXE使ったVB6アプリ同士の連携も、TLBを
  参照設定して、New でクラス生成したら問題なく動作しま
  した。64bit Win7 で・・・

以上。参考まで

[ツリー表示へ]