お世話になります、現在VBで開発を行っているのですが、
VBからExcelを起動して、VB側でそのExcelが開いているか、閉じているかを知る方法を探しています。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

APIを使用するなら、ysk6406さんが言われたとおりプロセスを使用する方法があります。


VBの関数の[GetObject]を使用する方法もあります。

  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
    • good
    • 0

いくつかやり方があると思いますが…


GetExitCodeProcess という API を使えば、できると思います。
参考URLにサンプルコードが出ていますので、ご参照下さい。

参考URL:http://www.geocities.co.jp/SiliconValley/4805/vb …
    • good
    • 0

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

このQ&Aと関連する良く見られている質問

QVB.NET Form1からForm2を開いたり閉じたりする方法

VB.NET2005でForm1にあるCheckBoxをTrueにするとform2をモードレスフォームとして開き、CheckBoxをFalseにするとform2を閉じる方法がわかりません。また、form2の[×]で閉じた時にはForm1にあるCheckBoxをFalseにする方法がわかりません。
'-----------------------------------
Private Sub CheckBox2_CheckedChanged ・・・
  Dim f_cnt As Integer
  Dim form2 As New Form2()
  f_cnt = My.Application.OpenForms.Count
  If CheckBox1.Checked = True Then
    If f_cnt = 1 Then form1.Show() 'モードレスフォームとして表示する
  Else
   form2.Close() ←閉じない
  End If
End Sub
'-----------------------------------

VB.NET2005でForm1にあるCheckBoxをTrueにするとform2をモードレスフォームとして開き、CheckBoxをFalseにするとform2を閉じる方法がわかりません。また、form2の[×]で閉じた時にはForm1にあるCheckBoxをFalseにする方法がわかりません。
'-----------------------------------
Private Sub CheckBox2_CheckedChanged ・・・
  Dim f_cnt As Integer
  Dim form2 As New Form2()
  f_cnt = My.Application.OpenForms.Count
  If CheckBox1.Checked = True Then
    If f_cnt = 1 Then form1.S...続きを読む

Aベストアンサー

Form1にあるCheckBoxがCheckBox1なのかCheckBox2なのか・・・
>Private Sub CheckBox2_CheckedChanged ・・・
>If CheckBox1.Checked = True Then
ただ、vb.netでは
Private Sub CheckBox2_CheckedChanged(...) Handles CheckBox1.CheckedChanged
と言うのはアリで、上の場合ならCheckBox1のCheckedChangedイベントになります。
質問の・・・がどうなってるのかにもよりますが。
それと、vb2002,vb2003で必要だった(と言うかこちらが正当だという話もある)
Dim Form2のインスタンス As New Form2()
はいらないみたいです。
と言う訳で、Form1にあるCheckBox1からForm2と言う場合です。
Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
If CheckBox1.Checked = True Then
AddHandler Form2.FormClosed, AddressOf Form2FormClosed
Form2.Show()
Else
Form2.Close()
End If
End Sub
Private Sub Form2FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs)
CheckBox1.Checked = False
End Sub

Form1にあるCheckBoxがCheckBox1なのかCheckBox2なのか・・・
>Private Sub CheckBox2_CheckedChanged ・・・
>If CheckBox1.Checked = True Then
ただ、vb.netでは
Private Sub CheckBox2_CheckedChanged(...) Handles CheckBox1.CheckedChanged
と言うのはアリで、上の場合ならCheckBox1のCheckedChangedイベントになります。
質問の・・・がどうなってるのかにもよりますが。
それと、vb2002,vb2003で必要だった(と言うかこちらが正当だという話もある)
Dim Form2のインスタンス As New Form2()
は...続きを読む

Q[VB.NET]3つ以上のフォームを一つずつ表示し、最後のフォームを閉じた時に最初のフォーム以外のフォームを閉じる

VB.NETを学んでいるのですが、現在3つ以上のフォームを表示していくものを作ろうとして躓いたことがあったのでこちらに書き込みました。
内容としては、ボタンを押して次のフォームを表示していくものです。

動作の流れは以下のように考えています(フォームはA、B、Cの3つとする)
1.Aを表示
2.Aでボタンを押してBを表示し、Aは隠す
3.Bでボタンを押してCを表示し、Bは隠す
4.Cでボタンを押してBとCを閉じ、隠していたAを表示

隠すのはHideを用いてできたのですが、4.でCのボタンでBとCを一緒に閉じてAを表示させる方法がわかりませんでした。

1~4のように動作させるにはどうすればいいか教えてください

Aベストアンサー

