
知恵を貸してください。
VB6.0にて作業しています。
コモンダイアログからExcelファイルを指定して開く際、
現在起動中のものを二重起動しないために「FindWindow」
を用いました。
最初は正常に動作したのですが、何度か操作しているうちに、
Excelを起動していない(ctrl+Alt+Delで確認し、何度も再起動しました)のに
起動中の処理(ハンドルを表示)をするようになってしまいました。
(1)ソースの正否
(2)ウィンドウハンドルからウィンドウを特定する方法
ハンドル(3409196)が表示されるため、この番号から
指定されたウィンドウを特定できれば
原因特定にいたるのではないかと考えました。
についてアドバイスいただけないでしょうか?
以下にコードを記述します。
*モジュール側の記述は省略しました。
Private Sub Command1_Click()
Dim hwindow As Long
Dim Fname As String
Dim XLSApp As Object
(前述分省略)
cdl.ShowOpen
Fname = cdl.FileName
hwindow = FindWindow("XLMAIN", vbNullString)
If hwindow = 0 Then
Set XLSApp = GetObject(Fname)
(以下指定ファイルを開く処理)
Else
MsgBox hwindow
End If
End Sub
以上です、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
まったく別のアプローチですが、以下の方法を当方はよく利用します
'------------------------------------------------
Dim XLSApp As Object
On Error Resume Next 'エクセルが起動していない場合エラーになるためエラーを抑止
Set XLSApp = GetObject(, "Excel.Application") '開いているエクセルを取得
On Error GoTo 0 'エラー抑止を解除
If XLSApp Is Nothing Then
MsgBox "エクセルは起動していません"
Else
MsgBox "エクセルは起動中です"
End If
'------------------------------------------------
また、以下の様に関数化して使用する方がよりお勧めです
'------------------------------------------------
'ActiveXExeが起動中か否かを返す
'起動中=True/起動していない=False
Public Function ExistActiveXExe(Byref argActiveXClassName As String)As Boolean
Dim ObjExistCheckAs Object
On Error Resume Next
Set ObjExistCheck = GetObject(, argActiveXClassName)
On Error GoTo 0
ExistActiveXExe = Not (ObjExistCheck Is Nothing)
Set ObjExistCheck = Nothing
End Function
'------------------------------------------------
業務などで、"On Error Resume Next"使用禁止などの(頑迷な)ルールがある場合等、また"On Error Go To [ラベル]"が使用できる場合は関数化の方法なら簡単に書き換えられます。
On Error禁止の場合は、上記方法はあきらめてください。
この回答への補足
頂いた回答で教えていただきたいのですが、
関数化の方は、'ActiveXExeが起動中か否かを返す'
なので、Excelが起動中かどうかを調べるためには
Function ExistActiveXExe の所をExcelに変えればよいのでしょうか?
ExistActiveXExe
argActiveXClassName
ObjExistCheck
は単なる文字列だと解釈していたので、宣言部分をそのまま使い、
下記のように記述したところ
If ExistActiveXExe("XLMAIN") = False Then
Excelを起動中でも起動していなくても同じ結果を返してきました。(どちらの回答も起動中)
せっかく教えていただいたので、関数化の方も使いたいと考えています。
大変お手数ですが、使い方を教えてください。
申し訳ありません。
BellBell様、回答ありがとうございます。
なるほど、こういうアプローチ方法もあるのですね。
"On Error Resume Next"使用禁止はありませんので参考にさせてください。
なお、じゃんぬねっと様へのお礼の欄にも書きましたが、
プログラムが動くようになりました。
マクロを起動させたために、ずっとExcelが開放されなかった(表現が違っていたらすみません)
のかと思っています。
もし、マクロが原因ならば、マクロを含むEXCELは、はじく処理もいれないと。。。ですね。
No.5
- 回答日時:
こんにちは、じゃんぬねっと です。
ひとつ気になったのが、
> Excelを起動していない(ctrl+Alt+Delで確認し、何度も再起動しました)のに
これは、アプリケーション タブではなく、
プロセス タブに EXCEL がないことまで確認したんですよね?
もし、マクロによって何らかのファイルを掴んでいたとしても、
ここに表示されると思いますので...
この回答への補足
じゃんぬねっと様 返信ありがとうございます。
私が見たのはアプリケーションタブの方です。
プロセスタブの方も確認し、確かにExcelの「.Exe」の表示はあったと記憶しています。
果たして終了させていいものか。。。と思いその箇所は触らずにいました。
確認するのはアプリケーションだけではないんですね。
ありがとうございます。m(_ _)m
No.4
- 回答日時:
関数化の場合の使用方法を割愛したせいで混乱を招いたみたいですみません。
>If ExistActiveXExe("XLMAIN") = False Then
の、"XLMAIN"部分ですが、エクセルの判定を行う場合に渡す文字列(ActiveXオブジェクト名)は"Excel.Application"です。
全文を書くと
If ExistActiveXExe("Excel.Application") = False Then
です。
BellBell様
ご説明ありがとうございます。
>関数化の場合の使用方法を割愛したせいで混乱を招いたみたいですみません。
⇒とんでもありません。こちらこそ知識が足りずお手数おかけしました。当然ですが、無事動作しました^^;
無知は免罪符になりませんが、頂いたアドバイスを自分のものにできるよう精進したいと思います。
ありがとうございました。m(__)m
No.1
- 回答日時:
こんにちは、じゃんぬねっと です。
二重起動防止ならば、Mutex を使う方法の方が確実だと思います。
こんなワードで検索してみてください。
http://www.google.co.jp/search?hl=ja&q=%E4%BA%8C …
じゃんぬねっと様、回答ありがとうございます。
実はPCを数時間ほおっておいたところ、障害無く起動できるようになりました。
もしかして、マクロ入りのExcelを開いたことが原因でしょうか?(できるのかな、と思い昨日何度か試してました)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/03 09:11
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/08 15:45
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アウトルックが起動しているか...
-
VBSから別のVBS起動するとき変...
-
gccプログラムで複数の実行ファ...
-
exeファイルを実行するとすぐに...
-
Windows上のプログラム。「予め...
-
Process.Startで起動したアプリ...
-
Javaでユーザーが設定した外部...
-
VBで実行中のEXEファイルの情報...
-
MSペイントを画像ファイル名を...
-
MSDOS(バッチファイル)でプロセ...
-
VBAでOutlookを終了させたい Ex...
-
VBSでExcelのUserFormをエクス...
-
C#のフォームから起動するブラ...
-
VB6で呼び出し元の情報を取得す...
-
EXCEL VBAから他アプリケーショ...
-
VBAでSeleniumからChromeを起動...
-
C# 他のアプリケーションを優先...
-
対象のアプリケーションが終了...
-
フーリエ変換のプログラミング...
-
VBSで起動したアプリが前面表示...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでOutlookを終了させたい Ex...
-
VBSから別のVBS起動するとき変...
-
アウトルックが起動しているか...
-
Process.Startで起動したアプリ...
-
VBで実行中のEXEファイルの情報...
-
EXCEL VBAから他アプリケーショ...
-
Windows上のプログラム。「予め...
-
VBSで起動したアプリが前面表示...
-
VBAでSeleniumからChromeを起動...
-
exeファイルを実行するとすぐに...
-
VB6で呼び出し元の情報を取得す...
-
フォームの最前面が効かない
-
AppActivateについて
-
宛先ナシでメールソフトを起動...
-
64bitで作ったEXEを32bitで起動...
-
C# 他のアプリケーションを優先...
-
MSペイントを画像ファイル名を...
-
ウィンドウを終了させたい・・・
-
C#のフォームから起動するブラ...
-
Menuのショートカットの処理が...
おすすめ情報