EXCELでEXCELファイルおよびACCESSのデータに対してかんたんにSQLを実行するツール

以下のの記事で紹介した手法を用いて、EXCELからかんたんにSQLを実行できるツールです。
ACCESSがなくてもEXCELだけでSQLが実行出来るだけではなく、ACCESSのデータベースの作成やテーブルの作成が行えます。

https://qiita.com/takahasinaoki/items/0a74542f650df1698ab5

[Github](https://github.com/takanaweb5/EasySQL/releases)のサイトの[EasySQL_v13.zip]をダウンロードして、EasySQL.xlsmファイルをマクロを有効にして開いてください。
サンプルファイルを使用する時には、同じフォルダにsampledata.xlsxをコピーしてください。
タブが出現すると使えます。

常用的に使用するには、EasySQL.xlamファイルの方をアドインに登録して使用してください。

ソースコードは以下にあります。

https://github.com/takanaweb5/EasySQL

# 外観
ツールを実行すれば、このようなリボンが出現します。
![image.png](https://user-images.githubusercontent.com/50874513/87218693-f36d7d00-c38f-11ea-9f63-d2f0525867e1.png)
2020.07.11 仕様変更
ユーザインタフェースをリボン化
以下の記事の方法を使って、Commandbarをリボン化しました。

https://qiita.com/takahasinaoki/items/968333a32fa63185023b

# 使い方
### 1.SQL実行
SQLの入力されたセルを選択して「SELECT実行」ボタンを押下してください。
画面が表示されるので、画面の指示に従って結果を表示するセルを選択してください。  
SELECT文だけではなく作業中のEXCELブックに対してはUPDATE文が、ACCESSのファイルに対しては更新系のSQL全般および、CREATE文 DROP文 等も使用できます。CREATE VIEWでクエリーも作成出来ます。
その場合は、「SELECT実行」ボタンではなく「SQL実行」ボタンを押下してください。

### 2.SQL作成
SQLのFROM句に指定したい表の範囲を選択して、「SQL作成」ボタンを押下してください。
選択されたセルの範囲に従ってSQLのSELECT文のひな形がクリップボードにコピーされます。
内容を必要に応じて修正してSQLを実行してください。

### 3.データベース作成
Accessの空のデータベースファイルを作成することができます。

### 4.テーブル一覧表示
Accessのデータベースファイルの、テーブルとクエリの一覧を表示することができます。

### 5.インポート用SQL作成
EXCELのデータを利用して、AccessのデータベースファイルにデータをインポートするためのSQLのひな形を作成します。

### 6.削除用SQL作成
Accessのテーブルを削除するSQLのひな形を作成します。

<br>

# SQLの書き方
以下のいずれもＯＫ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/46c422f1-5582-3cd1-e4f2-d4e9bfa048e7.png)

## SQLの方言
SQLの書式は、AccessのSQLに準拠します。
内容については、以下の記事を参照ください。

https://qiita.com/takahasinaoki/items/0a74542f650df1698ab5#sql%E3%81%AE%E6%96%B9%E8%A8%80

## コメント
<font color="RED">--から行末まで</font>、または<font color="RED">/* */で囲われた部分</font>はコメントになります。
AccessのSQLにコメントは記述できませんが、当ツールではコメント部分を削除してから、データベースにSQLを渡すように対応しています。


## セル参照機能
SQLの中に{A1}や{Sheet1!A1}のように{}で囲んでセルのアドレスを記述すれば、{A1}の部分をA1セルの内容で置き換えます。
※{Sheet1<font color="Red">!</font>A1}　<font color="Red">$記号</font>ではありませんので注意ください
この機能を使えばこれから例にあげるような便利な使い方ができます。

### 1.サブクエリの記述
<font color="RED">**筆者の最もおすすめの機能です**</font>
下記の例のようにサブクエリ部分を独立したSQLで記述することができ、サブクエリ部分のSQLの単体での実行も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/fa5b44c3-efea-99ca-c921-c61e48c59d80.png)

### 2.パラメータの記述
レコードの抽出条件に特定のセルの値を使用することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/793a4c14-3329-52d1-be35-5741e112177d.png)

