14-1.非定型操作にてEXCEL(vba)とTcplinkマクロを連携する(クリップボード編)

By 岡田 - Posted: 2016/09/27 Last updated: 2016/10/06 - Leave a Comment
印刷用ページの表示 印刷用ページの表示
非定型操作によるEXCEL(vba)とTcplinkマクロの連携ですが、ご紹介したい方法が2つあります。
1)クリップボードによる連携
2)ファイルによる連携

です。
二つの区別ですが、”ジョブ名”や”ユーザID”といった単一データを取得・連携する際にはクリップボードで、複数のデータを連携する際にはファイルにまとめてダウンロード後当該ファイルを開いて情報を取得するようにしています

連携する場所にクリップボードを使うことで、EXCEL(vba)及びTcplinkマクロがシンプルで判りやすくなります

EXCELに記載したジョブ番号からジョブ名を取得する

今回紹介するマクロも実際に私が業務で使っているものです。

EXCELの中でジョブ名とジョブ番号を管理しているシートがあります。ジョブ名とジョブ番号はZ/OSのTSO(SDSF)から得るのですが、EXCELのセルにジョブ番号を手入力させておきジョブ名をTcplinkマクロを使ってZ/OSから取得します

本マクロはSDSFのフィルタリング機能を使っています。VOS3ではSYSOUTの状態を確認する方法としてASPEN(SYSOUT編集画面)やSOEDIT2を使いますが、それぞれフィルタリング機能が無かったと記憶しています。VOS3で活用される場合は、各自で確認・修正して下さい

EXCEL(vba)とTcplinkマクロをクリップボードを使って情報を橋渡しする

EXCEL(VBA)とTcplinkは固定化されているマクロですが、クリップボードに渡す情報を変える事で非定型操作が可能になります

excel-1
上の画面は今回の作業を実行するときのEXCELの状態を示しています

セルC3にジョブ番号を記載しておき、同時にアクティブセルの状態にしておきます。
ここからEXCEL(vba)を実行。その延長上でTcplinkマクロを実行させ、Tcplinkマクロが取得したジョブ名をB3セルに格納します

EXCEL(vba)の説明

以下がクリップボードによる連携をするために作成したマクロです

01: Sub sdsfからジョブ名持ってくる()
02: Dim ret As Long
03: Dim buf As String
04: Dim cb As Object
05:
06: Set cb = New DataObject
07:
08: buf = ActiveCell.Value
09:
10: Do
11:
12: With cb
13: .SetText buf
14: .PutInClipboard
15: End With
16:
17: With CreateObject(“wscript.shell”)
18: ret = .Run(“C:\jobnget.mac”, 7, True)
19: End With
20:
21: If ret <> 0 Then MsgBox “失敗”: Exit Sub
22:
23: ActiveCell.Offset(0, -1).Select
24:
25: With cb
26: .GetFromClipboard
27: buf = .GetText
28: End With
29:
30: ActiveCell = Left(buf, 8)
31:
32: ActiveCell.Offset(0, 1).Select
33: ActiveCell.Offset(1, 0).Select
34:
35: buf = ActiveCell.Value
36:
37: Loop While buf <> “”
38:
39: End Sub

クリップボードに情報を与える

06: Set cb = New DataObject
07:
08: buf = ActiveCell.Value
09:
:
11:
12: With cb
13: .SetText buf
14: .PutInClipboard
15: End With

6行目でクリップボードの宣言をしています
8行目でアクティブセルの内容をbufに登録、13-14行目でクリップボードにコピーしています

Tcplinkマクロを起動、終了まで待つ

17: With CreateObject(“wscript.shell”)
18: ret = .Run(“C:\sdsfget.mac”, 7, True)
19: End With
20:
21: If ret <> 0 Then MsgBox “失敗”: Exit Sub

17-19行目でTcplinkマクロを起動していますが、ポイントは18行目の.Runの第二オペランドの”7″です。”7″を指定することで、EXCEL(vba)はTcplinkマクロが終了するまで待機します。前回のEXCEL(vba)では”5″を指定していました

21行目は実行結果の判定です。.Runが正常終了しなかったときの判定です

Tcplinkマクロ

