- ベストアンサー
VBAで外部プログラム操作
AccessVBAからTelnet操作を行いたく 苦肉の策で下記のような処理を組み込みました。 Private Sub Command1_Click() Shell "cmd.exe" stopTime 50 Call EnumWindows(AddressOf Rekkyo, 0) lRet = FindWindow(vbNullString, "C:\WINDOWS\system32\cmd.exe") Call SendMessage(lRet, WM_SYSCOMMAND, WM_MAXIMIZE, ByVal 0&) Call PostMessageStrings("telnet hoge.hoge") Call PostMessageStrings("username") Call PostMessageStrings("passwd") Call PostMessageStrings("テルネット上の処理") Call PostMessageStrings("quit") Call PostMessageStrings("exit") end sub Public Function PostMessageStrings(strPost As String) Dim i As Integer '1文字ずつ分解して送信 For i = 1 To Len(strPost) Call PostMessage(lRet, &H102, Asc(Mid(strPost, i, 1)), 0) Next '送信後に改行コードを送信 Call PostMessage(lRet, &H102, 13, 0) End Function shell で起動したコマンドプロンプトのウィンドウが 最小化された状態で以降の処理が進められてしまいます。 何かいい案は無いでしょうか? もしくは、もっと効率よくtelnet操作できる方法は無いでしょうか? 以上よろしくお願いいたします。
- noppi_99
- お礼率76% (38/50)
- Visual Basic
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Shell "cmd.exe",vbHide ではだめ?
その他の回答 (1)
- kiyama_t
- ベストアンサー率25% (19/74)
うろ覚えですみません。 telnetって、WIN32APIが使えませんでしたっけ? 私自身は使ったことがないので、正しくは分かりませんが。
お礼
ありがとうございます。その辺を調べてみます。
関連するQ&A
- ExcelでTelnetを動かしたい
長々と書いて申し訳ありませんが、困っています。 使用環境はWindows 2000です。開発環境というかexcel2000のVBAでコーディングしています。 で問題点が2点ありまして、 (1)EnumWindowsの所で止まるのですが、AddressOf演算子はexcel2000でも使えますよね。 コンパイルエラー Sub、Function、または Property が必要です というエラーで止まります。 何か使用方法が間違っていますでしょうか? (2)テキストボックスを2つ用意してあるので、それを引数としてtelnetでつなぐパソコンを 選べるようにしたいのですが引数でうまく渡せません(現状はコメントアウトしている部分です)。 Private Sub CommandButton1_Click() box1 = TextBox1 box2 = TextBox2 'ipnum = "telnet xxx.xxx."box1"."box2 '待ち時間処理用の時刻の変数 newHour = Hour(Now()) newMinute = Minute(Now()) Shell "cmd.exe" lRet = Shell("C:\WINNT\system32\cmd.exe", vbNormalFocus) newSecond = Second(Now()) + 5 waitTime = TimeSerial(newHour, newMinute, newSecond) Application.Wait waitTime Call EnumWindows(AddressOf Rekkyo, 0) lRet = FindWindow(vbNullString, "C:\WINDOWS\system32\cmd.exe") Call SendMessage(lRet, WM_SYSCOMMAND, WM_MAXIMIZE, ByVal 0&) Call PostMessageStrings("telnet xxx.xxx.xxx.xxx") 'Call PostMessageStrings(ipnum) Call PostMessageStrings("xxx.bat") Call PostMessageStrings("exit") Call PostMessageStrings("exit") End Sub Public Function PostMessageStrings(strPost As String) Dim i As Integer '1文字ずつ分解して送信 For i = 1 To Len(strPost) Call PostMessage(lRet, &H102, Asc(Mid(strPost, i, 1)), 0) Next '送信後に改行コードを送信 Call PostMessage(lRet, &H102, 13, 0) End Function 標準モジュールに、こんな感じでAPI関数を記述してあります。 他のAPIも記述してありますが、割愛してあります。 'ウィンドウのハンドルの取得 Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long 誰か教えてください。よろしくお願いします。
- ベストアンサー
- Visual Basic
- PostMessageで外部のexeへメッセージを送ったときに不具合が出る
現在、PostMessageを利用して外部のexeへファイル名(フルパス)を送信して、 そのファイルをexeで読み込むようにさせています。 以下、そのプログラムです。 CWnd *hWnd = FindWindow("ConsoleWindowClass", "C:\\WINDOWS\\system32\\cmd.exe"); char str[256]="C://sumple//test.txt\n" int len = 256; for( int i=0; i<len; i++ ){ ____char c; ____c = toupper( str[i] ); ____switch( str[i] ) ____{ ________case '\n': ________c = VK_RETURN; ________break; ____} ____hWnd->PostMessage(WM_KEYDOWN, c, 0 ); } ところが、たとえばファイルパスが"C://sumple//aa.txt\n" のように、同じ文字が連続して存在すると"aa.txt"ではなく"a.txt"として送信されてしまいます。 このような現象にはどう対応すればよいのでしょうか? また、"/"や"."などの記号は"Csumpleaatt\n"のように存在しないとして処理されているようなので case '/': ____hWnd->PostMessage(WM_KEYDOWN, VK_DIVIDE, 0 ); ____break; のように直接仮想キーコードで入力しています。(こちらは上手くいっています) 文字の連続で起こる現象にも使えるかと思って case 'a': ____hWnd->PostMessage(WM_KEYDOWN, 0x41, 0 ); ____break; としてみたのですが、やはり駄目でした。 ファイル名に連続した文字を使わなければいいのでしょうが、汎用性を持たせるためにもどうにか解決したいと思います。 どうかご解答をお願いします。
- 締切済み
- C・C++・C#
- PostMessageで外部のexeへメッセージを送ったときに不具合が出る
現在、PostMessageを利用して外部のexeへファイル名(フルパス)を送信して、 そのファイルをexeで読み込むようにさせています。 以下、そのプログラムです。 CWnd *hWnd = FindWindow(\"ConsoleWindowClass\", \"C:\\\\WINDOWS\\\\system32\\\\cmd.exe\"); char str[256]=\"C://sumple//test.txt\\n\" int len = 256; for( int i=0; i<len; i++ ){ ____char c; ____c = toupper( str[i] ); ____switch( str[i] ) ____{ ________case \'\\n\': ________c = VK_RETURN; ________break; ____} ____hWnd->PostMessage(WM_KEYDOWN, c, 0 ); } ところが、たとえばファイルパスが\"C://sumple//aa.txt\\n\" のように、同じ文字が連続して存在すると\"aa.txt\"ではなく\"a.txt\"として送信されてしまいます。 このような現象にはどう対応すればよいのでしょうか? また、\"/\"や\".\"などの記号は\"Csumpleaatt\\n\"のように存在しないとして処理されているようなので case \'/\': ____hWnd->PostMessage(WM_KEYDOWN, VK_DIVIDE, 0 ); ____break; のように直接仮想キーコードで入力しています。(こちらは上手くいっています) 文字の連続で起こる現象にも使えるかと思って case \'a\': ____hWnd->PostMessage(WM_KEYDOWN, 0x41, 0 ); ____break; としてみたのですが、やはり駄目でした。 ファイル名に連続した文字を使わなければいいのでしょうが、汎用性を持たせるためにもどうにか解決したいと思います。 どうかご解答をお願いします。
- ベストアンサー
- C・C++・C#
- VBA Shell
VBA のコマンドボタンで他のソフトを起動したいのですが Private Sub CommandButton1_Click() Shell "C:\Windows\Notepad.exe", 1 End Sub でノートパットは起動しますが マイドキュメントに置いてある XX.EXEを起動したくて Private Sub CommandButton1_Click() Shell "C:\Users\X\Documents\XX.exe", 1 End Sub としても起動しません この方法で マイドキュメントに置いてある XX.EXEを起動することは出来ないのでしょうか
- 締切済み
- Excel(エクセル)
- VBAのコードがわからない
ある人が作成したマクロですが、当方初心者のため 内容が全く分かりません。 (フォームコントロールのコンボボックスに登録されていた マクロです) ご教授いただければ幸いです。 Sub Drop1_Change() i = Cells(3, 7).Value + 5 For j = 1 To 31 If Cells(j + 2, 4) Xor ((Cells(i, j + 26).Value = "開") Or (Cells(i, j + 26).Value = "ON")) Then Cells(j + 2, 4).Value = Not (Cells(j + 2, 4).Value) cmd_exec (j) End If Next j End Sub Sub cmd_exec(i As Integer) On i GoSub _ cmd1, cmd2, cmd3, cmd4, cmd5, cmd6, cmd7, cmd8, cmd9, cmd10, _ cmd11, cmd12, cmd13, cmd14, cmd15, cmd16, cmd17, cmd18, cmd19, cmd20, _ cmd21, cmd22, cmd23, cmd24, cmd25, cmd26, cmd27, cmd28, cmd29, cmd30, cmd31 Exit Sub cmd1: CheckBox1_Click Return cmd2: (以下cmd31まで続く) End Sub
- 締切済み
- Visual Basic
- VBAで外部プログラムを非表示で実行するには
VBAとVBScriptを混同しているのかもしれませんがよく分からないので教えてください。 Excel2010のVBAから、外部プログラム(test.exe)をコマンドプロンプトを非表示の状態で実行して、外部プログラムの実行が終了するのを待ってから、次の処理をさせたいのですが、test1のプログラムでは(A)の部分でエラーになってしまいます。また、test2のプログラムでは正しく実行されるのですがコマンドプロンプトのウインドウを非表示にする方法がよく分かりません。 test1のプログラムでエラーをでなくする方法、または、test2のプログラムでコマンドプロンプトのウインドウを非表示にする方法がありましたら教えてください。 ------------------------------------------------------- Sub test1() Dim ws As Object Dim we As Object Dim command As String command = "C:\test.exe" Set ws = CreateObject("WScript.Shell") Set we = ws.Run("%ComSpec% /c " & command, 0, False) '<===(A) Set we = Nothing Set ws = Nothing End Sub ------------------------------------------------------- Sub test2() Dim ws As Object Dim we As Object Dim command As String command = "C:\test.exe" Set ws = CreateObject("WScript.Shell") Set we = ws.exec("%ComSpec% /c " & command) Do Until we.Status DoEvents Loop Set we = Nothing Set ws = Nothing End Sub -------------------------------------------------------
- ベストアンサー
- Visual Basic
- VBA Shell について(アプリの起動)
Shellを使用して特定のアプリケーションの起動および操作をしたいと考えています。 起動は以下の式で出来たのですが、 Sub VbaToCmd() Call Shell("C:...........................................................................exe", vbNormalFocus) End Sub 起動後の画面でパスワード入力が求められます。 (1)パスワードを自動入力にしたい。 (2)起動後、キーボード操作を行いたい。 VBA初心者ですみません。。 ご回答よろしくお願いします。
- ベストアンサー
- Visual Basic
- エクセルVBAで外部ソフトFFFTPを操作(2)
「FFFTPを立ち上げて、ホスト一覧からサイト名を選んで接続」 この作業をエクセルVBAで行いたいと前回質問した者です。 http://okwave.jp/qa/q7596470.html そこで、 Sub Sample1() Dim rc As Long rc = Shell("C:~\FFFTP.exe"-s サイト名", vbNormalFocus) If rc = 0 Then MsgBox "起動に失敗しました" End Sub この書き方で、成功したのですが、エクセルSheet1、A1のセルにサイト名があるとして、サイト名のところにA1セルを入れるにはどのように書けばいいのでしょうか? rc = Shell("C:~\FFFTP.exe"-s (ここにA1のセルを入れたい)", vbNormalFocus) VBAがほとんど分からず苦労してます。どなたか教えていただけないでしょうか?
- ベストアンサー
- オフィス系ソフト
- Alt+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で送る方法でよい方法があれば、お教え下さい。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- 一通ずつ処理したい(アウトルックVBA)
下記のようなVBAソースを走らせております。 アウトルックでメールを受信し、受信トレイ入ったメールの本文内にある"昭和"または"平成"のキーワードを読み分けて、某プログラムを走らせるものです。某プログラムはShellで呼び出してから動き始め20秒程度で終了します。ほとんどの場合、一回の受信で、1通しかメールが入りませんが、まれに2通入る事が有ります(同時接続のクライアントは2台なので、同時に送られると2通入りますが、3通以上同時に入る事はありえません) その場合、下記のソースで走らせると、一度に二つのshellが立ち上がってしまい、不具合が生じます(同種同時あるいは異種同時起動ができないプログラム仕様なので) そこで、一つ目の処理が終わってから、二つ目の処理に入る・・・という動きにしたいのですが、見当がつきません。 ご教示をいただけると助かります。宜しくお願いします。 Private Sub Application_NewMail() Const SEARCHWORDA = "昭和" Const SEARCHWORDB = "平成" Dim myNS As NameSpace Dim myInBox As MAPIFolder Dim myItem As MailItem Set myNS = Outlook.Application.GetNamespace("MAPI") Set myInBox = myNS.GetDefaultFolder(olFolderInbox) For Each myItem In myInBox.Items If InStr(myItem.Body, SEARCHWORDA) > 0 Then shell "hoge1.exe" End If If InStr(myItem.Body, SEARCHWORDB) > 0 Then shell "hoge2.exe" End If Next End Sub
- 締切済み
- Visual Basic
お礼
なるほど。APIで表示させることばかりにとらわれてしまっていました。。。。 ありがとうございました♪