この記事を読むのに必要な時間は約 12 分です。
「ちょっとエクセルでマクロを使ってみたい!」
という方のために、仕事で作った簡単なものを紹介します。
今の会社に入社後、隣の部署のお手伝いをすることがありました。
やることはWebサイトの動作確認で、意外とヤバいテストケースの1つが画像ファイル数千枚必要なやつ。
本番相当のデータ量を使って挙動を確認したかったようです。
SSDなら、重たいファイルをコピペして量産するのはとても簡単なんですが、残念ながら会社のパソコンはHDDなんです。
数千枚用意しようと思ったら、コピペだけで1時間以上かかりそうな勢いでした。
全力で定時退社したいから、そんなに長く待てません!!
エクセルのマクロで簡単に用意できたので、やり方をシェアします。
目次(リンク)
大量の画像を用意する方法
「テストデータくらい用意してよ!!」
と言いたくなるけど、テスターが調達するのが普通だから仕方ないんです。
早く帰るためにも頑張って用意しないといけません。
画像素材サイトを利用する
Website-Noteでもお世話になっているぱくたそなどは、ステキな画像を1つずつダウンロードしていくタイプのサイトです。
何でもいいから大量に欲しいなら、他を探すべきです。
「画像素材 無料」、「イラスト フリー」のようなキーワードで検索すれば、まとめて100枚や200枚をダウンロードできるサイトが見つかるはず。
私もとあるサイトでまとめてダウンロードできるところを見つけ、とりあえず数百枚入手しました。
画像をコピペして量産する
テストで必要な量が3000枚とか4000枚ほどだったので、入手した数百枚を複製しないといけません。
早速コピペを始めたところ、表示された所要時間の長さを目にして断念しました。
「くそぉ~、SSDのパソコンなら・・・。」
WindowsXPのサポートが切れても、会社によってはまだまだ現役で活躍していたりする時代なんです。
仕事なのに低スペックなパソコンだけど我慢してねって、よくある事なんです。
エクセルのマクロを活用する
早く帰りたいから何とかしようと思ったときにひらめきました。
「なんかエクセルのマクロでイケそう!」
簡単に画像と文字を組み合わせられるので、ファイル名でも画像でも一つひとつを識別可能。
テストのエビデンスも用意しやすそうだし、最初からマクロを使えば良かったと思いました。
細かいやり方は後述しますが、ザックリいうと、こんな感じです。
- 4000回コピペしてくれるマクロを組む
- エクセルの中で、オブジェクトに数字の連番を入れながら4000個コピペするマクロ実行
- Excelファイルの中から画像データを取り出す
マクロを組むと言っても、半分くらいは動作を記録すれば出来ちゃいます。
簡単ですねー。
オブジェクトに文字を入れることができて数千枚あっても全部識別可能です。
拾ってきた写真とか、ちょっと似ていたりすると、どっちがどっちだったっけ?となりますよね。
ファイルを混同しちゃうのも防げます。
テストしてて、さっきまで取ったエビデンスを確認して、ってやっていると無駄に時間がかかります。
見やすく連番にしておけば、識別できるので大丈夫。
気を付けたいのは、単純に図形として複製しても画像データにはならないことです。
せっかく大量にオブジェクトを用意しても、画像データとして取り出さないと意味がありません。
ペイントなどに貼り付けて保存していたら深夜になっちゃいます。
でも大丈夫、一瞬で取り出す方法も書くので使ってみてくださいね。
エクセルのマクロで画像を量産する方法
マクロを使うときは「開発」タブを表示していると便利です。
表示方法はこちらの記事をどうぞ。
まずは4000回コピペしてくれるマクロを組む
イチから書いていってもイイですが、やりたいことのベースになる部分を「マクロの記録」でソースコードにしちゃうと簡単です。
というわけで、「マクロの記録」を押して記録開始!
あらかじめコピー元の図形を用意しておいた方が楽です。
図形をコピーし、場所をずらして画像として貼り付ける操作を記録しました。
「Macro1」が記録されました。
必要なところだけ抽出して書いた一例がこちらです。
ソースコードを解説
ループや連番で使う変数を宣言します。
1 |
Dim lCnt As Long |
integer の上限が32,767しか無くて危なっかしいので、型をlongにしています。
どうでも良さそうですが、「lCnt」の「l」はlongの「l」。
今回は短いですが、長いソースになってくると、こういう工夫が役立つのでおすすめです!
描画の無効と有効も入れておきます。
1 2 |
Application.ScreenUpdating = False Application.ScreenUpdating = True |
たった数回のループなら全く意味を感じないかもしれません。
ところが4000回もやってると描画のための時間がスゴイことに・・・。
無効と有効は必ずセットで入れてくださいね。
ループの処理はこれです。
1 2 3 |
For lCnt = 1 To 3 Next lCnt |
1から3までループしてくれます。
実行してみて大丈夫そうなら「3」を「4000」とかループしたい回数に変更します。
Array(“Rectangle 1”)のところ、「1」にしています。
1 |
ActiveSheet.Shapes.Range(Array(1)).Select |
最初に図形を用意するとき、コピペしていると名前が「Rectangle 2」とか変わっちゃうので、こっちの数字だけのほうが間違いありません。
コピー前にテキストの連番を変更しています。
1 |
Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = "マクロ" & lCnt |
厳密には「”マクロ”」は文字列、string型で、「lCnt」は数字のlong型、別物です。
違う方のものをくっつけるとか、言語によっては型変換の処理も必要ですが、VBAは上手ーくやってくれるので今回は気にしませんw
最後にメッセージボックス表示です。
1 |
MsgBox "処理が終了しました" |
数回ループするだけなら、ぶっちゃけこんなメッセージはいりません。
でも4000回もループしていると、数分間エクセルが固まっているように見えちゃいます。
「あれ、もう終わったのかな? 触っていいかな?」と思って途中でクリックしちゃうとエラーが出るので不安になるかもしれません。
なので、メッセージボックスはちょっとした精神安定剤です。
まとめたソースがこれです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub CreateImage() Dim lCnt As Long Application.ScreenUpdating = False For lCnt = 1 To 3 ActiveSheet.Shapes.Range(Array(1)).Select Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = "マクロ" & lCnt ActiveSheet.Shapes.Range(Array(1)).Select Selection.Copy Range("B" & lCnt * 5).Select ActiveSheet.Pictures.Paste.Select Next lCnt Application.ScreenUpdating = True MsgBox "処理が終了しました" End Sub |
マクロを実行する
早速実行してみたいと思います。
ちゃんと3回ループして3つ図形が複製されました!!
動作は問題なさそうですね。
今度は4000回ループするよう変更して実行します。
しばらくエクセルがフリーズしているようにしか見えませんw
タイトルバーに「応答なし」と表示されます。
数分間、グッと我慢です。
Excelファイルの中から画像データを取り出す
一応マクロのファイルをコピペしてバックアップしておきます。
では、画像ファイルを取り出しましょう!
まずはファイルの拡張子を「zip」に変更します。
zipだけど、圧縮ファイルにするんじゃないですよ。
ファイル名を変えるだけです。
zipファイルの中を見てみてください。
エクセルファイルの時には見えなかったものが見えてきます。
画像データはxl\media フォルダの中に格納されています。
このファイルたちをコピペなどで取り出せばOKです。
お疲れさまでした。
もしもmediaフォルダが無かったら、図形を貼り付けるところで画像として貼り付けれていません。
ソースに「Paste」と書いてあるところを見直してみてください。
まとめ:エクセルのマクロで画像量産する方法
何でもいいから大量に画像が欲しいという方向けに、エクセルのマクロで量産する方法を紹介しました。
テスト用にたくさん画像が欲しいとか、ちょっとマクロを勉強してみたいという方、良かったら活用してみてくださいね。