エクセルVBAから他のアプリを終了するマクロを書きたいのですが、途中で行き詰ってます。

Sub test()
Dim h As Long
h = FindWindow(vbNullString, "タイトル")
Call SendMessage(h, 0, 0, "ALT+{F4}")
End Sub


FindWindowでハンドルを取得してALT+F4を送ればいいじゃないかと思ってますが
ALT+F4の送り方がわかりません。どなたか教えてください。
また、ほかに良い方法があれば併せてご提案くださると幸甚です。

よろしくお願いします。

--
エクセル2003

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

A 回答 (1件)

そこまでできているのなら下記のように変更して見て下さい。


VB6.0 用のコードをそのまま転記していますがご理解頂けるかと。

Private Sub hwndAcquire()
'ハンドル取得及び終了処理のサブプロシージャ
  Dim hwnd As Long
  Dim ret As Long
  If Len(strClassName) Then
    'クラス名を与えてハンドルを取得
    '起動中ならハンドルが返り、起動していなければ 0 が返る
    hwnd = FindWindow(strClassName, vbNullString)
  ElseIf Len(strCaptionName) Then
    'キャプション名を与えてハンドルを取得する場合
    'strCaptionName = "Microsoft Excel - Book1"  '電卓の場合  "電卓"
    hwnd = FindWindow(vbNullString, strCaptionName)
  End If
  '指定のハンドルに終了のメッセージを送る
  ret = SendMessage(hwnd, WM_CLOSE, 0&, 0&)
End Sub
    • good
    • 2
この回答へのお礼

おっしゃ。新年一発目の疑問が解決しました。
ありがとうございました。

お礼日時:2012/01/02 22:13

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

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

QVBAで、アクティブなBOOKのファイル名を取得し

エクセルのVBAを使用して、選択されている、BOOKのファイル名を取得し、下記のように編集してA1セルに入れたいのですが、可能でしょうか?


BOOKのファイル名が「大阪_たこ焼き_1234.xls」の場合

大阪_と.xlsをは省いて、「たこ焼き_1234」がA1セルに入るようにしたい。

Aベストアンサー

拡張子なんでもござれ!
Sub TheBody()
Const xSeparator = "_"
Const xPeriod = "."
Dim KitCut As Variant
KitCut = Split(ActiveWorkbook.Name, xPeriod)
KitCut = Split(KitCut(0), xSeparator)
Range("A1").Value = KitCut(1) & xSeparator & KitCut(2)
Columns("A").AutoFit
End Sub

Qexcel vba 他ファイルマクロ処理中断、自己ファイルマクロ処理後、再度他ファイルマクロ継続方法

excel vbaで、他のEXCELファイルのマクロの処理を中断して、自己ファイルのマクロを処理後、再度他のEXCELファイルのマクロを継続して再度処理を行わせるにはどうすれば良いですか。教えて下さい

他のEXCELファイルとして、フリーソフトを利用しています。
そのソフトは、モジュールにロックが掛ってるので、その中のマクロなどを編集することはできません。(ロック解除などは考えていません。)
そのソフトを起動して、データファイル入力画面で、データファイルを入力して、処理をして、処理結果を保存することを、入力データファイルを変えながら、繰り返し行いたいです。
そこで、処理マクロを作成しています。その手順とVBAを説明します。

1)フリーソフト(違法なものではありません。)を開き、
2)そのフリーソフトのシート内のボタンを、VBAで、マウスカーソルを移動させて、マウスのキー操作で、「押す」「離す」を行い、
3)ファイルの初期化の問合せの警告が出るので、キー操作で、「Y」を押し、
4)データファイルの名称をクリップボードにコピーし
5)EXCELのカレントフォルダを、データファイルのあるフォルダに変えて
6)DoEventsとして、フリーソフトのデータファイル入力画面を開いています。
この時、画面のポインタは、データ入力画面のファイル名入力欄にあり、
この後、データファイル名をクリップボードから入力したいので、
キー操作で、「crtl+v」としたいのですが
フリーソフトのマクロが起動中で、作成している処理マクロに制御が移らないためと思いますが
入力できません。(人手での入力は可能ですが)、自動化したいので、どの様にすれば良いか教えて下さい。
マクロは長いので、抜粋して記載します。

