エクセル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を見た人が検索しているワード

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

QAlt+P,Alt+NをPostmessageで送るには

あるアプリがあり、そのハンドルを取得してからメッセージを送るプログラムを作っています。
PageUp,PageDownをそれぞれAlt+P,Alt+Nに変換して送るものです。
関数・定数宣言部は省略しています。

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  Dim hTest As Long
  hTest = FindWindow(vbNullString, "Test")
  If KeyCode = 33 Then 'PageUp
    PostMessage MPL, WM_SYSKEYDOWN, VK_ALT, 0
    PostMessage MPL, WM_KEYDOWN, VK_N, 0
    PostMessage MPL, WM_KEYUP, VK_N, 0
    PostMessage MPL, WM_SYSKEYUP, VK_ALT, 0
  ElseIf KeyCode = 34 Then 'PageDown
    PostMessage MPL, WM_SYSKEYDOWN, VK_ALT, 0
    PostMessage MPL, WM_KEYDOWN, VK_P, 0
    PostMessage MPL, WM_KEYUP, VK_P, 0
    PostMessage MPL, WM_SYSKEYUP, VK_ALT, 0
  End If
End Sub

送り先(Test.exe)では、
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  Dim L As String
  L = ""
  If Shift = 4 Then L = "Alt + "
  Label1.Caption = L & KeyCode
End Sub

ラベルで「Alt+P」などが来ているかどうか見ています。こちらのウィンドウで「Alt+P」を押すとちゃんと表示されます。

しかし、この2つを組み合わせるとPのみやNのみしか送られてきません。どこかおかしいのでしょうか。

Alt+PなどをPostMessageで送る方法でよい方法があれば、お教え下さい。
よろしくお願いします。

あるアプリがあり、そのハンドルを取得してからメッセージを送るプログラムを作っています。
PageUp,PageDownをそれぞれAlt+P,Alt+Nに変換して送るものです。
関数・定数宣言部は省略しています。

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  Dim hTest As Long
  hTest = FindWindow(vbNullString, "Test")
  If KeyCode = 33 Then 'PageUp
    PostMessage MPL, WM_SYSKEYDOWN, VK_ALT, 0
    PostMessage MPL, WM_KEYDOWN, VK_N, 0
    PostMessage MPL,...続きを読む

Aベストアンサー

ALTキーとの組み合わせでしたら、WM_SYSCHARのほうがいいのでは?
たぶん、送り先もVB製でしたら内部でTranslateMessageような感じですし。


あと、
>PostMessage MPL, WM_SYSKEYDOWN, VK_ALT, 0

MPLってなんですか?
>hTest = FindWindow(vbNullString, "Test")
で取得したウィンドウにPostMessageするんじゃないんですか?


次に、
>Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

KeyDownイベントに処理が書かれてますが、このイベント自体は呼ばれてますか?キー操作を受け付けるコントロールが張り付いてるのにKeyPreviewプロパティがFalseなんてことは無いですか?

#ちなみに、普通はVK_ALTではなくVK_MENUですので。

Q【EXCEL】Alt+F8からマクロを呼び出す時とユーザーフォームの違いについて

閉じたワークブック(1個)からワークシートをコピーして、
アクティブのワークブックに挿入するマクロを作成しました。

普通に、Alt+F8からマクロを呼び出す時は問題なかったのですが、
ユーザーフォームのボタンに貼り付けて、
呼び出すとエラーになって機能しませんでした。

いろいろ試してみて、以下のところまで出来たのですが
どこが間違っているのかわかりません。

すいませんがユーザーフォームの機能に詳しい方
説明の上手な方、コードで直接説明出来る方、
以下のコードの間違いを教えて下さい。

--------------------
機能の詳細
「CommandButton25」からボタン一発で
所定のワークブックの(1)、特定のシート(2)をコピーして
アクティブのワークブックに挿入する
※マクロはアクティブのワークブックの中にある

1-A)取り込み先の閉じたワークブックの場所
"C:\A"(Cドライブの「A」フォルダー)

1-B)取り込み先の閉じたワークブックの名前
「取込み先.xls」

2)コピーしてくるシートの名前
「TextBox1」の中に記載された文字列を読み取る
--------------------

追記
1)
エラーメッセージの詳細は画像をご参照ください

2)
作成したマクロは以前、こちらのサイトで頂いた
よく似た機能のマクロをカスタマイズしたものです。
※機能が少し違うので余計なコードが残っているかもしれません。

