VBA投資楽天RSS2

UIAutoMationでExcelを操作する

VBA
スポンサーリンク

マーケットスピード2のRSSの接続状態と発注可否を操作したい。

 UIAutoMationでマーケットスピード2を操作するの続き。自動で一週間動作してもらいたいため、深夜にマーケットスピード2を落とし、朝方8時にタスクスケジューラでエクセルを立ち上げる(その際にマーケットスピード2へ自動ログイン)。という対応を取ったため、その後、エクセル側から楽天RSSに接続、発注可否を発注可に自動でする必要がある。

マケスピ2の自動操作のようにはうまくいかない

 エクセルには相当様々な機能がついているため、そう簡単にはいかない。最大の落とし穴がそもそもリボン下にある楽天RSS2の接続状態と発注可否がクリックできない。意味が分からないが、クイックアクセスツールバー楽天RSS2の接続状態と発注可否も操作できない。いやマジですか…
 ただし、接続状態か未接続状態か、発注可か発注不可かNameプロパティより状態を確認することはできる。そのため、未接続状態であればクイックアクセスツールバーの接続状態をショートカットキー入力で操作し、接続状態だが発注不可な場合はクイックアクセスツールバーの発注可否をショートカットキー入力で操作することでなんとか事なきを得た。
 ただ落とし穴が多く、Nameプロパティに改行を含むため、一致での確認をいったいどうすればいいかいまいちわからないのでleft関数で前3文字で判定することにした。
 もう一つこれはおま環と思いたいが、たまに勝手にクイックアクセスツールバーから楽天RSS2の接続状態と発注可否が消える。もしバグなら楽天さん早く直してね。

コードは下記のようになりました。個人の環境による要素が多いため、動作の保証はできませんし、これによる取引の機会損失等損害は責任が取れませんので参考として使用ください。実際にはこれをさらにループにする必要があります。

Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Sub 接続状態維持()

Dim Hwnd As Long
Hwnd = FindWindow(vbNullString, "自動取引用.xlsm - Excel")
Call UiClick(Hwnd)

End Sub

Sub UiClick(ByVal Hwnd As Long)
    Dim uiAuto As CUIAutomation: Set uiAuto = New CUIAutomation
    Dim uiElm As IUIAutomationElement
    Dim i
    Dim uiCnd As IUIAutomationCondition
    Dim uiInvoke As IUIAutomationInvokePattern
    Dim aryRibbonTab As UIAutomationClient.IUIAutomationElementArray
    Dim elmRibbonTab As UIAutomationClient.IUIAutomationElement
    
    'ウィンドウハンドルからエレメントを取得
    Set uiElm = uiAuto.ElementFromHandle(ByVal Hwnd)
    
    'クイックアクセスツールバーのエレメントを取得
    Set uiCnd = uiAuto.CreatePropertyCondition(UIA_NamePropertyId, "クイック アクセス ツール バー")
    Set uiElm = uiElm.FindFirst(TreeScope_Subtree, uiCnd)
    'Debug.Print (uiElm.CurrentClassName)

    Set uiCnd = uiAuto.CreatePropertyCondition(UIA_ClassNamePropertyId, "NetUIRibbonButton")
    Set aryRibbonTab = uiElm.FindAll(TreeScope_Subtree, uiCnd)
    
    For i = 0 To aryRibbonTab.Length - 1
        

         'Debug.Print (Left(aryRibbonTab.GetElement(i).CurrentName, 3))
        If Left(aryRibbonTab.GetElement(i).CurrentName, 3) = "未接続" Then
            Debug.Print ("Call Auto_connect")
            Call Auto_connect
            'connect_try_cnt = connect_try_cnt + 1
            Exit Sub
        ElseIf Left(aryRibbonTab.GetElement(i).CurrentName, 3) = "発注不" Then
            Debug.Print ("Call autoorderenablet")
            Call auto_order_enable
            Exit Sub
            
            'connect_try_cnt = connect_try_cnt + 1
        Else
            
        End If
    Next

    
End Sub


Sub Auto_connect()
    
Call AppActivate("自動取引用.xlsm - Excel")
SendKeys "%{4}", True

End Sub


Sub auto_order_enable()

Call AppActivate("自動取引用.xlsm - Excel")
SendKeys "%{5}", True

End Sub

“自動取引用.xlsm – Excel”にはお使いのエクセル名を入力。 

接続状態維持を呼ぶことで一連のプロシージャが動作する。
FindWindow(vbNullString, “自動取引用.xlsm – Excel” )で自動取引用のエクセルのウィンドウのIDを取得する。立ち上げてなければ当然存在しないためエラーが出る。

 uiAuto.CreatePropertyConditionで検索対象を指定して(第一引数が検索対象のプロパティ、第二引数が検索対象のプロパティ名)、クイックアクセスツールバーを検索する。その下にぶら下がっている(クイックアクセスツールバーに存在する登録機能)が私の場合、上書き保存、redo、undo、接続状態、発注可否になるため、これらを一括で取得するためUIAutomationClient.IUIAutomationElementArrayを使用している。
 これで取得したNameプロパティを一つずつ検索していき、接続状態が未接続状態であればクイックアクセスツールバーの接続状態をショートカットキー入力で操作し、接続状態だが発注不可な場合はクイックアクセスツールバーの発注可否をショートカットキー入力で操作する 。
 connect_try_cnt は何回も接続失敗したらあきらめて取引しなくするために使用していますが、いったんはコメントアウトしています。
 この状態で単発での動作確認ができると思いますが、使う際はApplication.Ontimeで使用する必要があるかと思います(私はその形で使用しています。通常のループを使うと、接続状態と発注可否が変わるかわかりません)

2021/11/22追記 クイックアクセスツールバーが消える

エクセルの見た目が変わり、クイックアクセスツールバーが消えるというクソアップデートが発生。

クイックアクセスツールバーが表示されなくなり、ここをチェック入れることで表示されるように。

とりあえず参考サイトを見つけたのでそれに従い修正。上書き保存が二つになるがそれでよければ今のまま使える。それが嫌な場合はクイックアクセスツールバーから上書き保存を消し、ショートカットで呼び出すキーが変わるので変更する(4→3、5→4)


コメント

  1. ひまつぶし より:

    助かりました。

    自分ではここまで調べきれないし発想もないので放置するしかなかったのですが、本当に助かりました。ありがとうございます。

    今後もますます期待しています。

    • kotatsu kotatsu より:

      コメントありがとうございます。
      そう言っていただけると書いた甲斐がありました。

タイトルとURLをコピーしました