【VBA】Excelの表をTeXにコピペするときに楽をしたい

# はじめに
TeXでレポートを作っているとき、Excelで作った表などを貼り付けたいことがしばしばあったので少し楽できるようにしました．~~もうこういう記事はたくさんあるんだろうな~~．

:::note info
「なんでもいいからはやくやり方を教えろ」という方は最後の 「アドイン設定」をお読みください．
:::

# 何が面倒だったのか
まず、(いうほどでもないのですが)何がそんなに面倒だったのか書きます．
## TeXのtabular
TeXでは表を次のような書き方であらわします．
```TeX:tablarの例
	\begin{tabular}{|l|c|r|} % l 左寄せ / c 中央寄せ / r 右寄せ
		\hline % 横線を入れる
		一つ目 & 二つ目 & 三つ目 \\
        \hline
		あ & い & う \\
        \hline
		A & B & C \\
        \hline
		1 & 2 & 3 \\
		\hline
	\end{tabular}
```
結果は次のような表になります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/1c0cc2e2-4cc2-51e0-a266-7cbfbd306108.png)

## Excelの表
一方で、Excelの単純な表(つまりセルの結合などがない表)は以下のような感じになります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/48517026-19ea-d0d5-03d9-6d4d597bbf75.png)
これを、普通に選択してTeXで（正確にはテキスト形式で）貼り付けすると次のようになります．
```text:表をそのまま貼り付けると…
一つ目	二つ目	三つ目
あ	い	う
A	B	C
1	2	3
```
これだとわかりにくいかもしれませんが、タブ文字で右のセルへの移動、改行で次の行への移動をあらわしています．

これをパワーでTeXにするなら、
- タブを探して & にかえる
- 改行部分の最後に \\ をつける
という作業をすればよいだけですね．

…

はい．やっていられません．

## VBAなしで楽をしたいときはどうするか
では今まではどうしていたのかというと、
Excelのセルに=A1 & " & " ... と打って結合をしていました．
例えば先ほどの例だと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/54bf3dfb-878a-0393-e35d-ee2c97fa0c5b.png)
このように書くことで実現できます．
他にもCONCAT関数を使うことでもう少し楽ができますが、やっぱり面倒です．

# アドインの設定
このようなことがあって、「VBAを書いてアドインにしてしまえば楽だなぁ」と思ったわけです．はい．凡人の発想です．

## とりあえずアドインのファイルを作る
1. Excelを起動し、空白のファイルなど何でもいいのでファイルを「名前を付けて保存」します．このときにExcelアドイン(*.xlam)を選んでおきます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/c6ec61ca-bb09-195e-861f-117b107f9cfd.png)
1. 作ったファイルの置く場所はWindowsでは ` C:\Users\ユーザーの名前\AppData\Roaming\Microsoft\AddIns `でうまくいくらしいです．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/38f4b8c0-2c76-358f-4d30-87ce1466fb02.png)
これでアドインのファイルは準備完了です．
:::note warn
Excelファイルは閉じないで続けます．
もし、保存したあとにExcelを閉じてしまった場合も、` C:\Users\ユーザーの名前\AppData\Roaming\Microsoft\AddIns `にあるxlamファイルを開けば問題ありません．
:::

## 開発タブの有効化
Excelには隠されたコマンドがあります．
（子供心をくすぐる機能？です）
Excelにて[ファイル]＞[オプション]を開き、[リボンのユーザー設定]から開発のチェックボックスにチェックを入れたら[OK]を押します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/82c4d971-93e0-0b3b-40ad-b86acf59c345.png)
これでExcelのリボンに開発タブが増えます．

## VBAを書く
Visual Basicボタンを押すと新しいウィンドウが開いてびっくりします．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/5444b311-ec5c-30b0-ee1a-b2737d62000a.png)
ここから、標準モジュールを作ります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/01afd25a-4af0-96c4-bf86-bfa83632bd5f.png)
オブジェクト名を変えてわかり易くしてもいいです．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/42c2a84f-ef4a-3f91-15b3-d5c0ee3ce127.png)
このコードの部分にプログラムを書きます．

こちらが全文です．
```vb:好きなモジュール名(好きな名前.xlam)

Option Explicit '変数の宣言を強制(バグやTypoを減らす)

'選択したものをTeXのtablarにあわせて文字列で返す関数
Function toTexTableFormat(target As Range) As String
    
    Dim sel As Range
    Dim ret As String
    ret = ""
    
    '引数が空
    If target = Nothing Then Exit Function
    
    'それぞれに & をつけて結合
    For Each sel In target
        ret = ret & sel.Value & "  &  "
    Next
    
    '最後は \\ に変えて戻り値設定
    toTexTableFormat = Left(ret, Len(ret) - 5) & "  \\"
    
End Function
```
細かい説明は省きますが、
「引数で1行分を受け取り、セルの間には & を、行の最後には \\ を入れたものを返す」という単純なものです．
貼り付けたらこの部分で保存しておきましょう．

:::note
プログラムの保存が出来たらVBEは閉じてしまって問題ありません．
:::

:::note warn
Excelのブックとは別物なのでVBE(新しく開いてびっくりしたウィンドウ)で保存します．
:::

## アドインをONにする
では編集が終わったExcelはいったんすべて閉じ、新しくExcelのブックを開きましょう．
ブックが開いたら[開発タブ]の[Excelアドイン]から先ほど作ったxlamファイルを選びます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/2d1299a7-ab90-1130-d9a8-9b41197bf051.png)
これで準備が完了しました．

## 使用例
では使ってみましょう．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/ae05c686-17c8-648f-2905-1525d738a138.png)
これを貼り付けると…
```Tex:関数の結果を貼り付けると…
一つ目  &  二つ目  &  三つ目  \\
あ  &  い  &  う  \\
A  &  B  &  C  \\
1  &  2  &  3  \\
```

はい．いい感じに出力されていますね．(横幅が増えたのはTeX上での見やすさのためにスペースを入れたためです)

# 感想
案外記事として書くと面倒でした．
でもこれで大分快適になると思います．
ﾀﾌﾞﾝ．