VBからExcelを起動している最中にDoEventsをするには?

解決


ペンペン  2005-10-31 07:09:26  No: 127130

こんにちわ。
教えていただきたいのですが、

VBからExcelを起動する場合に、起動している最中にDoEventsを実行したいのですが、何かうまい方法はないでしょうか?

現状は、↓の方法で起動してるのですが、この方法ですと、
起動中にVB側には制御が回ってこないので、DoEventsを実行することができません。

CreateObject("Excel.Application")

ぜひ教えてください。
よろしくお願いします。

開発環境は、
OfficeXp
VB6
です。


あん  2005-10-31 07:51:16  No: 127131

shellで起動すればいいよ


ペンペン  2005-10-31 08:43:38  No: 127132

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

ぐぐってみたのですが、どうもよく分かりません。

shellで起動する場合は、ファイルのフルパスが必要になりますよね?
これって、インストールしているOSやOFFICEのバージョンに依存しませんか?

TaskID = Shell("C:\Program Files\Microsoft Office\Office10\EXCEL.EXE")

ちなみに、私の環境は、XPで、OFFICE XPです。
他に、うまい方法があるのでしょうか?

よろしくお願いします。


結果を言うと  2005-10-31 18:18:39  No: 127133

> これって、インストールしているOSやOFFICEのバージョンに依存しませんか?

依存しません。環境変数について調べてみましょう


ひろ  2005-10-31 18:40:37  No: 127134

> 依存しません。環境変数について調べてみましょう
Excelの入っている場所は環境変数を見てもわかりません。
正しいパスはレジストリから探す必要があります。

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\EXCEL.EXE

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Excel.exe

あたりがいいのでは?

本当は HKCR の Excel.Application から CLSIDを取得してHKCR\CLSID から該当するエントリを得て LocalServer へたどり着くのが正式なのかもしれませんが。


もげ  2005-10-31 19:03:39  No: 127135

>VBからExcelを起動する場合に、起動している最中にDoEventsを実行したいのですが

具体的には、DoEventsをいれて何をしたいのですが?
動機が不明なので、それ自体、何かうまくない方法のように思えますが。

Excel.EXEのパスなら、
CreateObject("Excel.Application").Path
でとれますが、
VBアプリ起動時など他に時間のかかる処理に紛れて、
あらかじめCreateObjectしておくとか。


あん  2005-10-31 21:58:56  No: 127136

ダミーのエクセルファイルを作っておいて
shellで
startをエクセルファイルで起動するのはどうかな?


ペンペン  2005-11-02 10:09:50  No: 127137

みなさん、色々とありがとうございました。
なんとかSHELL関数で、実行することができました。

EXCELのパスについては、下記のコードで実施できました。

Function getExcelPath() As String
Dim hKey As Long
Dim RetVal As Long
Dim sProgId As String
Dim sCLSID As String
Dim sPath As String
   sProgId = "Excel.Application"
   'First, get the clsid from the progid
   'from the registry key:
   'HKEY_LOCAL_MACHINE\Software\Classes\<PROGID>\CLSID
   RetVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\Classes\" & _
      sProgId & "\CLSID", 0&, KEY_ALL_ACCESS, hKey)
   If RetVal = 0 Then
      Dim n As Long
      RetVal = RegQueryValueEx(hKey, "", 0&, REG_SZ, "", n)
      sCLSID = Space(n)
      RetVal = RegQueryValueEx(hKey, "", 0&, REG_SZ, sCLSID, n)
      sCLSID = Left(sCLSID, n - 1)  'drop null-terminator
      RegCloseKey hKey
   End If

   'Now that we have the CLSID, locate the server path at
   'HKEY_LOCAL_MACHINE\Software\Classes\CLSID\
   '     {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx}\LocalServer32
    RetVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _
        "Software\Classes\CLSID\" & sCLSID & "\LocalServer32", 0&, _
      KEY_ALL_ACCESS, hKey)
   If RetVal = 0 Then
      RetVal = RegQueryValueEx(hKey, "", 0&, REG_SZ, "", n)
      sPath = Space(n)
      RetVal = RegQueryValueEx(hKey, "", 0&, REG_SZ, sPath, n)
      sPath = Left(sPath, n - 1)
      getExcelPath = sPath
      RegCloseKey hKey
   End If

End Function

こいつで拾ってきたパスをshellでキックして、
実行することができました。

ほんと、みなさん。ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加