まとめて考えるのではなく、分けて考えた方がコーディングもしやすくなります。

[ FormA の処理 ]
1. ボタンを押したら FormB を開き、自身を Hide する。
2. FormB が閉じられたら、自身を Show する。

[ FormB の処理 ]
3. ボタンを押したら FormC を開き、自身を Hide する。
4. FormC が閉じられたら、自身を Close する。

[ FormC の処理 ]
5. ボタンを押したら、自身を Close する。

ポイントは、親フォーム側で子フォームのFormCloseを捕らえるところです。FormBからFormAを、とか、FormCからFormAとFormBを・・・と考えるとややこしくなります。上記のように処理すれば、FormBはFormAの動作を気にする必要はありませんし、FormCもFormBやFormAの動作を気にする必要はありません。子フォームのFormCloseはWithEvents宣言すれば捕らえられます。

以下、簡単なコードを。ボタン配置が面倒だったので、フォームのクリックで動作します。


' [ FormA の処理 ]
Public Class FormA
Inherits Form

Public Sub New()
Me.Text = "FormA"
End Sub

Private WithEvents frmFormB As FormB

' 1. ボタンを押したら FormB を開き、自身を Hide する。
Private Sub FormA_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
frmFormB = New FormB
frmFormB.Text = "FormB"
frmFormB.Show()

Me.Hide()
End Sub

' 2. FormB が閉じられたら、自身を Show する。
Private Sub frmFormB_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles frmFormB.FormClosed
frmFormB = Nothing
Me.Show()
End Sub

End Class

' [ FormB の処理 ]
Public Class FormB
Inherits Form

Private WithEvents frmFormC As FormC

' 3. ボタンを押したら FormC を開き、自身を Hide する。
Private Sub FormB_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
frmFormC = New FormC
frmFormC.Text = "FormC"
frmFormC.Show()

Me.Hide()
End Sub

' 4. FormC が閉じられたら、自身を Close する。
Private Sub frmFormC_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles frmFormC.FormClosed
frmFormC = Nothing
Me.Close()
End Sub

End Class

' [ FormC の処理 ]
Public Class FormC
Inherits Form

' 5. ボタンを押したら、自身を Close する。
Private Sub FormC_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
Me.Close()
End Sub

End Class

※VB2005で書いたコードなので.NETでそのまま動くかは不明・・・。

なお、あくまで考え方のひとつなので、他にも方法はあります。

まとめて考えるのではなく、分けて考えた方がコーディングもしやすくなります。

[ FormA の処理 ]
1. ボタンを押したら FormB を開き、自身を Hide する。
2. FormB が閉じられたら、自身を Show する。

[ FormB の処理 ]
3. ボタンを押したら FormC を開き、自身を Hide する。
4. FormC が閉じられたら、自身を Close する。

[ FormC の処理 ]
5. ボタンを押したら、自身を Close する。

ポイントは、親フォーム側で子フォームのFormCloseを捕らえるところです。FormBからFormAを、とか、FormC...続きを読む

QVB6からExcel出力し、ブックを閉じたとき異常終了

Win98 FirstEdition
VB6 SP3
Excel97 SR1

上記の環境において、下記のソースのように、VBからExcelを起動してデータを出力した際、Excelのブックを閉じると、「保存しますか?」の「はい」「いいえ」関わらず、あるいはブックをセーブした後閉じても、Excelが異常終了してしまいます。
ブックではなく、Excel自体を閉じた場合は全く問題ありません。

どなたか対処法をご存じな方いらっしゃいませんか?

Dim objXls As Object
Dim objBook As Object
Dim objSheet As Object

Set objXls = CreateObject("Excel.Application")
objXls.Workbooks.Add
objXls.Visible = False
Set objBook = objXls.ActiveWorkbook
Set objSheet = objBook.Worksheets(1)

(中略)
objXls.Visible = True

Win98 FirstEdition
VB6 SP3
Excel97 SR1

上記の環境において、下記のソースのように、VBからExcelを起動してデータを出力した際、Excelのブックを閉じると、「保存しますか?」の「はい」「いいえ」関わらず、あるいはブックをセーブした後閉じても、Excelが異常終了してしまいます。
ブックではなく、Excel自体を閉じた場合は全く問題ありません。

どなたか対処法をご存じな方いらっしゃいませんか?

Dim objXls As Object
Dim objBook As Object
Dim objSheet As Object...続きを読む

Aベストアンサー

objXls.Visible = True の後に
objXls.UserControl = True を入れてみましょう。
自信はないのですが。
あと、VBのSP5とOffice97SR2を入れましょう。

