経緯
WinActorを使って社内でRPA化を推進しています。
ユーザ部門にRPA化したい業務をヒアリングすると、どこでも出てくる案件があります。
- 定例会議で使用するパワポ資料をRPAで自動作成する
しかし、 WinActor単体でパワポ資料作成など不可能です。
なぜなら、用意されているパワポ関連のライブラリが1個しかないからです。
できません、と言って断っても良かったのですが、
何らかの実績を残したかったので、VBAを駆使してやってみることにしました。
資料作成の流れ
資料作成の流れは、以下の図のようになります。
- 経理システムや部門独自アプリから営業データをCSV形式で出力します
- CSVを集計用のエクセルに張り付けます
- 集計用のエクセルの値をパワポフォーマットに張り付けます
【RPA部分】経理システムから当月の売上データを取得する
うちの経理システムはウェブアプリでも操作できるので、RPAにも優しい。
基本はボタン押すだけだし、WinActorでも簡単にできるだろう・・・。
ライブラリに年度取得がない**(#^ω^)イラー**
ブラウザの応答が遅いとエラーで止まる**(#^ω^)ウゼー**
ウインドウ状態待機や指定時間待機を用いて、待ってあげましょう。
【VBA部分】貼り付けた売上データを元にパワポ資料を作成する
今回のメインの部分です。
ExcelVBAの資料は山ほどあるのに、PowerPointVBAの情報はほとんどありません。
Microsoftの公式ドキュメントを読んでやっていきます。
https://docs.microsoft.com/ja-jp/office/vba/api/overview/powerpoint
タイトルの設定
PowerPointは、テキストボックスや図形、グラフなどは全てオブジェクトとして管理されている。
VBAで操作する場合は、対象のオブジェクトを指定して、値を設定してやればいいです。
例えば、タイトルのテキストボックスは、以下のような指定で文字が設定できます。
Shapes("タイトル").TextFrame.TextRange.Text = "何か文字列を入れる"
1ページ目のタイトルは以下のようなVBAで設定しています。
Public ppPrs As PowerPoint.Presentation 'プレゼンテーションオブジェクト
Dim ppSld As PowerPoint.Slide 'スライドオブジェクト
'--------------------------------------------------------------------------------------------
Set ppSld = ppPrs.Slides(1) '1ページ目のスライドをセット
'タイトル設定
ppSld.Shapes("タイトル").TextFrame.TextRange.Text = nendo & Format(Now(), "MM月") & "営業会議"
'(3)は変更なし
ppSld.Shapes("作成日").TextFrame.TextRange.Text = "作成日:" & Format(Now(), "YYYY年MM月DD日") & Chr(13) & Chr(10) & "作成者:XXX"
' Object Release
Set ppSld = Nothing
'--------------------------------------------------------------------------------------------
表の設定
2ページ目は、表の設定を行っています。
テキストボックスの指定とは少し異なっています。
Shapes("表").OLEFormat.Object.Sheets(1).Range("N4:N13").Value = "何らかの値"
'--------------------------------------------------------------------------------------------
Set ppSld = ppPrs.Slides(2) '2ページ目のスライドをセット
'ページタイトル設定
ppSld.Shapes("ページタイトル").TextFrame.TextRange.Text = nendo & "/" & Gatsu & " 収益実績(事業部全体)"
'収益実績(事業部全体)データ設定
With ppSld.Shapes("表").OLEFormat.Object
'前期実績データ設定
.Sheets(1).Range("N4:N13").Value = ThisWorkbook.Worksheets("集計").Range("C5:C14").Value
'当期計画データ設定
.Sheets(1).Range("O4:O13").Value = ThisWorkbook.Worksheets("集計").Range("D5:D14").Value
'当期実績データ設定
.Sheets(1).Range("P4:P13").Value = ThisWorkbook.Worksheets("集計").Range("E5:E14").Value
End With
'売上高チャート作成
With ppSld.Shapes("グラフ-売上高").Chart.ChartData
.Activate
'売上高データ設定
ThisWorkbook.Worksheets("集計").Range("C5:E5").Copy
.Workbook.Sheets(1).Range("B2:D2").PasteSpecial Paste:=xlPasteValues
.Workbook.Close
End With
'営業利益チャート作成
With ppSld.Shapes("グラフ-営業利益").Chart.ChartData
.Activate
'営業利益データ設定
ThisWorkbook.Worksheets("集計").Range("C14:E14").Copy
.Workbook.Sheets(1).Range("B2:D2").PasteSpecial Paste:=xlPasteValues
.Workbook.Close
End With
'売上高計画達成率設定
ppSld.Shapes("達成率-売上高").Table.Cell(1, 2).Shape.TextFrame.TextRange.Text = Format(ThisWorkbook.Worksheets("集計").Range("F5").Value, "0.0;▲0.0") & "%"
'営業利益計画達成率設定
ppSld.Shapes("達成率-営業利益").Table.Cell(1, 2).Shape.TextFrame.TextRange.Text = Format(ThisWorkbook.Worksheets("集計").Range("F14").Value, "0.0;▲0.0") & "%"
'売上高差異設定
ppSld.Shapes("計画実績差異-売上高").TextFrame.TextRange.Text = Format(ppSld.Shapes("表").OLEFormat.Object.Sheets(1).Range("J4").Value / 1000000, "0.0;▲0.0")
'営業利益差異設定
ppSld.Shapes("計画実績差異-営業利益").TextFrame.TextRange.Text = Format(ppSld.Shapes("表").OLEFormat.Object.Sheets(1).Range("J13").Value / 1000000, "0.0;▲0.0")
' Object Release
Set ppSld = Nothing
'--------------------------------------------------------------------------------------------
グラフの設定
2ページ目の下で、グラフの設定を行っています。
'--------------------------------------------------------------------------------------------
Set ppSld = ppPrs.Slides(2) '2ページ目のスライドをセット
'売上高チャート作成
With ppSld.Shapes("グラフ-売上高").Chart.ChartData
.Activate
'売上高データ設定
ThisWorkbook.Worksheets("集計").Range("C5:E5").Copy
.Workbook.Sheets(1).Range("B2:D2").PasteSpecial Paste:=xlPasteValues
.Workbook.Close
End With
'営業利益チャート作成
With ppSld.Shapes("グラフ-営業利益").Chart.ChartData
.Activate
'営業利益データ設定
ThisWorkbook.Worksheets("集計").Range("C14:E14").Copy
.Workbook.Sheets(1).Range("B2:D2").PasteSpecial Paste:=xlPasteValues
.Workbook.Close
End With
' Object Release
Set ppSld = Nothing
'--------------------------------------------------------------------------------------------
マイナス表示を▲表示にする方法
値を取得してきただけでは、マイナス表示が"-"になってしまします。
報告資料では、マイナスを"▲"で表示することが多いと思いますので、その設定です。
Format関数を使って、セクションの指定でマイナスのときの指定をします。
Format(-9999, "0.0;▲0.0")
まとめ
こんな感じで表とグラフをVBAで作成できれば、
RPAでデータ取得して、そのデータを表とグラフに設定してやれば、
資料作成が自動化できると思います。
大変なのは、集計用のエクセルを作るのと、パワポのフォーマットを作ることです