【VBA】3個のワークブックから同時にシートをコピーしたい
https://oshiete.goo.ne.jp/qa/9476111.html


--------------------

Private Sub CommandButton25_Click()
Const dirname As String = "C:\A"
'1つのワークブックからシートを1つコピーする

Public Sub CopySheets()
Dim dirname As String
Dim trgbooks As Variant
Dim trgsheets As Variant
Dim i As Long
Dim j As Variant
j = TextBox1.Value

trgbooks = Array("取込み先.xls")
trgsheets = Array(j)
For i = 0 To UBound(trgbooks)
'sheetの取り込み
Call GetSheet(trgbooks(i), trgsheets(i))
Next
End Sub

'指定ブックの指定シートを取り込む
Public Sub GetSheet(ByVal bookName As String, ByVal SheetName As String)
Dim fullName As String
Dim myBook As String
Dim mySheet As String
myBook = ThisWorkbook.Name
mySheet = Worksheets(1).Name
If ExistsWorkSheet(SheetName) Then
Application.DisplayAlerts = False 'シート削除時の警告を出さないようにする
Worksheets(SheetName).Delete '既に該当シートがあるなら削除する
Application.DisplayAlerts = True 'シート削除時の警告を出すようにする(元に戻す)
End If
fullName = dirname & "\" & bookName
If Dir(fullName) = "" Then
MsgBox (fullName & "は存在しません")
Exit Sub
End If

Workbooks.Open fullName
Workbooks(bookName).Activate
If ExistsWorkSheet(SheetName) = False Then
MsgBox (bookName & "中に" & SheetName & "は存在しません")
Workbooks(bookName).Close
Exit Sub
End If

Worksheets(SheetName).Copy after:=Workbooks(myBook).Worksheets(mySheet)
Application.DisplayAlerts = False 'セーブのメッセージ出さない
Workbooks(bookName).Close
Workbooks(myBook).Activate
MsgBox (bookName & "中の" & SheetName & "をコピー完了")
Sheets(" 番 号 確 認 ").Select
'動作確認にA1セルに移動
Range("A1").Select
End Sub

'ワークシートの存在チェック
Public Function ExistsWorkSheet(ByVal SheetName As String) As Boolean
Dim ws As Worksheet
ExistsWorkSheet = False
For Each ws In Worksheets
If ws.Name = SheetName Then
ExistsWorkSheet = True
Exit Function
End If
Next ws
End Sub

閉じたワークブック(1個)からワークシートをコピーして、
アクティブのワークブックに挿入するマクロを作成しました。

普通に、Alt+F8からマクロを呼び出す時は問題なかったのですが、
ユーザーフォームのボタンに貼り付けて、
呼び出すとエラーになって機能しませんでした。

いろいろ試してみて、以下のところまで出来たのですが
どこが間違っているのかわかりません。

すいませんがユーザーフォームの機能に詳しい方
説明の上手な方、コードで直接説明出来る方、
以下のコードの間違いを教えて...続きを読む

Aベストアンサー

以下のようにしてください。(いろいろ修正しました)
不明点は補足してください。
-------------------------------------------------------
Private Sub CommandButton25_Click()
'1つのワークブックからシートを1つコピーする
If TextBox1.Value = "" Then
MsgBox ("TextBox1にシート名なし")
Exit Sub
End If
'sheetの取り込み
Call GetSheet("取込み先.xls", TextBox1.Value)
End Sub

'指定ブックの指定シートを取り込む
Public Sub GetSheet(ByVal bookName As String, ByVal SheetName As String)
Const dirname As String = "C:\A"
'Const dirname As String = "d:\goo\excel\goo33"
Dim fullName As String

fullName = dirname & "\" & bookName
If Dir(fullName) = "" Then
MsgBox (fullName & "は存在しません")
Exit Sub
End If

Workbooks.Open fullName
Workbooks(bookName).Activate
If ExistsWorkSheet(SheetName) = False Then
MsgBox (bookName & "中に" & SheetName & "は存在しません")
Workbooks(bookName).Close
Exit Sub
End If
'マクロのあるBookをActivateする
ThisWorkbook.Activate
If ExistsWorkSheet(SheetName) Then
Application.DisplayAlerts = False 'シート削除時の警告を出さないようにする
Worksheets(SheetName).Delete '既に該当シートがあるなら削除する
Application.DisplayAlerts = True 'シート削除時の警告を出すようにする(元に戻す)
End If

Workbooks(bookName).Worksheets(SheetName).Copy after:=Worksheets(Worksheets.Count)
Workbooks(bookName).Close
MsgBox (bookName & "中の" & SheetName & "をコピー完了")
Sheets(" 番 号 確 認 ").Select
'動作確認にA1セルに移動
Range("A1").Select
End Sub

'ワークシートの存在チェック
Public Function ExistsWorkSheet(ByVal SheetName As String) As Boolean
Dim ws As Worksheet
ExistsWorkSheet = False
For Each ws In Worksheets
If UCase(ws.Name) = UCase(SheetName) Then
ExistsWorkSheet = True
Exit Function
End If
Next ws
End Function
----------------------------

以下のようにしてください。(いろいろ修正しました)
不明点は補足してください。
-------------------------------------------------------
Private Sub CommandButton25_Click()
'1つのワークブックからシートを1つコピーする
If TextBox1.Value = "" Then
MsgBox ("TextBox1にシート名なし")
Exit Sub
End If
'sheetの取り込み
Call GetSheet("取込み先.xls", TextBox1.Value)
End Sub

'指定ブックの指定シートを取り込む
Public Sub GetSheet(ByVal bookName As Strin...続きを読む

QMicroSoft BasicのDim文とVisualBasicのDim文の違い

私が20年前にMicroSoft Basicを使っていたときは、DIM文はDIMENSIONの略で配列型変数の宣言に使っていました。

最近VisualBasicの勉強を始めたのですが、変数の宣言はすべてDim文になっており、昔のMS BasicのDim文と意味合いが変わっているのに驚いています。

ここで質問させてください。
・なぜ配列を意味するDimension文が変数の宣言なのか?
・どのバージョンのBasicからDim文の意味が変わったのか?

私が使用していたのはNEC N-Basic,N-88Basic,N-98Basicです。

Aベストアンサー

VISUAL BASIC のDimは ディメンジョンの略です。
私の経験ではVB2.0時代からありました。

配列0を考えた場合変数とおなじであるからだとおもいます

QCtrl + Alt + Del を無効にしたい

タイトルの通りなのですが、どうしたらよいでしょうか。
API をつかって、キーの監視とかしてみたんですがダメでした。

できればW2k対応でお願いします。

Aベストアンサー

私もやはりやるべきではないと思うのですが、
参考URLはどうでしょうか。(苦笑)

参考URL:http://www.google.com/search?q=Ctrl+%2B+Alt+%2B+Del+%96%B3%8C%F8&hl=ja&lr=

QsendkeysにてALT+CTRL+INSERTを同時に行いたい

VBScripptのsendkeysにてALT+CTRL+INSERTを同時に行いたい

下記にて、行いましたが、うまくいきません
SendKeys "%^{INSERT}"

どなたかヒントを御願いします
→3つのキーは同時にできない?

Aベストアンサー

私のWindows XPでは三つのキーでも問題ないようです。推定ですがAppActivateが上手くいっていないのではないでしょうか。

【やってみたこと1】
秀丸でAlt+Ctrl+Insを行番号表示/非表示に割り当てて、下のWSH VBScriptを実行してみた。行番号表示がトグルできた。

set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.AppActivate "新規" '新規に秀丸を開いておき、それをAppActivate
WshShell.SendKeys "%^{INSERT}"

【やってみたこと2】
デスクトップのプログラムのショートカットのプロパティのショートカットキーにCtrl+Alt+Insertを割り当てて、下のWSH VBScriptを実行してみた。プログラムが起動できた。秀丸の割り当てよりも優先されるのでAppActivateは不要なようだ。

set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.SendKeys "^%{INSERT}"

私のWindows XPでは三つのキーでも問題ないようです。推定ですがAppActivateが上手くいっていないのではないでしょうか。

【やってみたこと1】
秀丸でAlt+Ctrl+Insを行番号表示/非表示に割り当てて、下のWSH VBScriptを実行してみた。行番号表示がトグルできた。

set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.AppActivate "新規" '新規に秀丸を開いておき、それをAppActivate
WshShell.SendKeys "%^{INSERT}"

【やってみたこと2】
デスクトップのプログラムのショートカットの...続きを読む


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

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

おすすめ情報