Open4

PCOMM(AS400)をVBAで制御するメモ

チェロチェロ
  • ドキュメント

https://www.ibm.com/docs/ja/personal-communications/6.0?topic=library-host-access-class-automation-objects

  • ポップアップウィンドウへの入力はautECLPS メソッドのSendkeysは使えないので、VBAのsendkeys使う
  • autECLFieldList メソッドは集合の塊。
  • autECLFieldList メソッドのCountは集合の数
  • autECLFieldList メソッドで取得したCountは画面上に配置されている?
  • autECLFieldList メソッドのFindFieldByRowColは表示位置の情報を持ってくる
    なので、何も表示されていなくてもFindFieldByRowCol(row,col)でブランクが取得できるかもしれない
  • vbaだと「Application.Wait 3」で止めないとエクセルがよくクラッシュする
  • sendkeysの特殊キー

https://www.ibm.com/docs/ja/SSEQ5Y_6.0.0/com.ibm.pcomm.doc/books/html/host_access11.htm#apa

チェロチェロ
  • メソッドは使い回すため、共通変数とすると楽
  • ログイン処理時でポップアップが出る場合、vbaからsendkey
  • PCによって処理速度が異なるので、処理待ち時間は長めに取ること。
    • autECLOIAメソッド、WaitForAppAvailableで処理終わり次第次の処理に移れる
      • 引数無いと無制限なので10000(ミリ秒)くらい入れておこう
      • 似たようなコマンドにWaitForInputReadyがあるが以下の理由でNG
        • 入力欄が先に表示されるケースだと表示処理中でも処理を進めてしまう(っぽい)
        • WaitForAppAvailableを使ったら安定しだしたのでこっちを愛用
    • autECLPS メソッドのGetTextで値読み込むのも良いが、
      whileで上限決めつつリトライさせると安定する
    • while回す際はApplication.wite で待機時間を作ると安定する
      • 待機させたいことはRPA処理上頻出するため、下のように関数にしておくと楽ちん
private sub wite_ms(ms)
    Application.Wait [Now()] + wait_ms / 86400
end sub
チェロチェロ

waitはいっぱいあって何を選べば良いのか結構困る
接続情報ベース
autECLOIA

  • WaitForInputReady
  • WaitForSystemAvailable
  • WaitForAppAvailable
  • WaitForTransition

autECLPS

  • Wait
  • WaitForCursor
  • WaitWhileCursor
  • WaitForString
  • WaitWhileString
  • WaitForStringInRect
  • WaitWhileStringInRect
  • WaitForAttrib
  • WaitWhileAttrib
  • WaitForScreen
  • WaitWhileScreen
    検索時はoia使ってたけれど、表示ラグでうまく動かないことが稀にある
    psメソッドを検討してたけれど、下の処理でイケる気がしてきた
    どっちも見れば対応できる気がするな
Sub wait_ms(ms)
    If Not WaitForInputReady(ms) And WaitForAppAvailable(ms) Then
        MsgBox ms & "ms経過により Timeout"
        End
    End If
End Sub

https://moomin63.blog.fc2.com/blog-entry-821.html
ヒントになりそう