UiPathでExcelを操作する(活用編: 名前を付けて保存する[完成版])

#UiPathでExcelを自由に操作する(活用編: 名前を付けて保存する)[完成版]
## 概要
前回の記事名前を付けて保存するについてご紹介しました。
https://qiita.com/takusonix/items/6e5a54cfe020b0f3a84c
しかし、新規に保存する場合は成功しましたが下図のように、上書き保存などには対応しておりません。
この記事では、警告を無視して強制的に名前を付けて保存する方法をご紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/d77811d0-efa3-1f79-5b9e-b7aa90c2c111.png)


## お約束事項（免責事項）
- この記事は2020年6月時点の情報を基に作成しております。
- 記事の内容は私個人の見解であり、所属する組織の公式見解ではありません。

## スキル
この記事には、C#によるカスタムアクティビティの開発が含まれます。
カスタムアクティビティの開発方法は、UiPath公式のドキュメントを参照ください。
（本記事では最低限のみ記載します。）
https://docs.uipath.com/activities/lang-ja/docs/creating-a-custom-activity

## 必要なソフトウェア
- Visual Studio
- Nuget または Nuget Package Explorer
- Microsoft Office

## 警告アラートの正体
上記の名前を付けて保存の確認の正体は、"DisplayAlert"と呼ばれるものです。
公式のドキュメントに記載の通り、DisplayAlertの既定値は`True`なっています。
そのため、公式ドキュメントの注釈の通り、DisplayAlertを`True`から`False`に変更します。
https://docs.microsoft.com/ja-jp/office/vba/api/excel.application.displayalerts

## 前回の実装
前回のソースコードはこちらです。
DisplayAlertはWorkbookではなく、Applicationのクラスに含まれているため、WorkbookからApplidationを取得する必要があります。

```C#
using Microsoft.Office.Interop.Excel;
using System;
using System.Activities;
using System.ComponentModel;

namespace UiPathCustomLibrary
{
    public class SaveAs : CodeActivity
    {
        [Category("Input")]
        [RequiredArgument]
        public InArgument<Object> WorkbookApplication { get; set; }
        [Category("Input")]
        public InArgument<Object> FileName { get; set; }
        protected override void Execute(CodeActivityContext context)
        {
            object workbookapp = WorkbookApplication.Get(context);
            Workbook workbook = workbookapp.GetType().GetProperty("CurrentWorkbook").GetValue(workbookapp) as Workbook;

            workbook.SaveAs(Filename: FileName.Get(context), FileFormat: XlFileFormat.xlOpenXMLWorkbook, CreateBackup: false);
        }
    }
}

```

## WorkbookからApplicationの取得
Workbookについて公式のドキュメントを確認します。
https://docs.microsoft.com/ja-jp/office/vba/api/excel.workbook

すると、プロパティにApplicationが存在しましたので、このプロパティからApplicationを取得することが可能です。
https://docs.microsoft.com/ja-jp/office/vba/api/excel.workbook.application
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/33990f69-c8d2-082c-7cfb-06cd6d99a28f.png)

## 実装

```C#
using Microsoft.Office.Interop.Excel;
using System;
using System.Activities;
using System.ComponentModel;

namespace UiPathCustomLibrary
{
    public class SaveAs : CodeActivity
    {
        [Category("Input")]
        [RequiredArgument]
        public InArgument<Object> WorkbookApplication { get; set; }
        [Category("Input")]
        public InArgument<String> FileName { get; set; }
        protected override void Execute(CodeActivityContext context)
        {
            // 引数(InArgument)より、WorkbookApplicationのオブジェクトを取得する
            // WorkbookApplicationの属性に必須（RequireArgument）を指定しているため、workbookappのnullチェックは不要
            object workbookapp = WorkbookApplication.Get(context);
            
            // WorkbookApplicationから、Microsoft.Office.Interop.Excel.Workbook型として（キャストして）、CurrentWorkbookを読み込む
            Workbook workbook = workbookapp.GetType().GetProperty("CurrentWorkbook").GetValue(workbookapp) as Workbook;

            // WorkbookのプロパティからApplicationを取得する
            Application application = workbook.Application;
            // 変更前のDisplayAlertを保持する
            bool prevDisplayAlert = application.DisplayAlerts;

            // DisplayAlertを一時的にFalseにする
            application.DisplayAlerts = false;
            
            // 名前を付けて保存する 
            workbook.SaveAs(Filename: FileName.Get(context), FileFormat: XlFileFormat.xlOpenXMLWorkbook, CreateBackup: false);

            // DisplayAlertを元に戻す
            application.DisplayAlerts = prevDisplayAlert;
        }
    }
}

```

## 実行確認
Nuget Package Explorerで作成したライブラリをUiPath Studioでインストールした後、早速使ってみます。
「c:\tmp\Sample2.xlsx」として名前を付けて保存します。
※ 保存先は絶対パスで指定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/bb80d433-6439-310b-b934-8d0750c3c112.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/2a60d6ce-b4f6-bbfd-c92b-f975552e55cb.png)