RPAでExcelを操作する際にエラーになる原因と対処法をまとめた話✨💻

Excelの自動化をする際に、ロボットを作った環境と違う環境で動かしてみると、思いもよらないエラーが出て止まる、なんてことが結構あったりするよね😱😱😱

いくつかの原因があるから、ひとつ直してもいろいろ出てくる場合があるから注意だよ😰😰😰

ボクも結構ハマったので、経験知としてメモしておくよ👌😘✨

# 安全ではない可能性のある外部ソースへのリンクが含まれている場合
起動時に「このブックには、安全ではない可能性のある外部ソースへのリンクが1つ以上含まれています...」というメッセージボックスが出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/fd8d6333-b18f-a7b5-dba9-81eeb966de83.png)
※ Excel for Office 365 (Excel 2019相当)の場合。Excelのバージョンによってメッセージが違う可能性があるよ

### 原因
Excelブックの中に、他のExcelブックなどのデータソースへの参照が含まれている。たとえばVLOOKUP関数で他のExcelブックを参照しているだけで、このメッセージが出るよ😱😱😱

セルの中にたとえば「リモートファイル」へのリンクとか、

```
=VLOOKUP(A24,'https://test.sharepoint.com/sites/workspace/Shared Documents/[201124.xlsx]Overview'!$A$19:$V$55,22,FALSE)
```

ローカルPCのワークシートへのリンクとか

```
=VLOOKUP(C2,'C:\Users\Desktop\[201027.xlsx]All'!$C$2:$Z$449,8,FALSE)
```

が入っている場合だよ😱😱😱

### 解決方法
いずれかの方法でメッセージダイアログボックスを表示させないようにできるよ👌😘✨

#### 方法1.意図せずリンクが入っているならExcelブックから取り除こう
リンクをして毎回新しい情報を取ってくる必要がなければ以下の手順で定数に変換してしまおう。

1. Excel で、[データ] タブの [クエリと接続] グループで [リンクの編集] を選択します。
2. リンク元の項目を選択して [リンクの解除] をクリックします。
3. 表示されるメッセージボックスで [リンクの解除] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/42d9c1c4-e366-0532-40cf-70017852a0eb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/737499d5-7358-d456-f751-addf78ab2a14.png)

セルの中の数式は、検索ダイアログボックスで検索することができるので、手作業で必要な場所だけ変更することもできるよ。

#### 方法2.リンクを自動的に更新するようにExcelを設定変更する
Excelで、ブックを開いたときにメッセージを表示しないでリンクを自動更新するには、次の手順を実行します。

1. [ファイル] > [オプション] > [詳細設定] を選択します。
2. [全般] の下の [リンクの自動更新前にメッセージを表示する] チェック ボックスをオフにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/221aa8e8-4b1d-3838-44f5-5edf332323fa.png)

<font color="Red">ただし、この設定はRPA以外でPCを使う場合に、意図しない外部ソースへのリンクを含む悪意のあるExcelファイルを受け取って開く可能性があると危険だよ</font>

#### 方法3.リンクを更新しないでメッセージも表示しないようExcelを設定変更する
メッセージを表示しないで、リンクを自分で更新するまでそのまま (更新されないまま) にしておくには、次の手順に従います。

1. Excel で、[データ] タブの [クエリと接続] グループで [リンクの編集] を選択します。
2. [起動時の確認] をクリックします。
3. [メッセージを表示しないで、リンクの自動更新も行わない] オプションをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/490a968f-c78c-5a34-c99c-2289895f0eb8.png)


参考

* [Excel でのリンクされたブックの更新に関する起動時メッセージの制御方法](https://docs.microsoft.com/ja-jp/office/troubleshoot/excel/control-startup-message)

# 保護ビューにより読み取り専用になる場合

起動時に「保護ビュー 注意-インターネットから入手したファイルは、ウイルスに感染している可能性があります。編集する必要がなければ、保護ビューのままにしておくことをお勧めします。」という警告が表示される。モーダルダイアログボックスではないので、そのままRPAで操作はできるけど、書き込みを想定している場合は書き込みができないので困るよね😱😱😱 あと、保護ビューの場合はExcelの通常の起動モードとは違うモード (別のインスタンス)で起動するので、Excel間のデータのやり取りも制限されてしまうよ😱😱😱
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/8adb2318-5d83-63aa-1e1c-1f6b51dbd6d9.png)
※ Excel for Office 365 (Excel 2019相当)の場合。Excelのバージョンによってメッセージが違う可能性があるよ

### 原因
インターネット、イントラネット、他のPCなどセキュリティゾーンが異なる場所から入手したファイルに対しては、Excelは警告を表示して読み取り専用となるようになっている。

### 解決方法
いずれかの方法で保護ビューのメッセージを表示しないようにできるよ👌😘✨

#### 方法1.Excelファイルの場所を信頼できる場所を追加するようExcelの設定を変更する
たとえばデスクトップにExcelファイルを置くとして、ここにあるファイルの場合は保護モードにならないようにするには、次の手順に従います。

1. [ファイル] > [オプション] > [トラスト センター] を選択します。
2. [トラストセンターの設定] をクリックします。
2. [トラスト センター] > [信頼できる場所] をクリックします。
3. [新しい場所の追加] をクリックして、デスクトップのパスを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/dba55e37-3197-9910-be17-2680d0fa656d.png)

<font color="Red">ただし、この設定はRPA以外でPCを使う場合に、意図しない悪意のあるExcelファイルを受け取ってこのフォルダーから開く可能性があると危険だよ</font>

#### 方法2.Excelファイルのゾーン情報を手動で削除する
ファイルのプロパティを見ると、「このファイルは他のコンピューターから取得したものです...」と表示されるよ😱😱😱

これはファイルのプロパティにゾーン情報が設定されたためだよ😱😱😱

ファイルのプロパティダイアログボックスで手動で削除することができるよ👌😘✨

[許可する] のチェックを入れて [OK] または [適用] をクリックすると、ゾーン情報が削除され、以後は保護モードにならなくなるよ👌😘✨
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/f03c0d1d-9361-0eea-d814-4958ffab7452.png)


#### 方法3.Excelファイルのゾーン情報を一度ZIP化することで削除する
ゾーン情報は、NTFSファイルシステム特有の属性なので、NTFSファイルシステムから一度出ると、たとえば一度ZIP化すると落ちるので、これを再度解凍するとゾーン情報を落とせるよ👌😘✨

たくさんのファイルを一度に処理する場合や、自動化したい場合は便利だよ👌😘✨

**PowerShellで行う場合**
PowerShellには標準でZIP圧縮/解凍コマンドがあるのでこれを使うよ👌👌👌

```PowerShell:
Compress-Archive -Path 【該当ファイル】.xlsx -DestinationPath aaa.zip -Force
Remove-Item -Path 【該当ファイル】.xlsx -Force
Expand-Archive -Path aaa.zip -DestinationPath . -Force
```
※一度ファイルを消さないとゾーン情報を引き継いでしまうよ😱😱😱


**RPAで行う場合 (Automation Anywhere Community Edition A2019)**
フォルダーパッケージのZIP/解凍を使うと2ステップで完成するよ👌👌👌
(該当ファイルを202002.xlsxとする場合)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/03f1bbe6-42d4-fe72-3d15-caa364343525.png)
「元のファイルを削除」とか「既存のファイルを置換」といったオプションがあるからステップの数が短くてすむよ👌👌👌
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/603b9f93-ecfc-4e7f-48b4-d8d8b5dd31b8.png)

#### 方法4.Excelファイルのゾーン情報をstreamsツールで削除する
マイクロソフトが配布しているWindows Sysinternalsツール群のstreamsを使うとゾーン情報を削除できるよ👌😘✨

以下から入手可能だよ👌😘✨

https://docs.microsoft.com/ja-jp/sysinternals/downloads/streams

使い方。streams.exeをパスの通るところに解凍し、その後【解除したいディレクトリ】の中に該当するExcelファイルを置いた後、以下のコマンドを実行してね👌👌👌

```
streams.exe -s -d 【解除したいディレクトリ】
```

以上、
役に立ったかな👌😘✨👌😘✨