みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

(vba)他のアプリケーションの右ctrlキーを押すには?

excelのvbaを使って、他のアプリケーション(3270エミュレータ)上で、実行キーに割り当てられている「右ctrlキー」または「テンキーのenterキー」を押すようにしたくて、sendkeys "^"やsendkeys "{enter}"を使ってみましたが、うまくいきません。どうしたら良いでしょうか?

投稿日時 - 2009-06-23 23:34:30

QNo.5069571

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

15人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

すみません!最初の回答に付けたリンク、上手く作動してませんでした!多分日本語が混じったURLだったからかもしれません。IBMのドキュメント・サーチへのリンクでしたが、ご自身でググ(Google)っていただき、前述したようにIBMのサイト右上の検索欄に「ホスト・アクセス・クラス・ライブラリー」と打って、探してみてください!

ごめんなさい!

投稿日時 - 2010-03-10 16:53:01

ANo.6

<最後にVBAのSendKeysについて>
「PCOMMではVBAのSendKeysは役立たずか」、と思われるかもしれませんが、PCOMMのウィンドウ・メニューへのアクセスは「VBAのSendKeys」を使わなければできません。例えば「マクロ/スクリプト再生開始」や、「ホストからファイルを受信」などの機能を使うときは、VBAのSendKeysを使用しなければいけませんので、必要となってきます。VBAのSendKeysとPCOMMのSendKeysを組み合わせれば、けっこう凝ったオートメーションができるのではないでしょうか。

長くなりましたが、以上です!

投稿日時 - 2010-03-10 16:46:44

ANo.5

2.<PCOMMが提供する、クラス・ライブラリを参照する>
PCOMMが提供する、クラス・ライブラリを参照する場合は、CreateObject()を使わず、VB Editorの「参照設定」をします。参照設定するにはVB Editorが開いた状態で、「ツール(T)→参照設定(R)」を選択します。参照できるライブラリーのリストが表示されるので、必要な”PCOMM”で始まるライブラリ・ファイルにチェックしてください。今回は”autECLSession”と”autECLPS”のライブラリが必要です。(PCOMMがインストールされていれば、VBAが参照できるクラス・ライブラリーがインストールされているものと思われます。自分はできました!)

参照の利点としては、クラスの持つ「メソッドやプロパティの候補一覧」がスクリプトをタイピング中にでてくることです。プログラムがしやすいです。ただ、あまりにも参照先を設定しすぎると、メモリーを使用し過ぎ、重くなるという弊害があります。でも、そこまで重くはないと思います。以下、SendKeysでENTERを入力するための例です。

‘ここでもPCOMMの記録マクロ上のクラス名と同じ名前にオブジェクトを宣言しています。別の名前でも自分が分かれば結構です。”AutSess”と”AutPS”は、参照したPCOMMのクラス・ライブラリで定義されているもの。「...As」と入力し終えた頃に、タイプの候補が表示されてきます。
   Dim autECLSession As New AutSess
   Dim autECLPS As New AutPS

‘autECLSessionにコントロールしたいセッションを代入する。
   autECLSession.SetConnectionByName (“A”)

‘ENTERキーを入力させる。
   autECLSession.autECLPS.SendKeys “[enter]”

どうでしょう?

投稿日時 - 2010-03-10 16:44:45

ANo.4

1.<VBAの”CreateObject()”を使う>

‘VBAでPCOMMのクラスを使うためのオブジェクトを用意。ここではPCOMMの記録マクロが作成するVBScriptをそのまま移植できるようにするために、VBScript上のクラス名をオブジェクトの変数名にした。
   Dim autECLSession As Object
   Dim autECLPS As Object

‘用意したオブジェクトにPCOMMのクラスを代入する。これで、それぞれのオブジェクトはVBAでPCOMMのクラスとして扱える。IBMが提供しているPCOMMのマニュアルを見ると、下記と同じ代入方法が載っています。
   Set autECLSession = CreateObject(“PCOMM.autECLSession”)
   Set autECLPS = CreateObject(“PCOMM.autECLPS”)

‘autECLSessionに、現在開いているコントロールしたいPCOMMのウィンドウ・セッションの名前を代入する。PCOMMのセッション名は、PCOMMのウィンドウ・メニューの「編集(E)→設定(S)→外観(A)→ウィンドウの設定(W)」で開いたウィンドウの右上部にある「短縮セッション ID」に表示されている(自分が使っているPCOMMではそうです)。通常、一つのウィンドウだけが開いていれば、そのセッションの名前は”A”です。二つ目からは”B”、”C”、...となっていきます。複数のウィンドウが開かれている場合(プリンター画面など)に、変数を組み特定のセッションを探させるVBAの組み方もありますが、とりあえずここでは基本だけ。
   autECLSession.SetConnectionByName (“A”)

‘PCOMMのSendKeysでENTERを入力してみる。VBAのオブジェクトをVBScript上のクラス名と同じ名前でつけてあるので、VBScriptで書かれた記録マクロ内のステートメントと全く同じになる。
   autECLSession.autECLPS.SendKeys “[enter]”

上手くいったでしょうか?

投稿日時 - 2010-03-10 16:42:55

ANo.3

これは、IBMのパーソナル・コミュニケーションズ(PCOMM)の画面上で、VBAの”SendKeys”で{ENTER}を送った際に、「改行」扱いされてしまうので、それを「入力」扱いにして欲しいといった問題でしょうか。

今頃の回答なので、すでにお役に立たないかもしれませんが、自分自身も”昨日”上記の問題にぶちあたり、いろいろと調べた結果、解決したので、その方法をシェアしたいと思います。