### 3.[データベース接続子]の記述
[データベース接続子]をセル参照とすることで、外部データを参照するSQLが簡潔に記述できるようになります。
使用例は下記「4.{MYPATH}について」の項を参照ください。
[データベース接続子]については、以下の記事を参照ください。

https://qiita.com/takahasinaoki/items/0a74542f650df1698ab5#%E5%A4%96%E9%83%A8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E6%8C%87%E5%AE%9A%E6%96%B9%E6%B3%95

### 4.{MYPATH}について
{MYPATH}と記述された箇所は、作業中のEXCELファイルの存在するフォルダのフルパスに置換されます。
[データベース接続子]の外部ファイルの記述時に必要に応じて使用すると便利です。
※大文字と小文字は区別されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/2b7afa02-a950-09ad-b4c1-ca07fc368fb4.png)

### 5.{MYSHEET}について
{MYSHEET}と記述された箇所は、SQLの記述されているシートの名称に置換されます。
※大文字と小文字は区別されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/e9793c53-45cb-a430-f7fa-b68d1ed97996.png)

### 6.複数行の選択
下記の例の様に複数行のセル範囲を指定することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/1a6311f9-7fc5-a409-a547-ea6ebcc1bf2a.png)

### 7.見出列の選択
下記の例の様に見出列のセル範囲（複数列のセル範囲）を指定した場合は、見出しの羅列としてSQLに展開します。
※空白セルは無視します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/fbe1db5c-cbf9-0f76-f841-678af9a6ce66.png)
具体的に{A1:C1}部分が展開されたSQLは以下の通りとなります。
※見出しがシートの1行目の場合は、{A:C}と簡潔に記述することも可能です

```SQL
SELECT [名前],[科目],[点数]
  FROM [Sheet1$A1:C5]
```

# ユーザー定義セル関数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/0b4d3709-a8bd-abf1-6a4c-8e31391c331d.png)

### 1.VALUEJOIN()関数
IN演算子の条件の羅列を想定して、セル範囲の各値を区切り文字で連結して返します。
#### 書式
=VALUEJOIN(両端文字, 区切り文字, 連結セル, ...)

#### 使用例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/9b51ad14-26d5-67ef-d206-9600f4947b07.png)

**両端文字**
例
"'"「シングルコート1文字の時」の時、'111','222','333'
"[]"の時、[111],[222],[333]
""の時、111,222,333

**区切り文字**
","など

**連結セル**
値を連結したいセル範囲を指定します（複数のセル範囲を指定可能です）
※空白セルは無視します

### 2.GetSQLRecordset()関数
SQLの実行結果をセル関数で表示します。
セル範囲を指定した配列数式形式(Ctrl+Shift+Enter)で取り出してください。
※スピルが使用できる環境であれば、通常のセル関数で表形式に展開されるはずです。
（筆者にはスピルが使用できる環境がないため確認できていません。ぜひスピルを実行された方はコメントお願いします）

#### 書式
=GetSQLRecordset(SQLの入力されたセル, 再計算のトリガーにしたいセルがあれば指定可, ...)

#### 使用例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/83ef08d1-77a9-888c-9d43-1f8f5d56ec33.png)

**SQLの入力されたセル**
SQLの入力されたセルを指定します。

**再計算のトリガーにしたいセル**
省略可です。
再計算のトリガーにしたいセルがある時のみ指定します。
個別セル または セル範囲を 必要に応じて複数指定することが出来ます。

### 3.ReplaceCellRef()関数
セル参照部分の置換とコメント削除後のSQL(データベースに渡すSQL)を表示します。
エラー時の原因究明などに利用ください。
※セルの書式設定で「折り返して全体を表示する」にチェックを入れて実行してください。

#### 書式
=ReplaceCellRef(SQLの入力されたセル)

# その他
EXCEL2007以前では、作業中のファイルのデータは実行結果に反映されないようです。
最新のデータを結果に反映したい場合は、作業中のファイルを1度保存してからSQLを実行してください。

# 関連記事

https://qiita.com/takahasinaoki/items/0a74542f650df1698ab5