これを書いた理由
既存の業務アプリで、「〇〇データ生成」とかのボタンを押すと、新規のワークブックが立ち上がるので
それを名前を付けて新規保存して(もしくはコピペして)、そのファイルをまた別の業務アプリに……
みたいな作業ってありますよね。
たとえばAccessで作られた業務アプリだと
set excelApp = CreateObject("Excel.Application")
set excelBook = excelApp.Workbooks.Add()
とかやって新規で立ち上げてデータをシートに流し込んで……みたいな感じでアプリが出してくれるやつです。
これを自動化するにあたり、
表示されているExcelワークブックを保存するには
MS Excel VBO の「Save Current Workbook as」を使えばよくて
そのためには、そのExcelワークブックにAttachしないといけなくて
いま新規で立ち上がったワークブックで、まだ保存されてないからファイル名とか無くて……
(だいたい「Book1 - Excel」みたいな名前で立ち上がるけど、状況によってはそうと決まったわけでもない)
ファイル名がなくて自分で起動したわけでもないExcelはどうやってAttachしたらいいの……
というところで詰まって困っていました。
作成したオブジェクト
形のちがうAttachが縦に2個並んでいるところは、
上のほうは別ページにして操作ステージでAttachしているのですけど、
そのAttachの中身がこれ
アプリケーションモデラーで、win32でExcelのウィンドウをspyして取得しておきます。
これを使って、AttachしたあとにExcelのウィンドウをActivateします。
2個目のAttachは、MS Excel VBOのAttachです。
なんでこの2個目のAttachをするかというと、これをすると出力でhandleが取得できるからです。
(最初は、いきなりこれでAttachしようとしましたが、それではできなかったので、前に操作ステージでAttachする処理を足したのです)
この取得したhandleを使って、MS Excel VBOの
- Save Current Workbook as
- Close Current Workbook
- Close Instance
とやっていきます。
終わりです
ほんとはOLEDBとかのVBOで
テーブルなりクエリなりのデータを持ってくるほうがシステムとしては正しいのでしょうけど……(´・ω・`)
私(元コボラー)が作ると、いつもこんな感じでやたら長くてまだるっこしいフローになっちゃうので、
もっと要領の良いかっこいい書き方を教えてください。
あと、BluePrismの中の人に聞いたら、Accessとの連携はサポート対象外なんだそうです……。