Excel VBAの”SendKeys”は、アプリケーションに対して有効ですが、PCOMMの画面に対して「完全に有効」な”SendKeys”メソッドは、「PCOMMのクラスが持つメソッド」を使う必要があります。

<VBAの”SendKeys”>
「SendKeys “{ENTER}”, True」 ← PCOMM(3270エミュレーター)では「改行」扱いになる。
「SendKeys “^”, True」 ← PCOMMではCtrlキーを押すと、Enter同様の扱いになるので、Ctrlキーを入力して欲しいが、修飾キーなので何も起こらない...。

そこで参考にするのが、PCOMMの記録マクロが作成するVBScriptです。

<PCOMMの記録マクロが作成するVBScript>
「autECLSession.autECLPS.SendKeys “[enter]”」 ← ちゃんと「入力」として認識してくれる。


もちろん、これはVBScriptの書き方なので、VBAのモジュールにこのまま書き込んでも何も起こりません。というかエラーになります。でも実はこの”autECLSession”と”autECLPS”は、PCOMMを外部から操作するための「クラス」であり、”SendKeys”はそのクラスの「メソッド」です。ということで、VBAで外部アプリケーションを操作する際に行う、”CreateObject”を使用して、VBAにPCOMMのクラスやメソッドを取り込めば、PCOMMをVBAで操作することが可能になります。ENTERを”SendKeys”で送るのも、PCOMMのメソッドであれば、「改行」ではなく「入力」と判断してくれます。

このPCOMMを外部から操作するためのクラスやメソッドについては、IBMのホームページ内にある「パーソナル・コミュニケーションズ バージョンJ5.X Windows ホスト・アクセス・クラス・ライブラリー」を参照ください。IBM Japanホームページ右上の検索欄に、「ホスト・アクセス・クラス・ライブラリ」と打ち、検索すると、PDFのドキュメントの一覧が表示され、見つけることができます。お使いのPCOMMのバージョンにあったものを参照するといいかもしれません。自分のは”J5.5”でした。


次にVBAでの実際のプログラム方法を紹介します。PCOMMのクラスとメソッドをVBAに取り込むには次の2つの方法があります。

1.VBAの”CreateObject()”を使う。
2.PCOMMが提供する、クラス・ライブラリ(PCOMM autECLSession Automation Object 1.0 Libraryなど)を参照する。

個人的には2番目が好きですが、一応両方紹介しておきます。文字数に制限があるので、次の回答で紹介します。

参考URL:http://www.ibm.com/Search/?q=%E3%83%9B%E3%82%B9%E3%83%88%E3%83%BB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%BB%E3%82%AF%

投稿日時 - 2010-03-10 16:36:54

ANo.2

#1です。
せっかくなので5250エミュレーターでキーボードの右Ctrlを押下した実例を2パターン提示します。
いずれもエクセルVBAです。

DDEでキーワード送出し5250の機能で「実行」を押します。
サンプルコードではウィンドウタイトルが「セッションA」となっているクライアントにクリップボードからPasteし、「実行」するまでをキーボード操作だけで実現しています。

Sub ASへ貼付()
AppActivate Title:="セッションA"
SendKeys "%"
SendKeys "ep"
SendKeys "%af{tab}"
For num = 1 To 24
SendKeys "{pgdn}"
Next
SendKeys "{down}{down}{down}{enter}"

End Sub




エクセルで5250マクロをVBSで書き出し、作業は5250マクロを(自動入力.MAC)コールして実現します。
コードは抜粋です。
マクロ開始位置から Tab を2回押し、変数「Mystr」の内容を入力、実行を1回押す 「5250マクロ」をエクセルで書き出します。

Const sFilePath = "C:\Program Files\Personal Communications\private\自動入力.MAC"

Open sFilePath For Output As #1
Print #1, "[PCOMM SCRIPT HEADER]"
Print #1, "LANGUAGE=VBSCRIPT"
Print #1, "DESCRIPTION="

Print #1, "[PCOMM SCRIPT SOURCE]"
Print #1, "OPTION EXPLICIT"
Print #1, "autECLSession.SetConnectionByName(ThisSessionName)"
Print #1, "REM This line calls the macro subroutine"
Print #1, "subSub1_"
Print #1, "sub subSub1_()"

Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"
Print #1, "autECLSession.autECLPS.SendKeys ""[Tab]"""
Print #1, "autECLSession.autECLPS.SendKeys ""[Tab]"""
Print #1, "autECLSession.autECLPS.SendKeys """; Mystr; """"
Print #1, "autECLSession.autECLOIA.WaitForInputReady"
Print #1, "autECLSession.autECLPS.SendKeys ""[enter]"""

'フッター
Print #1, "end sub"
Close #1
MsgBox "自動入力マクロを書出しました。"

投稿日時 - 2009-06-25 09:13:07

ANo.1

3270に直接コマンドを送るのでしょうか?

当方は5250エミュレータですがVBSマクロをエクセルVBAで書き出し、5250から実行し、画面から自動でデータ入力する操作をしています。
その際 sendkeys "データ" と " を書き出す必要があり
""" のようにダブルクォーテーションをダブルクォーテーションで括る記述をしました。

参考になるでしょうか

投稿日時 - 2009-06-24 02:37:58

お礼

ご回答ありがとうございます。
よくわかりませんが、うまくいかないみたいです。
似たようなQ&Aを見ると、すごく複雑な記述をしていましたが、sendkeysのように簡単にできないものなのでしょうか?

投稿日時 - 2009-06-24 21:16:55

あなたにオススメの質問