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

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

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

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

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

  • 下請けで、元請けから指示されたExcel写真帳票で写真帳を作らなければならないとき
  • その場のノリでExcelで作った写真帳票にサクッと一発貼付したいとき

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

マクロ作成効果について

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

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

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

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

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

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

スポンサーリンク

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

下準備

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

サンプル帳票
excel_album

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

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

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

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

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

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

excel_class001

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

excel_class002

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

excel_class003

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

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

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

Sub setpicture()

    Dim sp As New SetPictures

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

End Sub

excel_class004

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

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

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

excel_class005_1

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

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

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

マクロsetpicture()を実行

excel_class006

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




まとめ

うまく使えましたか?

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

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

スポンサーリンク
  • このエントリーをはてなブックマークに追加

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

  1. 名前:mapao 投稿日:2014/10/06(月) 23:53:06 ID:c2757e247 返信

    はじめまして。エクセル初心者なのですが
    私も切羽詰っていて
    ご質問をさせて頂きたいと思います。

    ご紹介頂いたような写真台帳(現場台帳)を作成するように
    命じられたのですが

    A4で横向きで写真が4枚貼りたいのです。
    エクセル初心者ですので
    何を参考にしていいのかすらわかりません。

    もしよければご教授頂けないでしょうか?

    よろしくお願い致します。

    • sato001 名前:sato001 投稿日:2014/10/07(火) 19:32:16 ID:583efa0d4 返信

      mapao さま。
      基本的に、ブログ記事にあるような配列の帳票で、縦に並ぶ4枚帳票であればこのクラスを利用できるとは思います。
      もし宜しければ実際の帳票をlopspve@gmail.comまでメールして頂ければこちらで判断はできますが、最低限のエクセルの知識はないと厳しいかもしれません。

  2. 名前:mapao 投稿日:2014/10/07(火) 23:01:13 ID:4534d2084 返信

    早速のご返答ありがとうございます!

    初心者レベルには難しいですね(泣)

    最低限の知識も無いので
    (マクロについては皆無)

    送付出来ませんが、

    お心遣いに感謝致します。

    なんとか探して頑張ってみます。

    ありがとうございました。

    • sato001 名前:sato001 投稿日:2014/10/07(火) 23:13:55 ID:583efa0d4 返信

      mapao さま。
      せっかくコメントいただいたのにお役に立てなくてごめんなさい。
      エクセルは慣れないうちは難しいですけど、諦めずにがんばってください。

  3. 名前:KOBA 投稿日:2014/11/25(火) 15:30:56 ID:bf72a1835 返信

    はじめまして。写真自動貼り付けクラスモジュ-ルを使わせていただきました。
    すばらしいですね。
    そこで、教えていただきたいのですが現状は写真デ-タが順番に貼り付くようですが
    写真のファイル名を指定して貼り付けるマクロは簡単にできるのでしょか。

    • sato001 名前:sato001 投稿日:2014/11/25(火) 17:14:59 ID:60a8e32ab 返信

      KOBA さま。
      貼り付けモジュール使っていただいてありがとうございます。
      あれは実は仕事で必要に迫られてサササと作ったものなので、単純に順番に貼り付ける機能しか実装していないのです。

      写真のファイル名を指定して貼り付けることはマクロで実現可能ですが、アレコレと手を加えなければならないため簡単にはできません。
      そのうち時間があったらクラスモジュールを改良してみようかなと思います。

  4. 名前:KOBA 投稿日:2014/11/26(水) 15:00:57 ID:c98c4e2b5 返信

    ご回答ありがとうございます。
    すみませんもう一度お聞きしたいのですが
    貼り付けモジュウ-ル使用させていただいてるのですが
    写真以外の図とかマクロのスイッチボタンをシ-ト内に貼り付けていますが
    実行するとその図とボタンも削除されてしまいます。
    ある行までの図やボタンは削除されないように修正できるのでしょうか?
    教えてください。よろしくお願いいたします。

    • sato001 名前:sato001 投稿日:2014/11/26(水) 17:03:32 ID:2284424d1 返信

      KOBA さま。
      クラスモジュール内の「DeletePic()」というプロシージャが悪さをしている原因です。
      これは写真の貼り付け前にシート上の全てのシェイプを削除する処理です。

      このプロシージャを以下のコードにまるごと書き換えてください。

      ‘********************************************

      ‘ 画像データの削除

      ‘********************************************

      Private Sub DeletePic()

      Dim oShape As Shape

      For Each oShape In ActiveSheet.Shapes
      If oShape.Type = msoPicture Then
      oShape.Delete
      End If
      Next

      End Sub

      途中でif分岐によりシェイプタイプをPictureかどうかを判断して削除する処理に変更しています。
      これでマクロボタンなどは削除されなくなりますが、写真以外の図も削除されてしまう可能性もあります。

      それ以外の図を残したい場合にはシェイプの位置をLeftなどで取得して、写真帳票の列内かどうか判断させることで削除を除外させることは可能です。

      また、別の方法として「DeletePic」自体を呼ばないことで強引に解決はできます。
      その場合にはsetpictureプロシージャ内の「Call DeletePic」の部分をコメントアウト(行頭に「’」をつける)してください。
      これで画像が削除されなくなります。

  5. 名前:KOBA 投稿日:2014/11/26(水) 18:14:33 ID:c98c4e2b5 返信

    SATO001様 ありがとうございます。
    画像デ-タの削除を見ていてここをどうにか直せばと考えていましたところ
    ご回答いただきありがとうございます。
    試してみました。やはり図は写真と一緒に消えてしまいました。
    マクロボタンは残りましたので、また考えて見ます。
    お手数かけました。

  6. 名前:KOBA 投稿日:2014/11/28(金) 17:03:22 ID:0fbe7d8cb 返信

    SATO001様 またひとつ教えてほしいのですが
    写真は貼り付けたい順番に、ファイル名を連番で付けましたが
    その順番とおりに貼りつかなくなってしまいました。
    よく貼りついた写真を見ますと写真の名前が例でいいますと「図12」と名前が
    付いてますが、この名前の順番に貼りついて変わってしまいます。
    ファイル名とおりの順番に修正はできないのでしょうか?
    すみませんが、教えていただけないでしょうか。

    よろしくお願いいたします。

  7. 名前:ぷし 投稿日:2015/02/14(土) 17:12:19 ID:33bc14775 返信

    はじめまして。
    クラスモジュールを使わせていただきました。
    感動でした。ありがとうございます。

    vba初心者で恐縮なのですが、
    貼りつけた画像ファイルのファイル名が
    画像の下に表示されるようにはできますでしょうか。
    よろしければお教えください。

    • sato001 名前:sato001 投稿日:2015/02/14(土) 22:41:58 ID:2bdf9c0c5 返信

      ぷし さま。
      Private Sub processing_setpicture(…)
      の処理が実際に画像を貼り付けを担当しています。

      例えばこのプロシージャ内の
      ActiveSheet.Shapes.AddPicture ・・・

      の次の行に、貼り付け位置からのオフセットなどでファイル名を入力するように処理を追加してみてはいかかでしょうか。

  8. 名前:chon 投稿日:2015/02/26(木) 11:58:27 ID:ac89e578a 返信

    クラスモジュールをダウンロードして解凍しましたら、setpictureが
    ひらけないのですが・・
    このファイルを開くにはそのためのプログラムが必要です・・・・
    とでます。
    どうして使えないのでしょうか?

    • sato001 名前:sato001 投稿日:2015/02/26(木) 12:51:11 ID:00b2c2310 返信

      chon さま。
      クラスモジュールはそのままで開ける形式ではありません。
      「エクセルで作られた既存の写真帳」がある場合に、そこに自動貼り付け機能を追加させるためのマクロのひな形です。

      「すでにお使いのエクセルの写真帳があること」が前提です。

      ブログ記事でも紹介していますが、エクセルファイルのVBE内にインポートして使います。
      お手数ですが、もう一度、ブログ記事を参照してみてください。
      http://sato001.com/excel-setpictures-class

  9. 名前:kazu 投稿日:2015/06/02(火) 15:26:43 ID:8c29cf806 返信

    はじめまして。
    クラスモジュールを使わせていただきました。
    こんなに素晴らしい機能があるとは感動でした。
    仕事で重宝しています。ありがとうございました。

    VBA初心者なのですが、できれば画像を2×2
    (A4横に4枚)で貼れるようにしたいのですが
    可能でしょうか?

    宜しければご教授お願いいたします。

    • sato001 名前:sato001 投稿日:2015/06/03(水) 06:20:43 ID:d1342c1e4 返信

      kazu さま。
      コメントありがとうございます。
      使っていただいてるんですね。なんだか恐縮です。
      僕もVBAに関して、初心者に毛が生えたようなものなので、人にものを教えるなんて偉そうなことはできません。
      ただ、2×2の4枚帳票も工夫次第でできると思いますよ。
      個人的には、貼り付け処理を横2枚で1セットとしてループさせればいけるような気はしますが。

      • 名前:kazu 投稿日:2015/06/03(水) 08:13:11 ID:dfe62d43c 返信

        sato001様
        ご回答ありがとうございました。
        貼り付け処理を横2枚で1セットというのは、クラスモジュールを編集するのでしょうか?それとも標準モジュールのほうを編集するのでしょうか?初心者な質問で大変申し訳ないですが、ご回答いただけると助かります。

        • sato001 名前:sato001 投稿日:2015/06/03(水) 23:48:38 ID:d1342c1e4 返信

          kazu さま。
          僕が作ったクラスモジュールを例にいうなら、クラスモジュール側の話です。
          標準モジュールはあくまでもクラスを実体化して、あらかじめ登録されている処理に必要な数字を渡して呼び出しているだけなのです。
          呼び出される処理の部分を書き換えることで、まったく別の処理にします。

          • 名前:kazu 投稿日:2015/06/04(木) 08:20:11 ID:a59f37e38

            sato001様
            ご回答ありがとうございました。
            sato001様のアドバイスをご参考にさせて
            頂き、自分でやってみます。
            色々とありがとうございました。
            また躓いてしまったら、宜しければアドバイスを
            よろしくお願いいたします。
            お時間を割いて頂いて、誠にありがとうございました。

  10. 名前:ぷりん 投稿日:2015/08/04(火) 14:48:00 ID:0b5eee31e 返信

    初めまして。
    私は大量にある毛糸を写真と糸の詳細を記して一括管理できるものはないかと探してたどり着きました。
    エクセルのタブを使ってメーカーごとや、色や糸の太さごとに管理できそうで嬉しいです。
    エクセルは大好きですが、あまり難しい事は出来ません。そんな私でも直感で使えそうな本当に有りがたいソフトです。
    写真の横にコメントを書く欄がある、1つのタブで好きなだけページを増やせる。正に私が捜していたソフトです。
    自分では絶対作れませんし、このような便利なソフトを作って下さった作者様に感謝の気持ちで一杯です。
    ありがとうございました。
    これから目いっぱい活用させていただきたいと思っています。

    • sato001 名前:sato001 投稿日:2015/08/04(火) 15:05:49 ID:151341cfa 返信

      ぷりん さま。
      コメントありがとうございます。
      そんなに気に入っていただけてこちらとしても光栄です。
      よろこびのコメントがなにより一番励みになります。
      ほんと作って良かったと思います。
      ありがとうございました。

      ただ、一つ、このソフトの弱点として、写真サイズが重かったり、大量だったりした場合、タブを増やしすぎるとデータ自体が重くなるという欠点があります。
      大量の写真で動きが重たくなったら、エクセル写真帳自体を新規でコピーしてやりくりしてください。

  11. 名前:ぷりん 投稿日:2015/08/04(火) 15:12:41 ID:0b5eee31e 返信

    sato001様

    ご返信ありがとうございました。
    了解いたしました。写真もなるべく小さくして、それでも負担が大きくなったら新たな写真帳をつくるなど、対応してみます。
    エクセルで写真管理が出来、コメントも書けて、尚且つ簡単に使える、ありそうでなかなかないんですよね。
    ずっと探していたんですが、あきらめなくて良かったです。
    本当にありがとうございました。

  12. 名前:ダルトン 投稿日:2015/09/16(水) 12:10:22 ID:4b577acb0 返信

    こんにちは
    工事写真でA4縦用紙に6枚の写真を貼り付けるマクロを組みたいのですが
    どうしてもできません。
    通常工事写真のように左側3枚の写真貼付。ボタンで指定セルへの貼付マクロは完成しています。
    ご教授願います。

    • sato001 名前:sato001 投稿日:2015/09/17(木) 00:16:06 ID:5f194d873 返信

      ダルトン さま。
      コメントありがとうございます。
      僕はこれまで作ったものは、すべてがネットの情報を見ながら作っていて、本できちんと勉強したものでもないですし、ちゃんとした教育も受けていなければ、そういったセミナー的なものに出たこともすらありません。
      事実、自分でも作りながらよくわかっていない時もあります。
      ド素人が、ド素人なりに泥臭いコードを書いているにすぎないのです。
      なので、僕はそもそも偉そうに人にものを教えられるほどの人間ではないです。
      ごめんなさい。

  13. 名前:ゴース 投稿日:2016/07/04(月) 21:18:15 ID:8baede14e 返信

    はじめまして。
    クラスモジュールを使わせていただいています。
    探していたものが見つかって とても喜んでいます。
    ありがとうございます。

    A4縦に写真3枚 配置しているのですが、ページが進むにつれ写真が枠からズレてしまって困っています。
    8つの引数 間違っていないとおもうのですが
    できましたら いま使っている写真帳みていただけないでしょうか。

    また解凍するとき?にモジュール内の日本語がすべて文字化けしてしまって
    (日本版Windowsではないため?素人ですいません)
    できましたら英語で表示していただくなど可能でしょうか?

    • sato001 名前:sato001 投稿日:2016/07/04(月) 21:28:47 ID:f1ca5de78 返信

      ゴース さま。
      コメントありがとうございます。
      枠からズレるのは実際に見てみないとなんともいえないです。
      可能であれば、写真を貼り付けた状態で lopspve@gmail.com までエクセルデータを添付いただけますか。
      よろしくお願いします。

      モジュール内の日本語については文字化けするのであれば気にしなくてもよいです。
      日本語はプログラムに関するコメントなので、実際の動作とは関係ない部分です。

  14. 名前:KOKE 投稿日:2017/02/22(水) 23:07:50 ID:559204e53 返信

    はじめまして。
    クラスモジュールを使わせていただいています。
    客先に提出する現場の工事写真や点検作業の写真を整理するのが楽になりました。
    ありがとうございます。
    また、3枚用の他に6枚パターンも客先によってはあるので、クラスモジュールを
    あれこれとアレンジして使っています。

    • sato001 名前:sato001 投稿日:2017/02/23(木) 10:01:37 ID:8f6c99123 返信

      KOKE さま。
      クラスモジュール使っていただいてありがとうございます。
      あれは本当に最低限の機能しか持たせていないので、あれこれと機能を追加して使っていただけるとありがたいです。
      そのうち、もう少し便利な感じのものを作りたいと思っているのですが、なかなか時間的に取り掛かれないでいます。

    • 名前:まつお 投稿日:2017/06/15(木) 16:35:57 ID:fadc8e84e 返信

      はじめまして。
      クラスモジュールを使わせていただいて重宝しています。
      工事写真でA3横用紙に6枚印刷して後に二つ折りし、見開きで見比べ出来るファイルを使っているのですがこのようなパターンのクラスモジュールの作り方を教えて頂けないでしょうか。マクロはド素人です。よろしくお願いします。

      • sato001 名前:sato001 投稿日:2017/06/15(木) 19:08:06 ID:e1a20d02d 返信

        まつお さま。
        クラスモジュールお使いいただいてありがとうございます。

        横からなのでちょっとアレですが、マクロは文章で簡単に教えられるようなものではないと思われます。

  15. 名前:もやし 投稿日:2017/10/25(水) 17:36:39 ID:e728b90f3 返信

    はじめまして、こちら利用させて頂いています。
    ひとつ疑問に思ったのですが、画像を引き伸ばし等せず縦か横どちらかを数字で固定、もう片方を比率を保って貼り付けることは可能でしょうか?

    • sato001 名前:sato001 投稿日:2017/10/26(木) 10:27:46 ID:625d75849 返信

      もやし さま。
      コメントありがとうございます。
      現状では対応していません。が、可能です。

      ちなみに、エクセル写真帳はver5.0以降で対応しています。

      このクラスモジュールが自分でも思っていたよりも需要があるみたいなので、そのうち新たに作り直すかもしれません。
      その時には比率を保ったまま貼付け、に対応したいと思います。
      よろしくお願いします。

コメントをどうぞ

メールアドレスが公開されることはありません。