sub a()
(宣言文省略します。)
Workbooks.Open freesoft
Dim mPSet As Long
mPSet = SetCursorPos(b,c)
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
keybd_event VK_Y, 0, fKEYDOWN, 0
keybd_event VK_Y, 0, fKEYUP, 0
Application.CutCopyMode = False
Dim d As New DataObject
With d
.SetText e
.PutInClipboard
End With
ChDrive f
ChDir g
DoEvents
(ここで、止まります。)
With d
.GetFromClipboard
.GetText
End With
keybd_event VK_RETURN, 0, fKEYDOWN, 0
keybd_event VK_RETURN, 0, fKEYUP, 0
DoEvents
Dim mPSet2 As Long
mPSet2 = SetCursorPos(h, i)
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
Workbooks(freesoft).SaveAs FileFormat:=xlNormal, Filename:=k
Workbooks(k).Close
End sub

excel vbaで、他のEXCELファイルのマクロの処理を中断して、自己ファイルのマクロを処理後、再度他のEXCELファイルのマクロを継続して再度処理を行わせるにはどうすれば良いですか。教えて下さい

他のEXCELファイルとして、フリーソフトを利用しています。
そのソフトは、モジュールにロックが掛ってるので、その中のマクロなどを編集することはできません。(ロック解除などは考えていません。)
そのソフトを起動して、データファイル入力画面で、データファイルを入力して、処理をして、処理結果を保...続きを読む

Aベストアンサー

フリーソフトに関する詳細が分からないのですが、たぶん、MsgBox、InputBox、または、モーダルのUserFormが表示されたタイミングで、動作待ちになっているものと思われます。動作待ちになるトリガーは、Workbooks.Open freesoftでしょうか?(Open直後にUserFormが表示される?)

であれば、次のように、Shell関数でブックを開くようにすれば良いと思います。
Dim FreeSoft
FreeSoft = Shell("Excel " & "C:\xxxxx\フリーソフト.xlsm",1)
MsgBox "フリーソフトが開くまでの時間稼ぎ!!"
AppActivate FreeSoft

その後は、SendKeysステートメントでフリーソフトを操作することになります。たぶん、mouse_eventやkeybd_event も使えると思います。
ただし、Workbooks(freesoft).SaveAs 等は使えなくなるので、SendKeysによるキーボード操作で保存動作を行う必要があります。

QExcelVBA:自己のBook名を取得したい

WindowsXP-Proです。
Excelヴァージョンは2003です。

ExcelVBAでコーディングしています。
で、自分自身(つまり、このVBAコードを記述しているExcel本体)のBook名を取得したいのですが、何か関数は用意されていますでしょうか?

自分自身のBook名を取得したい理由は、VBAコードを記述しているExcel本体のファイル名(Book名)の名前が変更されても、VBAが正常に機能するように、今現在のBook名を取得したいのです。

複数のExcelファイルを、このVBAで操作しているため、
Workbooks("本体のBook名").Activate
を用いており、仮にファイル名(本体のBook名)の名前が変更されても、VBAが正常に機能できるように、"本体のBook名"部分を固定ではなく、可変で持てるようにしたいからです。

Aベストアンサー

Public Sub Auto_Open()
  MsgBox ActiveWorkbook.Name
  MsgBox ThisWorkbook.Name
End Sub

Private Sub Workbook_Open()
  MsgBox Me.Name
End Sub

いずれも、ブック名が表示されました。

QエクセルでくんだVBAマクロが途中でとまるのですが、

エクセルでくんだVBAマクロが途中でとまるのですが、
どこがおかしいかご指摘して頂けませんでしょうか?

以下のプログラムは
セル(19.6)にxの値を代入し、
E24にそれに対応したyを出力させるプログラムです。

あと余談となりますが、
繰り返し構文は同時に複数の変数はできないのでしょうか?

例えば以下のものは変数iをステップ0.1で加算していますが
それに対応して表示させるセルを一つずつずらすために
変数kを指定してfor構文を連立させようとしたのですが
うまくいきませんでした。