QVB.NETからエクセルを起動して、エクセルでVBを閉じたい。

こんにちは。
先日、エクセルのフォームを最前面に配置したいという
質問をさせて頂いたものでございます。
それで、SetWindowPosのAPIで設定する方法を教えて頂いたのですが、
最前面にする事は出来たのですが、フォームを動かすと
ブックはその一つ下に現れてしまい、
ブックを最背面に配置するなどを試みてみたのですが、
どうもうまく行かないので、
エクセルから直に立ち上げることが出来ないようにして
VB.NETのフォームを作ってエクセルにデータを送ろうかと思いました。
それで、データを送る方法は何とかなりそうなのですが、
VB.NETのフォームからエクセルを起動して、
次にエクセルからそのフォームを出したり、隠したりしたいのですが、
その場合、VB.NETのフォームのなんと言うハンドルを取得すればよいでしょうか?
IDにも色々あるようで、どれを使えばよいのか分からなくなってしまいました。
そのIDはVBのフォームを起動した時に、エクセルと共有するiniファイルなどに、書き込んでおこうかと思っています。
よろしくお願いいたします。m(__)m

こんにちは。
先日、エクセルのフォームを最前面に配置したいという
質問をさせて頂いたものでございます。
それで、SetWindowPosのAPIで設定する方法を教えて頂いたのですが、
最前面にする事は出来たのですが、フォームを動かすと
ブックはその一つ下に現れてしまい、
ブックを最背面に配置するなどを試みてみたのですが、
どうもうまく行かないので、
エクセルから直に立ち上げることが出来ないようにして
VB.NETのフォームを作ってエクセルにデータを送ろうかと思いました。
それで、データを送る方...続きを読む

Aベストアンサー

まず
・Excelのバージョン
・.NETのバージョン(2005でしたっけ?)
を教えてください。

Excelのユーザフォームを開くときに、エクセル本体を最小化でもよいですか?

QVB6で開発されたアプリをVB2008に移植するには?

こんにちわ。よろしくお願いします。

早速ですが十年くらい前にVisual Basic(以下VB)6で開発されたアプリ(Windows用スタンドアロン。OLEコントロールやDBコントロールも使用)を無謀にも一足飛びにVB2008に移植する事になりました。

そこで質問なのですが…
1.VB2008のExpress Editionで可能でしょうか?
  もし無理ならどのEditionなら可能でしょうか?
2.多分、言語仕様もかなり違いがあると思うのですが、最も大きな違いや注意点があればお教え下さい。
  特に経験談・苦労談などをお聞かせくだされば有難いです。
3.VB6からVB2008への移植に関して特に有用と思われる書籍やWEBサイトがあればお教え下さい。

以上、独自のノウハウとして「秘中の秘」な事もあろうかと思いますが、「ヒントのヒ」だけでも教えて頂ければ幸いです。

どうか、よろしくお願いいたします。

Aベストアンサー

通りすがりと申します。

 vb6とvb.netは、開発思想も含めまったく別ものです。
 vb6は、構造化設計、vb.netはオブジェクト指向
 やろうと思えば、同じモジュールでもできると思いますが、コードは全て書き換えなければなりません。

 あと、Express Editionで可能かどうかは、開発しているvb6での開発時に有償ソフトを使用していた場合、Expressでは対応していない可能性があります。
 このようなソフトを使用する場合、有償のIDEを買わないと使用できないです。
 詳しくは、その製品サポートセンターへ問い合わせてください。

 あと、vb6だけでなく、それ以外に使用している環境も合わせて調査したほうがよいです。
 (たとえば、excelを使用している、dbの種類、XMLを操作している..など)
 これらも、接続方法、使用するライブラリ、相性などあります。
 
 dbについてもバージョンを上げるだけで、新たに見直さなければならないところも出てきます。

 たとえば、以前使用していたdbが内部でdmlを処理する時、シングルタスクで動作していたと
 過程します。バージョンアップ後、マルチタスクで動作するように改善されているとします。
 これだけでも、実行結果が異なる可能性があります。

 

 

通りすがりと申します。

 vb6とvb.netは、開発思想も含めまったく別ものです。
 vb6は、構造化設計、vb.netはオブジェクト指向
 やろうと思えば、同じモジュールでもできると思いますが、コードは全て書き換えなければなりません。

 あと、Express Editionで可能かどうかは、開発しているvb6での開発時に有償ソフトを使用していた場合、Expressでは対応していない可能性があります。
 このようなソフトを使用する場合、有償のIDEを買わないと使用できないです。
 詳しくは、...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報