ここからTcplinkマクロの説明に入ります。
はじめに、本マクロを実行するときTSO画面はSDSFの(ST,O,H)のいずれかの画面になっている事が必要です。FILTER機能を動作させるためです(画面参照)
sdsf-filter1

C:\jobnget.macの内容
01: change session TCP3270-Ses01
02: ;
03: ;
04: ;message “OUTPUTクラスの確認処理です。SDSF(ST,O,H)を開いた状態にして下さい”
05: ;until string (03,02) “SDSF OUTPUT ALL CLASSES ALL FORMS”
06: ;
07: until input
08: string “FILTER OFF” (04,22)
09: emulator key [enter]
10: until input
11: string “PRE” (04,22)
12: emulator key [enter]
13: until input
14: move cursor (01,13)
15: until input
16: wait 1
17: emulator key [ENTER]
18: wait 1
19: until input
20: string “1” (03,13)
21: emulator key [enter]
22: until input
23: wait 1
24: string “JOBID” (15,13)
25: until input
26: string “EQ” (15,33)
27: until input
28: edit paste (15,38)
29: until input
30: emulator key [enter]
31: until input
32: wait 1
33: edit copy (07,07) (07,14)
34: wait 1
35: string “FILTER OFF” (04,22)
36: emulator key [enter]
37: until input
38: wait 1

FILTER機能を呼び出す

08: string “FILTER OFF” (04,22)
09: emulator key [enter]
10: until input
11: string “PRE” (04,22)
12: emulator key [enter]
13: until input
14: move cursor (01,13)
15: until input
16: wait 1
17: emulator key [ENTER]
18: wait 1
19: until input
20: string “1” (03,13)
21: emulator key [enter]
FILTER機能を動作させるため、現在動作しているFILTER機能を8行目で解除。14行目でFILTER機能を実行させます
20行目で”1″を指定し、FILTER機能の設定画面を出します
sdsf-filter2

FILTER機能に設定する

22: until input
23: wait 1
24: string “JOBID” (15,13)
25: until input
26: string “EQ” (15,33)
27: until input
28: edit paste (15,38)
29: until input
30: emulator key [enter]
24行目でJOBID、26行目でEQを入力し、28行目でジョブ番号(クリップボードの内容)を入力します
sdsf-filter3

情報の取得

sdsf-filter4

31: until input
32: wait 1
33: edit copy (07,07) (07,14)
34: wait 1
35: string “FILTER OFF” (04,22)
36: emulator key [enter]
37: until input
38: wait 1
クリップボードで設定したジョブ番号に該当する情報がある場合、SDSF画面7行目に表示されます。そこで33行目でジョブ名をクリップボードにコピーします。
該当する情報がない場合、クリップボードには空白が入ります

これでTcplinkマクロは終了し、制御がEXCEL(vba)に戻ります

Tcplinkマクロ実行後の処理(クリップボードのジョブ名をEXCEL(vba)で貼り付ける)

23: ActiveCell.Offset(0, -1).Select
24:
25: With cb
26: .GetFromClipboard
27: buf = .GetText
28: End With
29:
30: ActiveCell = Left(buf, 8)
31:

23行目でアクティブセルを一つ左にずらして、ジョブ名のセルに移します
25-28行目でbufにクリップボードの内容を移し、30行目でアクティブセルにbufの先頭8文字を入れます
excel-2

EXCEL(vba)補足・・・連続してジョブ名を取得する

EXCEL(vba)はdoループで囲っています

10: Do
:
:
32: ActiveCell.Offset(0, 1).Select
33: ActiveCell.Offset(1, 0).Select
34:
35: buf = ActiveCell.Value
36:
37: Loop While buf <> “”
38:
39: End Sub

これは、ジョブ番号が縦に連続して記載している場合を想定しています
32-33行目でアクティブセルを右下に移し、35目でc4セルの内容を確認、空白以外であったらループする仕組みにしています。これによって、連続してジョブ番号があっても連続して処理を実行します
excel-3

※記載もれがありました
EXCEL(vba)でクリップボードを扱う際、vbaのソースコードに”Microsoft Forms 2.0 Object Library”を参照設定する必要があります

この参照設定をしないと、DataObject が無いとコンパイルエラーになります
Posted in Tcplinkマクロ活用(拡張編) • • Top Of Page