Sub k()


Dim i As Double

For i = 0 To 10 Step 0.1

Cells(22 + 10 * i, 7).Value = i
Cells(19, 6).Value = i

Range("H" & 10 * i + 22).Value = Range("E24").Value

Next i




End Sub

Aベストアンサー

すでに他の方から指摘がありますが、
Cells(22 + 10 * i, 7) はOKで、Range("H" & 10 * i + 22) がNGということになるようです。
range ではcellsとは変換誤差の扱い方が異なるのが理由のようですね。

セル指定する場合は小数値を含む値の設定を行う場合には注意が必要のようですから、今回のように小数値でループを廻してセル指定するのは適切とは言えないかもしれませんね。

コンピュータが扱う小数には丸め誤差が発生すると言うのは、プログラミングになれた方なら基本として知っていますが、初心者は式には問題無いのにエラーが起きている理由が理解出来ないと思います。
そのために予期しないエラーに悩まされて無駄な時間を掛ける事にもなります。

今回は、下記のように共通部分を変数kにまとめてしまえば問題無いですし、コードの視認性も良くなると思います。

Sub samp()

Dim i As Double
Dim k As Long

For i = 0 To 10 Step 0.1
k = 22 + 10 * i

Cells(k, 7).Value = i
Cells(19, 6).Value = i

Range("H" & k).Value = Range("E24").Value
Next i

End Sub

すでに他の方から指摘がありますが、
Cells(22 + 10 * i, 7) はOKで、Range("H" & 10 * i + 22) がNGということになるようです。
range ではcellsとは変換誤差の扱い方が異なるのが理由のようですね。

セル指定する場合は小数値を含む値の設定を行う場合には注意が必要のようですから、今回のように小数値でループを廻してセル指定するのは適切とは言えないかもしれませんね。

コンピュータが扱う小数には丸め誤差が発生すると言うのは、プログラミングになれた方なら基本として知っていますが、初心者は式に...続きを読む

Q他のワークシート名の取得方法 (VBAを使用せずに)

VBAを用いずに、ワークシート関数のみでワークシート名を取得できないか探しています。

自分のシート名は、以下の出力結果の一部より取得することができました。
=CELL("filename")

しかし、他のシート名を取得する方法が思いもつきません。

VBAを用いずにシート名を取得することはできないのでしょうか?

Aベストアンサー

Excel2000でしたら、
1.[挿入]-[名前]-[定義] から、名前を2つ定義します。
  ・名前:PPP  参照範囲:=GET.WORKBOOK(1)
  ・名前:QQQ  参照範囲:=GET.DOCUMENT(88)
2.A1 に =SUBSTITUTE(INDEX(PPP,ROW()),"["&QQQ&"]","") と入力します。
3.A1 を下方にドラッグコピーすると、シート名が一覧で表示されます。

例えば3枚目のシート名のみを取得する場合は、任意のセルに
=SUBSTITUTE(INDEX(PPP,3),"["&QQQ&"]","") と入力します。

※マクロ関数というものですが、最近のバージョンにこれが付帯されているのかどうか
  わかりませんが。   ^_^;

QVBAでAccessから他の複数のExcelを操作するとき、マクロを無効にして開きたい

当社ではある報告のExcel雛型があり、各社員が雛型に入力したExcelそのものを社内メールに添付させて受け取っていますが、今回集約のためのAccessを作ってそのExcelの各セル番地を一覧で別のExcelに集約したいと考えています(一括して処理したいExcelの数は500件程度)。

Excel雛型には、各社員には余計な操作をさせたくないということで、メニューバー等々をVBAで非表示にしてあり、×ボタンも使用不可にしています(「保存して閉じる」ボタンを別に用意)。

ところが、以下のコードを雛型のExcelのThisWorkbookに入れているばっかりに、集約用のAccessからExcelを操作する際に、自分で仕込んだメッセージ(「×ボタン使用不可」)が表示されてしまい、最初のExcelをうまく閉じることができず、繰り返し複数のExcelを処理することができません。

