Box EditでもExcelマクロは使えるか？

# はじめに
Box Edit とは、Boxに格納されているOffice文書をofficeデスクトップアプリケーションで開ける機能です。

Boxに関わらず、通常、ExcelマクロはOffice Onlineでは実行できません。
そのことから、BoxとExcelマクロの関係について、
　「ファイルサーバからBoxに移行したらExcelマクロは使えなくなる」
　「ExcelマクロはBox Driveでしか使用できない」
のようなイメージを持っている人も多いのではないでしょうか？

今回は、*Box Edit を使用して Excelマクロ が動作する* であろうケースについて、いくつか実際に検証してみました。

# 結果
結果はこうなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623097/34695611-b36c-43b0-1660-def926c1af46.png)

## １つ目は、１ブック内でマクロが完結しているケース
このケースは、以下の動画の通り、問題なく動作しました。

**[＜検証動画＞](https://cloud.box.com/s/bf2pb69kvi6gpwrsqj4t0rf2b2qvi6bh)**

この検証では、次のことを行っています。
１．	Box内に保存されているExcel（マクロ有効化ファイル）をBox Editで開く
２．	そのファイル内に予め作成しておいたマクロでフォームを開く
３．	範囲を選択して、書式設定用のマクロが関連付けられたボタンをクリック
４．	予め設定された条件（Deploy<80, Active<50）に従って、書式設定（赤字網掛け）される

使用したコードは以下の通り。
~~~vb
Private Sub Format_Active_Click()
'
' Deploy率が80%以下を赤くする
'
    Selection.FormatConditions.Add _
        Type:=xlCellValue, _
        Operator:=xlLess, _
        Formula1:="=50"
        
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    
    With Selection.FormatConditions(1).Font
        .Color = -16383844
        .TintAndShade = 0
    End With
    
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 13551615
        .TintAndShade = 0
    End With
    
    Selection.FormatConditions(1).StopIfTrue = False
End Sub

Private Sub Format_Deploy_Click()
'
' Deploy率が80%以下を赤くする
'
    Selection.FormatConditions.Add _
        Type:=xlCellValue, _
        Operator:=xlLess, _
        Formula1:="=80"
        
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    
    With Selection.FormatConditions(1).Font
        .Color = -16383844
        .TintAndShade = 0
    End With
    
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 13551615
        .TintAndShade = 0
    End With
    
    Selection.FormatConditions(1).StopIfTrue = False
End Sub
~~~

## ２つ目は、外部のテキストファイルを読み込むケース
このケースも、マクロから参照するファイル（データファイルなど）が絶対パス参照出来る環境（PC上などのBox外）にあれば動作しました。
一方で、Box内にあるファイルはUNCを含めたパス指定が出来ないため、Box Editから参照することはできませんでした。

**[＜検証動画＞](https://cloud.box.com/s/35os7cjwv1le4f4od11we6wcd2aq6s2v)**

この検証では、次のことを行っています。
１．	Box内に保存されているExcel（マクロ有効化ファイル）をBox Editで開く
２．	絶対パス参照出来る位置にデータファイルを置く（C:\ExcelVBA\data2.txt）
３．	外部ファイル参照用のマクロを実行
４．	データファイル内の文字列を読み込んで表示される

使用したコードは以下の通り。
~~~vb
Sub 外部ファイル参照_絶対()
    Dim n As Integer, i As Integer, txtLine As String
    
    If Dir("C:\ExcelVBA\data2.txt") = "" Then
        MsgBox "ファイルが存在しません"
        Exit Sub
    End If
    
    n = FreeFile
    Open "C:\ExcelVBA\data2.txt" For Input As #n
    
    Do While Not EOF(n)
        i = i + 1
        Line Input #n, txtLine
        MsgBox txtLine
    Loop
    Close #n
End Sub
~~~

## ３つ目は、Boxに格納された複数のExcel間でデータをやり取りするケース
このケースも、関連するExcelブックを予め開いておけば、問題なく動作しました。
一方で、マクロ内で参照するBox内のファイルに直接アクセスすることは出来ないため、ファイルを開いている状態で作業する必要があります。

**[＜検証動画＞](https://cloud.box.com/s/w22g5t6a0pupj7k35ein92isskzlu2q8)**

この検証では、次のことを行っています。
１．	Box内に保存されているExcel（マクロ有効化ファイル）をBox Editで開く
２．	Box内に保存されているExcel（通常のファイル）をBox Editで開く（データファイル）
３．	Active Book 間のデータ転送用マクロを実行
４．	片方のExcelからデータが読み込まれて、もう片方のExcelへ書き込まれる

使用したコードは以下の通り。
~~~vb
Sub Box内のExcelファイル間データ転送()

    For i = 1 To 10
        ActiveCell.Value = Workbooks("データ.xlsx").Worksheets("データ").Cells(i + 1, 2)
        ActiveCell.Offset(1, 0).Select
    Next i

End Sub
~~~

# まとめ
BoxとExcelマクロは相性が悪いと思われがちですが、実はマクロの作り方次第で、多くのユースケースがBox Editでも実行可能であることが分かりました。
WebアプリケーションからのExcelマクロ活用の一助になれば幸いです。