WinActorとVBAでパワポ資料を自動作成する

# 経緯
WinActorを使って社内でRPA化を推進しています。
ユーザ部門にRPA化したい業務をヒアリングすると、どこでも出てくる案件があります。

* 定例会議で使用するパワポ資料をRPAで自動作成する

しかし、　**WinActor単体でパワポ資料作成など不可能**です。
なぜなら、用意されているパワポ関連のライブラリが1個しかないからです。
![WS000015.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/6dbc0af1-3b82-665c-f9b2-73efe0cebc40.jpeg)

できません、と言って断っても良かったのですが、
何らかの実績を残したかったので、VBAを駆使してやってみることにしました。

# 資料作成の流れ
資料作成の流れは、以下の図のようになります。
1. 経理システムや部門独自アプリから営業データをCSV形式で出力します
2. CSVを集計用のエクセルに張り付けます
3. 集計用のエクセルの値をパワポフォーマットに張り付けます

![WS000023.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/2e97dfe0-1341-9a1d-3b0f-5a33568f2e25.jpeg)


# 【RPA部分】経理システムから当月の売上データを取得する
うちの経理システムはウェブアプリでも操作できるので、RPAにも優しい。
基本はボタン押すだけだし、WinActorでも簡単にできるだろう・・・。

## ライブラリに年度取得がない**（#＾ω＾）イラー**
![WS000018.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/a35ff190-1462-3c2d-6bf3-bccfcce39f1e.jpeg)
仕方ないので自分でライブラリを作る。
![WS000020.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/885a22af-5ef7-bfe1-fc1c-c86ee28ee0fb.jpeg)

## ブラウザの応答が遅いとエラーで止まる**（#＾ω＾）ウゼー**
ウインドウ状態待機や指定時間待機を用いて、待ってあげましょう。
![WS000021.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/bade1de6-f7f4-2309-ed6c-ee7845a356aa.jpeg)

# 【VBA部分】貼り付けた売上データを元にパワポ資料を作成する
今回のメインの部分です。
ExcelVBAの資料は山ほどあるのに、PowerPointVBAの情報はほとんどありません。
Microsoftの公式ドキュメントを読んでやっていきます。
https://docs.microsoft.com/ja-jp/office/vba/api/overview/powerpoint

## タイトルの設定
PowerPointは、テキストボックスや図形、グラフなどは全て**オブジェクト**として管理されている。
![画面1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/1653c95a-eca9-f61a-138d-7e39dbda68c2.gif)
VBAで操作する場合は、対象のオブジェクトを指定して、値を設定してやればいいです。
例えば、タイトルのテキストボックスは、以下のような指定で文字が設定できます。

```
Shapes("タイトル").TextFrame.TextRange.Text = "何か文字列を入れる"
```

1ページ目のタイトルは以下のようなVBAで設定しています。

```vb

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ページ目は、表の設定を行っています。
テキストボックスの指定とは少し異なっています。
![画面2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/8019315c-a498-3442-64fc-c3cdd54618ef.gif)


```
Shapes("表").OLEFormat.Object.Sheets(1).Range("N4:N13").Value = "何らかの値"
```


```vb

'--------------------------------------------------------------------------------------------
    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ページ目の下で、グラフの設定を行っています。

```vb

'--------------------------------------------------------------------------------------------
    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関数を使って、セクションの指定でマイナスのときの指定をします。

```vb

Format(-9999, "0.0;▲0.0")
```

# まとめ
こんな感じで表とグラフをVBAで作成できれば、
RPAでデータ取得して、そのデータを表とグラフに設定してやれば、
資料作成が自動化できると思います。

**大変なのは、集計用のエクセルを作るのと、パワポのフォーマットを作ることです**