***************************
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If CloseMode = False Then
Cancel = True
MsgBox "×ボタン使用不可"
End If
End Sub

(※標準モジュールに
Public CloseMode As Boolean
を宣言して、別に用意した「保存して閉じる」ボタンをクリックしたときにCloseMode = Trueとしている。)
***************************

そもそもExcelを開く際にマクロを無効にして開くことができれば閉じるときにこんなことにならずに済むと思うのですが。。。

Application.AutomationSecurity = msoAutomationSecurityForceDisable も試してみましたが、うまくいかないようです。

また、変数「CloseMode」に対して、集約用のAccessからExcelを開いたときに値を入れることができればいいとも思うのですが、スコープについて調べたところでは難しいかなと感じています。
(※Excel雛型のコードはさわれないので「参照設定」を変更するのもできないと思われます。)

そんな小細工を施したExcelを何事もなく開いて中身のセル番地をコピーして閉じる方法をご存じでしたらご教授願います。

質問の内容もわかりにくくてすみません。。。
よろしくお願いいたします。<m(__)m>

当社ではある報告のExcel雛型があり、各社員が雛型に入力したExcelそのものを社内メールに添付させて受け取っていますが、今回集約のためのAccessを作ってそのExcelの各セル番地を一覧で別のExcelに集約したいと考えています(一括して処理したいExcelの数は500件程度)。

Excel雛型には、各社員には余計な操作をさせたくないということで、メニューバー等々をVBAで非表示にしてあり、×ボタンも使用不可にしています(「保存して閉じる」ボタンを別に用意)。

ところが、以下のコードを雛型のExcelのThisWor...続きを読む

Aベストアンサー

Application.EnableEvents = False
を試してください

参考URL
http://sei.qee.jp/docs/program/vba/excel/noMacro/index.html

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Q他のアプリの終了

また、質問ですがよろしくお願いします。
いま、コマンドボタン1でテキストエディターを開くような物をつくっています。
そこでコマンドボタン2をおしたらテキストエディターを(保存しないで)終了したいのですが、サンプルコードを教えて貰えないでしょうか。

補足ですがテキストエディターが開いても保存フォルダを指定し保存するVBwindowが最前面処理で動いてます。windowをactiveにしてsendkeyで終わらすことはできないですよね?

よろしくお願いします。

環境VB6

Aベストアンサー

>とりあえず、調べなおすと簡単にできました(汗)

しっかり調べられたようですね^^
(いつも)反感を買うのではと、ちょっとヒヤヒヤしながら発言をしております。

個人的に厳しい発言をするときは、何らかの意味を持って行うようにしているつもりです。


そして、たぶん
「TerminateProcess」
を見つけて、APIの利用方法で再質問してくるかな?
と思っておりました。

しかし、APIをしっかり使いこなしていらっしゃるようですね^^




そこで、余談です。
TerminateProcess = Terminate + Process
OpenProcess = Open + Process
[プロセス+どうする]
という組み合わせから生まれている命令です。



そこで「Terminate」という言葉で、VBカテ内をもう一度検索をかけてみると
[EXEファイルのタイトル取得]
http://okwave.jp/kotaeru.php3?q=558701
がヒットします。

#5さんの発言に、それらしき物があることと、APIを利用していないということに気づくと思います。
スクリプトで、EXEのパスからオブジェクトを探し、強制終了するやり方をしております。
それをちょっとだけ改造し、Shell関数で起動したプロセスのシャットダウンをする方法を張っておきますね^^




Sub Test()
  Dim lngPID As Long
  lngPID = Shell("calc")
  
  MsgBox "OKを押すと終了させます", vbSystemModal
  
  Call MyTerminate(lngPID)
  
End Sub

