satoの雑技術ノート

エクセルの写真帳票に簡単に写真を自動貼付できるようにするクラスモジュールを作りました

以前作った「エクセル写真帳」、割と好評でダウンロードされているようです。エクセル上で実際の写真を見ながらJPEGファイル名を一発で変えられる「エクセルJPEGリネーマ」と一緒に使うとより便利になります。

エクセル写真帳 ver5.3 ダウンロードページ(Vector)

エクセルJPEGリネーマ ver1.0

今回はエクセル写真帳の話ではなく「エクセル写真帳から必要と思われる機能を抜き出し、クラスモジュールにまとめたものを作りました」という話です。具体的に以下のような場面で活躍します。

2018年4月13日 追記
このクラスの改良版(ver2.0)を作成しました。
誰でも簡単に導入、調整ができるように改良しています。以下の記事で紹介、ダウンロードできます。

どちらの場合でも、帳票に合わせて写真貼付マクロを組むことは可能です。が、新規でマクロを組むのは割と時間がかかるというのと、多くの場合、こうして作成したマクロはその時しか使われないので、マクロ作成効果が薄れてしまうデメリットがあります。

マクロ作成効果について

上記、写真貼付を例にすると、100枚の写真をシートに手作業で貼り付けて一つ一つリサイズしていく作業が2時間で終わるとして、同じことをマクロでやろうとすると、そもそもマクロを組むのに3時間くらいかかるようなとき、マクロ作成効果は薄いと思われる。

しかし、2時間で終わる仕事を3時間かけてやることは非効率だけれども、後日そのシートを使って同じ作業をする場合を想定すると、合計4時間かかる仕事を3時間で終わらせることができるので、この場合はマクロ作成効果が高いと思われる。

同じような作業がその後もたくさんあると想定される場合にマクロの効果は絶大になる

事実、前記したエクセル写真帳やJPEGリネーマは自分も仕事で使っていて、これを作ることに尽くした時間はトータルで何十時間もあるかもしれないけれど、これ作ってからの写真帳整理はわずか数分で終わっていて、これから先も一生数分で終わることが約束されています。

ですが、これはあくまでも自分で作った帳票で出す場合の話であって、人(他社など)からもらった帳票で作成しなければならない場合、マクロが入っていなければ手作業で作業しなければならない。これは恐ろしいことです。
一度楽を覚えてしまうと、手作業で1枚ずつ写真を貼り付ける、なんてバカらしくてやる気にすらならないのです。

そこで他社からもらった帳票にどうにかしてエクセル写真帳の機能を盛り込めないだろうか、ということから今回クラスモジュール化することを考え付きました。前置きが長くてごめんなさい。これからが本題です。

スポンサーリンク

エクセルの写真帳票に簡単に写真を自動貼付できるようにするクラスモジュール

下準備

写真帳となるExcelのひな形を準備してください。以下のサンプルにあるような、縦に写真が並ぶごく一般的な帳票に対応しています。

サンプル帳票

あらかじめこの帳票はコピーして大量にページを作っておいてください。1ページ目と2ページ目で行や列が違ったりなんかするとうまく貼付できないので、行と列の相対的な位置関係は他のページでも必ず1ページ目と同じにしてください。

クラスモジュールを以下よりダウンロードします。ファイルはzip形式なので解凍して中身(SetPictures.cls)を取り出してください。

クラスモジュールをダウンロード

クラスモジュールをインポート

ダウンロードしたクラスモジュール(ファイル名:SetPictures.cls)をお使いの写真帳内にインポートします。Excelを起動後、「Alt+F11」キーを押してVBE(Visual Basic Editor)を立ち上げます。VBEはVBA(マクロ)の操作をするためのエディタでエクセルに標準で搭載されています。

VBEが立ち上がったら画面左側にあるプロジェクトウィンドウ内のエクセルファイル名がカッコ書きで書いてある部分を右クリック→「ファイルのインポート」をクリックします。

SetPictures.clsを選択してインポートすると、プロジェクトウィンドウ内にクラスモジュールが追加されます。

標準モジュールを作ります

クラスモジュールのインポートと同じく、右クリックより「挿入」→「標準モジュール」を選択します。

クラスをインスタンス化します

追加したModule1をダブルクリックしてコード入力部分(VBE右側の部分)に以下のコードを丸ごとコピー&ペーストしてください。

[vb]
Sub setpicture()

Dim sp As New SetPictures

Call sp.setpicture(51, 9, 2, 2, 3, 17, 360, 270)

End Sub

[/vb]

クラス内のsetpictureプロシージャに8つの引数を設定

クラスをインスタンス化してsetpictureプロシージャに8つの引数を与えてあげます。コードの5行目()内のカンマ区切りの8つの数字が引数です。すでにデフォルトで引数が設定されています。この引数はお使いの写真帳ごとに異なるので正しい値を入力してください。以下は8つの引数の説明です。

  1. 1ページの行数
  2. 1ページの列数
  3. 1枚目の写真を貼る位置(行)
  4. 1枚目の写真を貼る位置(列)
  5. 1ページ内の写真枚数
  6. 1枚目写真と2枚目写真の間隔(行)
  7. 写真の横幅(ポイント)
  8. 写真の縦幅(ポイント)

画像の大きさ(ポイント)の考え方

1ポイントの大きさが1/72インチです。1インチは25.4mmなので、計算上、1ポイントあたり「25.4 / 72」mmになります。エクセル上で横10cmの画像を貼りたい場合は以下計算によりポイント数を算出できます。

100mm / (25.4mm / 72インチ) = 283ポイント

マクロsetpicture()を実行

すべての引数を設定したら「Alt+F8」キーを押してsetpicture()を実行します。マクロを実行して写真データのあるフォルダを指定するとフォルダ内の写真が一気にエクセルシート上に貼り付きます。




まとめ

うまく使えましたか?

元々は自分用ですし、そもそもクラスモジュールの使い方が果たしてこれで良いのかどうか正直わかりません。僕が作るVBAのプログラムは100%ネットで得た知識で構成されています。所詮はド素人なんです。

もう少しスマートで便利なやり方があるかもしれません。VBAに詳しい方、本業の方、がもしこの記事をご覧になりましたら、他に何かいい方法とかあればどんどん教えて頂ければありがたいです。

モバイルバージョンを終了