【illustrator】Excel データを Illustrator に流し込むツールを作ったよ

この記事は、Excel (エクセル)のデータを Adobe Illustrator (イラストレーター)に流し込むExcelマクロを配布・紹介する記事です。
(開発者の環境：Windows 10, Excel 2019, Illustrator CS6, 一部の機能はCS2でも確認)

#Illustratorで商品のPOP作り
店頭で物を売っていると2つのツールを使います

・Excel → 在庫・価格・スペックの管理
・Adobe Illustrator → 価格や説明のPOP作成

で、これが大変。

店長:「あれと、これと、その商品もPOP頼むよ！」
店長:「あれの価格、変えてくれ！」
(電話は鳴り……、レジ待ちは列ができ……、見積書メールの返信しなきゃ……)

商品が増えるとExcelデータをIllustratorに**コピペする作業で接客の時間を失います**。
そしてコピペを**ミスしていると、お客様からのクレームに発展します**。
たび重なる価格の変更で**作成済みのPOPとExcelデータが一致しなくなっていきます**。

この膨大なPOP・カタログ・名刺の作成を、Excelマクロで完了させましょう。

#何ができるの？

こんなイメージです
![ExcelAi概要図1368x1216.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441999/e5774602-89e0-5d79-e43b-2ffe4ead29e4.jpeg)

配布のExcelファイルに商品などの**データを記入**します。

Excelファイルに付随するマクロを実行すると Adobe Illustrator を自動で操作します。
マクロは雛形(テンプレート)として用意したIllustratorファイルを開き、**Excelの各行(レコード)の数値や文字列や画像URLを元に、illustrator上のテキストフレーム文字列や配置画像のリンクを置き換え**ていきます。

自動操作が終わると**PDFファイルとして別名保存**します。

#ダウンロード
ExcelAi.xlsm がプログラム本体です。
同梱のサンプルテンプレートは互換性のためCS2形式になってます。

| リリース日 | バージョン | ダウンロード | 開発メモ |
|:-:|:-:|:-:|:-:|
| 2021-04-24 | v16(Beta) | [release_v16.zip](https://www.dropbox.com/s/fvfa45hbu467jg2/release_v16.zip?dl=1)(1,425KB) | 内部の配列処理のバグを修正 |
| 2020-10-24 | v14(Beta) | [release_v14.zip](https://www.dropbox.com/s/fg61esrb6hr6jew/release_v14.zip?dl=1)(1,407KB) | 流し込みダミーの数に関する警告を削除 |


#使い方
■ データを流し込む

サンプルデータを使ってためしてみましょう。

1. ExcelAi.xlsm を開きます。
2. データのある任意のセル範囲を選択し **[Ctrl] + [ T ] キーでメニューが開きます**。
3. [テンプレート]>[選択] ボタンを押し、流し込むテンプレート .ai または .pdf を指定して [OK] ボタンを押します。

■ テンプレートをつくる
※テンプレートの作成はAdobe Illustrator の基本操作がわかる方向けです。

メモ帳の「置き換え」と同じしくみです。
「 __\*__ラベル__\*__ 」のように「__\*__」で囲われた文字列を含むテキストオブジェクトは、エクセルの値に置き換わります。

[【illustrator】テンプレートをつくるには？【ExcelAi】](https://qiita.com/kawamasa/private/2845df20131d5e0cc79b)に詳しい仕組みとチュートリアルがあります。

#FAQ
##Q. [Ctrl] + [T]を押しても反応しないのですが？
A. 開いたときにセキュリティの警告がでたら**[コンテンツの有効化]**していますか？
していなかった場合はExceAiを一度閉じて再度開き直し、(インターネットで配布されているプログラムのリスクを承知の上で)有効化してください。
{開発タブ}>[マクロ]>[btn_ai_pour]を選んで[実行]を押して手動で実行できるか確認してください。
手動で実行できる場合で、[Ctrl] + [T]が効かない場合は、他のプログラムのショートカット割り当てられているかもしれません。{開発タブ}>[マクロ]>[btn_ai_pour]を選択状態にし[オプション]を押して競合しない任意のショートカットを割り当ててください。

##Q.「illustratorを起動しています……」「処理を開始します……」から進まないのですが？
A1. illustrator側で**画像のリンク切れ警告画面・ファイルのバージョン違いの警告画面が出ていたり、メールアドレス登録の案内画面(CS2など)が出ている**と、**マクロの処理はストップ**してしまいます。
画像のリンクが切れていないテンプレートやバージョン違いを修正したテンプレートを用意するか、流し込みのたびに illustrator側の警告画面や登録画面を手作業で進めていって、illustratorの画面を選択ツール等の使用が可能な状態にしてください。「レイヤーの初期状態を記録」し始めたら正常に動いています。

A2. お使いのPCには **32bit と 64bit の2つの illustrator が存在しているかも**しれません。
レジストリ上に「こっちがデフォルトのillustratorだよ」という値があり、マクロはその illustrator を操作しにいきます。
64bitのillustratorが起動された状態でマクロが32bitのillustratorを操作しにいくと、処理はストップしてしまいます。たとえるなら、右ハンドルの車と左ハンドルの車をもっていて、必ず右側座席に乗る運転手が、適当に停めてあった車に乗ったところ左ハンドルだったという状態です。**起動中の illustrator を終了した状態から流し込みをしてみてください**。適切な illustrator が自動で起動します。

##Q. 複数のバージョンの Adobe illustrator を使えますか？
A. **使えます**。
[Ctrl] + [T]キーを押し、[詳細設定]>{一般タブ} に使いたいバージョンを明示的に指定できる欄があります。
プルダウンになければ、「CS3」や「CC.2019」などと手入力できます。
(「CC.2020」内部的には「.24」として扱われていたりと、内部的なバージョンがまちまちなので調べるべし)
ともかく、試す価値はあります。

##Q. 出力ファイル名を変えられないの？
A. **変えられます**。
[Ctrl] + [T]キーを押し、[詳細設定]>{ファイルの指定タブ}>[ファイル名プリフィックス]を編集します。
・流し込んだレコードの「商品名」や「価格」などは　\<\> で囲い、 \<商品名\>, \<価格\> など \<"ラベル"\> の形式
・流し込んだ日付や時間は \<date\> や\<time\>
・流し込みデータのあるシートの名前は \<sheet\>
・流し込んだテンプレートの名前は \<template\>
と表現して指示しておくと、出力時に適宜ファイル名が変化します。

##Q. 「リンク切れの画像は想定していません」エラーが出た
A. 画像のリンクが切れていないテンプレート用意してください。
直すには途中停止したテンプレートドキュメントは念のため一旦閉じて、再度テンプレートファイルを手動で開きます。
**画像のリンクを再設定して上書き保存しておけば、マクロがテンプレートを開くときもリンク切れしていない**でしょう。
または、マクロがテンプレートを開くたびに「○○というリンクファイルが見つかりません」という警告を無視しないで、手作業でリンクを再設定する方法もあります。(この方法は非常に手間です)

##Q. 画像のリンク切れを起こさないコツはありますか？
A. 一般論として**.aiファイルと同じフォルダ階層に画像ファイルを保管する**とリンクは切れません。
illustrator **CC 以降では .ai のある階層に「Links」フォルダを作成し、その中に画像ファイルを保管しても切れない**かもです。(環境がないため検証弱い)
これらは、リンクの切れたファイルを自動で探す Adobe Illustrator の仕様による補完です。

##Q. 差し替え画像の背景を自動で透明にできる？
A. **できません**。
ローカルにダウンロードして手作業で切り抜き。そのローカル画像のパスをExcelに入力して流し込むしかないのでは？
と思います。しかし、ダウンロード画像が**.png形式なら逆転の発想**もあります。
流し込み出力後に、自動ダウンロードされた画像ファイルの背景を切り抜ぬき上書き保存。
出力ファイルをillustratorで再度開くと画像リンクはそのまま、切り抜いた画像を呼び出すのでは？と思います。(未検証)

##Q. 画像のダウンロードは出来ているが、illustratorに配置できないエラーが出た
A. 一般論として「.jpg」などの拡張子であっても**画像ファイルによってはillustratorに配置できないものがしばしば存在します**。手作業でillustratorにその画像が配置できるかをチェックしてみてください。データに問題のある画像はPhotoshopで開いて解像度を適正にして、保存しなおすと配置できることが多かったです。

##Q. 埋め込み画像は置き換えられる？
A. **置き換えられません**。
埋め込み画像(RasterItem)を取り扱う際、内部的にユニークなキーとして扱えそうなものがなかったため、
複数レコードの流し込み時に、順番を割り振ることができないのが原因です。

##Q. 何かがエラーだが、とりあえず急ぎで動かしたい
A. **{詳細設定}>{バグ回避}タブを使ってみてください。**
エラーの原因として疑わしい機能をひとつずつ無効にして実行する。結果が完全でなくとも、出力を完了できる場合があります。不完全な部分がないか入念にチェックし、問題点は手作業で修正してください。ご不便おかけして申し訳ございません。

##Q. テンプレートの名前に含まれる [1] とか [12] ってのはなに？
A. ひとつのテンプレートあたりに流し込むデータの**レコードの数量(行の数量)**です。
テンプレートを制作する方の任意です。

<details><summary>【説明】テンプレート名の[1]や[12]など</summary>
![テンプレートの[1][12]の説明_1368x1396.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441999/85b47f3e-8cde-7a09-fa38-1dcdca5ebb5f.jpeg)
マクロの処理内部では、テンプレート上に繰り返し出現するテキストフレームと配置画像の数量をカウントし、どのレコードをどのフレームに納めるべきか対応表を作っています。**明白な問題があると警告が出てマクロの処理をストップします**。
</details>

##Q. 各オブジェクトの配置位置と、Excelの各レコードの流し込み先の位置・順序の関係は？
A. 相対位置が**左上から右下**方向へ各レコードを流し込みます。文字で図示すると
　　1 　2　 3
　　4 　5 　6
　　7 　8 　9
　　10　11…… 　　となります

<details><summary>【説明】流し込み順序</summary>
厳密にはバンディングボックス(選択ツールで選択したときの枠)の左上の点を
そのオブジェクトの位置と定義しています。
点の相対位置が
　1. 上側にある
　2. 左側にある
　3. 右側にある
　4. 下側にある
オブジェクトを優先して流し込みの順番が割り振られます。
</details>

##Q. 流し込み先の位置・順序が間違って流し込まれるのですが？
A. 配置オブジェクト同士の相対位置が**厳密に水平(または垂直)になるように複製し直して**ください
複製したオブジェクトが横並びにあるように画面に映っていても、厳密な位置情報の数値が**0.01mmでも上側にあるオブジェクトに1番目のレコードが流し込まれます**。

<details><summary>【TIPS】 厳密に水平になるように複製する方法</summary>
Adobe Illustrator で一般的にもよく使うので覚えておきましょう。
・選択ツールでオブジェクトを選択状態にする。
・[Alt] + [Shift]キー押下状態でそのオブジェクトをドラッグ＆ドロップ(水平・垂直にコピー)
・[Ctrl] + [D] キーを任意の回数叩く(同じ作業を繰り返し)
</details>

##Q. アートボード上の配置位置と各レコードの流し込み先(順番の方向)は変えられないのですか？
A. アートボードの右上から左下方向へなどの順番でレコードを流し込むことはできません。
需要が高まればそのようなオプションを設けます。どんな使用シーンで必要になったか、ぜひ教えてください。

##Q. Excelのテーブルが流し込みの際に正しく認識されていないのですが？
A. エクセル上で取り扱っているデータや表からはみ出た**メモ書きや残りかすのセルがあったら列や行ごと削除して**みてください。
**ヘッダ行(ラベル行)は隙間のないよう**にラベル(項目名・列名)をつけてセルを埋めてみてください。
一見してヘッダ行とわかるように、**周りと違う背景色をつけて**みてください。
エクセルの非表示やグループ化等の機能を**できるだけシンプルな状態**に近づけてみてください。

##Q. Excel上の表やデータは、どうやってテーブルの ラベル と 値 を識別しているのですか？
A. 特性と統計です。
ラベル行に特有の性質を次の3点とし、各主張の多数決で決定しています。
・データの密度が最も高い
・データ形式(文字列or数値)の対比が強い
・背景色の変量の偏差が高い
多数決で決定しなかった場合、"データの密度が最も高い"行をラベルの行と定義します。

##Q. テキストフレームが流し込み後に横に長くなってしまうのを自動で短く調整できますか？
A. 自動で**幅を縮小することならできます**。
テンプレートを編集します。流し込みであふれてしまうと想定されるテキストフレームの周りに、許容する最大サイズを四角パス(塗り色なし/線色なし)で描きます。**四角パスとテキストフレームとグループ化し**ます。
レイヤーパネルから**グループ名を max-width または align-center に設定**します。
綴りなどにミスがなければ、テキストフレームのサイズが最大サイズからあふれたとき幅を縮小します。

・max-width は、縮小のみ行います。テキストフレームの左揃え・右揃えを保持したいときに使います。
・align-center は、縮小後にテキストフレームの位置を水平方向中央に移動します。どんなテキストも見た目上は中央揃えに強制します。
・［詳細設定］>{テキストの置き換え}>[縦横比を維持してテキストを拡縮する] のチェックを外すと、文字の背丈を保ったまま幅のみ縮小されます。

##Q. Excelのレコード内容に応じて、条件分岐してオブジェクトの位置を自動で移動できる？
A. **できません**。
条件分岐でレイヤーの表示/非表示にすることはできますので、この機能の応用でしばしば解決できます。
テンプレートの編集時に、**位置の違う複製オブジェクトを作成し**、位置の違うオブジェクトの**レイヤーを分ける**。
レイヤー名を show(条件式) や hide(条件式) などすることで**レイヤーの表示/非表示が自動で変更されます**。
そうすると、ある条件下ではパターンAの位置。別の条件下ではパターンBの位置。という2パターンの見え方をするテンプレートになります。
あなたのやりたいことは実質できるのではないでしょうか？

##Q. Excelのレコード内容に応じて、条件分岐してレイヤーの表示/非表示を自動で変更できる？
A. **できます**。
レイヤー名を show(条件式) や hide(条件式) などすることで**レイヤーの表示/非表示が自動で変更されます**。
これを使うとテンプレートの柔軟性が格段に増します。

<details><summary>【TIPS】レイヤーの表示/非表示を自動で変更</summary>
■レイヤー名に条件式を含むと、流し込みデータに応じてレイヤーを表示させたり、非表示にさせたりすることができる
　show(条件式)……条件式が真値のとき、レイヤーを表示状態にする
　hide(条件式)……条件式が真値のとき、レイヤーを非表示状態にする
　
■条件式に使用可能な演算子
　==  ……イコールイコール:完全一致。
　!=   ……ノットイコール:完全一致ではない(完全一致の補集合)。
　like  ……ライク:部分一致。*アスタリスク:0個以上の任意の文字。#シャープ:1文字の数値(0～9)。?はてな:任意の1文字と表現。
　not_like  ……ノットアンダーバーライク:部分一致すらなし(部分一致の補集合)。
　例) show(商品名 like \*ねぎ\*)
 　　 → 商品名が"ねぎ"や"たまねぎ"のときレイヤーを表示する。"にんじん"のときは反応しない。(テンプレートの初期状態まま)
　
■複数の条件式の組み合わせ
　AND アンド と OR オア を使って、複数の条件式を連結できます。  show(条件式 AND 条件式) という形式。
　例) show( 商品名 like \*ねぎ\* AND 産地 like \*千葉県\*)
　　 → 産地が"千葉県"の"ねぎ"や"たまねぎ"はレイヤーを表示する。産地が"埼玉県"の"たまねぎ"や産地が"千葉県"の"じゃがいも"は反応しない。
　
■以下は使用できない
　<, >……大小記号, =……イコール, +, -……加算減算
</details>

##Q. バーコードって使える？
A. **JANコードのみ**使えます
数字13桁のJANコードのみ使える。他の方が作ってくださった **=JAN() 関数**を用意しました。
バーコードを使いこなすにはちょっと手間ですが下記を理解する必要があります。
###Excelでバーコードを表示するには？
例えば、A1セルに「4948872415026」とJANコード入っているとします。
① 適当なセルに**「=JAN(A1)」と入れると**「X9E88HCKPMQLNRZ」という**計算結果が返ってきます**。
②「X9E88HCKPMQLNRZ」と表示されているセルの書式を**"JANCODE-nicotan"フォント**(ダウンロード先は後述)に変更すると
下の画像のようなバーコードで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441999/b5bbcef7-c1a3-8448-0c42-d99028d3fbef.png)
<details><summary>【ダウンロード】JANCODE-nicotan フォント</summary>
[JANCODE-nicotan フォントダウンロード](http://nicotan.at-ninja.jp/blog/jancode_font_download.html)
[JANCODE-nicotan 説明(公式)](http://nicotan.at-ninja.jp/blog/jancode_excel_download.html)
</details>

<details><summary>【TIPS】JANコード=数字13ケタの運用上の注意</summary>
私見ですがJANコードの取り扱いは次の2点注意を払っています
・数字13ケタの書式設定は **文字列** で運用する[^1]
・数字13ケタを入力するとき、コピペで**空白スペースや改行コードが前後に混じらないよう注意する**
これによって=JAN(参照セル)でバーコードが表示されないトラブルを解決できることがあります。
</details>

[^1]: 書式設定：ユーザー定義"0000000000000"は=JAN(参照先)が反応しない。また、チェックデジット側が欠落したコピペで事故になる。書式設定：数値では先頭0が消えるので論外。

###illustratorにバーコードを流し込むには？
「=JAN(参照セル)」の計算結果である謎の文字列。たとえば「X9E88HCKPMQLNRZ」のような
**謎の文字列は"JANCODE-nicotan"フォントで見るとバーコードなのです**。
<img width=80% alt="バーコードのフォントを適用する.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441999/06965f05-3a0e-ce67-0704-4a94fcd0ddd6.png">
だから、illustratorにバーコードを流し込む場合は
① illustrator でテキストフレーム「\*バーコード\*」を作成し
② 作成した**「\*バーコード\*」に"JANCODE-nicotan"フォントを適用して**「テンプレート.ai」として保存する。
③ ExcelAi で「バーコード」列の「X9E88HCKPMQLNRZ」という文字列をテンプレートに流し込めばillustrator 上にバーコードを作成できます。

こんなイメージです
<img width=80% alt="バーコードの流し込み" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441999/382acca4-a021-6f6c-cb51-ddd0e887b1e3.png">

#現在の開発状況

・運用＆デバッグしてバグを蓄積している。修正は随時。
・Qiita でユーザードキュメントを充実させている (2020-09-29 チュートリアル完成)

Excel のデータを Adobe Illustrator に流し込むExcelマクロの紹介記事は以上です。