Private Sub MyTerminate(ByVal p_lngPID As Long)
  Dim strSQL As String
  Dim objProc As Object
  Dim lngSts As Long
  Dim strWk  As String
  
  strSQL = "SELECT * FROM Win32_Process where handle = " & p_lngPID
  For Each objProc In VBA.GetObject("winmgmts:").ExecQuery(strSQL)
    lngSts = objProc.Terminate
  
    Select Case lngSts
      Case 0     '正常終了
        Exit For
      Case 2:   strWk = "アクセスが拒否されました"
      Case 3:   strWk = "権限が不足しています"
      Case 8:   strWk = "不明なエラーです"
      Case 9:   strWk = "パスが見つかりません"
      Case 21:  strWk = "パラメータが不正です"
      Case Else: strWk = "予期せぬエラー:" & lngSts
    End Select
    
    MsgBox strWk
  Next objProc
End Sub

>とりあえず、調べなおすと簡単にできました(汗)

しっかり調べられたようですね^^
(いつも)反感を買うのではと、ちょっとヒヤヒヤしながら発言をしております。

個人的に厳しい発言をするときは、何らかの意味を持って行うようにしているつもりです。


そして、たぶん
「TerminateProcess」
を見つけて、APIの利用方法で再質問してくるかな?
と思っておりました。

しかし、APIをしっかり使いこなしていらっしゃるようですね^^




そこで、余談です。
TerminateProcess = Terminate + P...続きを読む

QVBAでアカウント名を取得する方法

VBAで処理したEXCELブックをデスクトップに自動保存しようとしています。VBAで現在作業中のユーザーアカウント名を自動で取得する方法を教えていただきたいのですが。

デスクトップ上にブックを保存するには、パスを記述すればよいのですが、現在PC毎にユーザーアカウントを設定しユーザー名が異なっています。
このため、PC毎にこのユーザー名をデスクトップへのパスに入れ込まなければなりません。毎回キーボードからこのユーザー名を入力する方法もありますが、自動的にユーザー名を取得し、正しいパスを指定する方法を検討しています。
どなたか、VBAでこのユーザー名を取得する方法が有れば教えていただきたいのですが。
よろしくお願いいたします。

Aベストアンサー

Environ関数で、環境変数[USERNAME]を取得する。

MsgBox Environ("USERNAME")

QExcel VBA if文 マクロ強制終了するには?

現在 2つのbookがあります。
・データ data.xls
・集計 total.xls
★条件は以下
・この2つのbookには同じ名前の 『sheet名・数』が情報保持しています。
・sheet名は不特定の名前が付けられています。
★処理したいマクロ内容
・data.xls …の各sheet と total.xls 各sheet参照させて
マッチしたら処理。
マッチしなかったらマクロ強制終了。

Sub match()

Dim i As Integer

For i = 1 To Worksheets.Count

'任意のbookを指定します
Windows("data.xls").Activate
sheet_copy = ActiveSheet.Name
Sheets(sheet_copy).Select

'範囲を選択 コピーします
Range("C2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy

On Error Resume Next '---前後にシートが無い場合のエラーを無視
ActiveSheet.Next.Select

'任意のbook と sheet を指定します
Windows("total.xls").Activate
sheet_paste = ActiveSheet.Name
Sheets(sheet_paste).Select
Range("D2").Select

If sheet_copy = sheet_paste Then
ActiveSheet.Paste
ActiveSheet.Next.Select
Else
MsgBox "sheet miss match error!"
'★マクロ強制終了
End If
Next i
End Sub

★部分に何と記述すればよろしいでしょうか?
アドバイスお願い致します。

現在 2つのbookがあります。
・データ data.xls
・集計 total.xls
★条件は以下
・この2つのbookには同じ名前の 『sheet名・数』が情報保持しています。
・sheet名は不特定の名前が付けられています。
★処理したいマクロ内容
・data.xls …の各sheet と total.xls 各sheet参照させて
マッチしたら処理。
マッチしなかったらマクロ強制終了。

Sub match()

Dim i As Integer

For i = 1 To Worksheets.Count

'任意のbookを指定します
Windows("data.xls").Activate
she...続きを読む

Aベストアンサー

matchプロシージャが他のプロシージャから呼び出されているのでなければ、"Exit Sub"が良いかと思います。
もし、他のプロシージャから呼び出されているのであれば、"Exit Sub"と書いても呼び出し元のプロシージャの動作は止められませんので、工夫が必要となります。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング