Excelでもコマンド実行がしたい！

この記事は「[Visual Basic Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vb)」と
「[Shell Script Advent Calendar 2016](http://qiita.com/advent-calendar/2016/shell-script)」の 21日目の記事です。

---
# これは何？
![ExSQell.gif](https://qiita-image-store.s3.amazonaws.com/0/76595/39e8fe04-8376-a7ba-641d-6eddd1a21355.gif)

[ExSQell](https://github.com/nmrmsys/ExSQell) という Excelのシート上に書いた SQLやシェルコマンドを実行して、その結果をインラインのセルに展開したり、オートフィルター設定済みの別シートで出力したりする事ができるVBAマクロのツールです。

---
# どう使うの？
![ExSQell_Config.png](https://qiita-image-store.s3.amazonaws.com/0/76595/076517cf-cc65-8df4-fcc8-39f0321a731a.png "設定シート")
設定シートでローカル実行するシェルを設定した後、実行したいコマンドが入力されているセルにカーソルを合わせて、Ctrl + W or Ctrl + Q
他にSQL実行やDB定義参照、クエリエディタ、データメンテナンス、SQL整形・変換・生成などのDB系便利機能もあるが本記事では割愛

---
# 最近追加した新機能
- セル範囲リダイレクト<br>
Excel上のセル範囲を `:>` `>:` `<:` `:<` といった独自拡張のリダイレクト記号により、ファイル等と同様にコマンドラインへの入出力として使える

![ExSQell_NewFeature1.png](https://qiita-image-store.s3.amazonaws.com/0/76595/2bbc9948-b001-cd4f-e7ff-f7261c46255f.png "セル範囲リダイレクト")

---
- リモート・sudoコマンド実行<br>
プロンプト文字の前に「ホスト名」または「ユーザ名@ホスト名」を指定する事によって、コマンドが SSHでリモート実行される<br>またプロンプト文字に$ではなく #を指定する事により、コマンドが sudo実行される<br>もちろん、両方の指定を混ぜた実行も可能

![ExSQell_NewFeature2.png](https://qiita-image-store.s3.amazonaws.com/0/76595/a15d6f8e-fe18-6393-ff40-55f53e96f693.png "リモート・sudoコマンド実行")

---
# つまりは、こう言う事
**Excelからシェルコマンド実行で200万パワー<br><br>セル範囲リダイレクトが加わって2倍の400万<br><br>さらにリモート・sudo実行の3倍を加えれば<br>トータル1200万パワーだ！（つよい、確信）**

---
# なぜ、Excelを使うのか？
もともと社内SEをやっていた頃にマスタ登録用のデータや障害時の対象範囲データ等をユーザー部門とやり取りするのに、毎回DB操作ツールで抽出したデータをExcelに張り付けて整形加工してたのがダルくて、これ直接出力するようにしたら早いんじゃね？と思って作り始めたのが発端、最初は単純なSQL実行機能のみだった。

SQL実行が出来るようになると、今度はよく使うSQLを登録実行したり、シート名をいい感じで付けたり、オートフィルタを自動で設定したり、最終的にDB操作はこれで全部みたいなイカれた時期もあったりして、どんどん機能がテンコ盛りになっていった。

ある時、[デザイニング・インターフェース](https://www.oreilly.co.jp/books/9784873115313/) という書籍でインフォメーショングラフィックスの章に書かれていた、データに視覚的な特徴を与える事で直感的な把握が可能になるというのに天啓を得て、そうか生データに直接アノテーションを加えられる Excelフォーマット最強！ってなって、それ以前にも手動ではセル書式を設定してたりしたのを、条件付き書式で空白セルをピンク塗りするのを自動設定させたり、セルコメントに属性情報を仕込んだり、やりたい放題

<img width="350" alt="DesigningInterfaces1.png" src="https://qiita-image-store.s3.amazonaws.com/0/76595/1fb5b56d-6c5b-eb9d-d5c8-96e6cd7adf2b.png">

<img width="350" alt="DesigningInterfaces2.png" src="https://qiita-image-store.s3.amazonaws.com/0/76595/fa995cec-5f54-3c8d-56bc-3b6f3a038442.png">

ここで一旦、社内SEで無くなったりして、このツールの前身のツールは使わなくなってしまい、長い間お蔵入りになっていたのだが、ここ数年来インフラ業も兼任するようになって、シェル芸なるものを嗜んだりしているうちに、あれ？もしかして Excelでワンライナー実行出来たりとかしたら、ちょっと素敵やん、思い立ったが吉日という事で、昔のツールを引っ張り出してきて、シェルコマンド実行機能を悪魔合体したのち、リブランドさせたっつー次第

---
# 実装にまつわるエトセトラ
上記の様な経緯で生まれたツールなので、実装に関しては完全に[俺のコードを見てくれ、ワイルドだろぉ～](https://github.com/nmrmsys/ExSQell/blob/master/src/ExSQell.xlsm_SQLTOOL.bas)になってて、素人にはオススメ出来ないし、継ぎ足し継ぎ足しで思い付いた機能追加や改良をブチ込んでいく開発スタイルもあいまって、秘伝のソース化がいちじるしい感は大いに有りますので、あしからず

ただ一つ言えるのは、VBAというのは、あちらこちらでDisられてますが、ちょっとした思い付きを形にするには、非常にイージーでパワフルなツールだという事です。この分かり易い開発言語、簡単に使えるデバッグ環境、柔軟かつ豊富な拡張性が無ければ、仕事の合間でこれだけの機能を実装する気力は湧かなかったかもしれません。VBAに感謝！

---
# シェルスクリプターの方へ
ここまで、シェルスクリプト成分ほぼゼロで進行して参りましたが [Shell Script Advent Calendar](http://qiita.com/advent-calendar/2016/shell-script) 参加で、さすがにそれもアレなので、最近作った AWS EC2の AMIを n世代バックアップするシェルスクリプトでもご覧下さい。AWS CLI芸と jq芸を駆使した逸品です。
[nmrmsys/ami_backups](https://github.com/nmrmsys/ami_backups)

---
# 参考文献
- [下請けCOBOLERとして生きていた頃のノウハウ Advent Calendar 2016 6日目 エクセルを使いこなそう①](http://qiita.com/nakajidamedeath/items/00f0ce785b2a15aa29a1)
- [Visual Basic Advent Calendar 2016 18日目 学習曲線に沿ってゆるい言語から硬い言語へ。Visual Basic は最高だった話](http://blog.clock-up.jp/entry/2016/12/18/flexible-programming-with-vb)
- [PowerShell Advent Calendar 2016 16日目 なぜ、PowerShellを使うのか？](http://qiita.com/lldev2/items/5e37d67d180faf36afdd)
- [ポエム Advent Calendar 2016 1日目 何故僕たちはポエムを書くのか](http://qiita.com/a-suenami/items/094761708b73c53adc54)