ヘルプの森~Excel・Access・Office全般ヘルプデスクサイト

No.013

フォルダー内のすべての画像ファイルをペイントで開きサイズ変更

2003/2007/2010/2013

フォルダーに入っている画像ファイルを、すべて同じサイズに変更するようなことになりました。
サイズ変更の簡単なところでは、ペイントで[サイズ変更と傾斜]ダイアログ ボックスを表示して設定することができますが、画像ファイルが多数となると大変です。

ペイント[サイズ変更と傾斜]ダイアログ

そこで、VBAでできないものかと思い試作してみました。
ペイントを操作するときにキー操作のみで行う様子を、ExcelのVBAにしてみたものです。

画像ファイルをペイントで開いた状態で、例えばピクセル単位でのサイズ変更(水平方向のみ数値指定、縦横比維持)を行い保存して閉じるには、次のようなキー操作で実施できます。

  「Alt」、「H」 または 「Alt」+「H」 …アクセス キー
  「R」「E」 …アクセス キー、これで[サイズ変更と傾斜]ダイアログ ボックスを表示
  「↓」 …これで[ピクセル]オプションの指定
  「Tab」 …移動
  [水平]ボックスの数値設定
  「Enter」 …ダイアログ ボックス確定
  「Alt」+「F4」 …ペイント閉じる
  「Enter」 …保存する

それでは早速ですが、フォルダー内のすべての画像ファイル(.png)を、ピクセル単位で縦横比を保ち幅300pxでサイズ変更を行う記述です。

Sub Sample()

  Dim myFile As String, myPath As String
  Dim suihei As Integer '幅(水平方向)の設定値

  myPath = "D:¥test¥" '画像の入っているフォルダー
  myFile = Dir(myPath & "*.png") 'pngファイルを取得
  suihei = 300

  Do While Len(myFile) > 0
    Shell "C:¥Windows¥system32¥mspaint.exe" & " """ & myPath & myFile & "", vbNormalFocus
    Application.Wait Now + TimeValue("0:00:02")  '2秒待つ

    SendKeys "%H"  'Alt+H(アクセス キー)
    SendKeys "RE"  'R、E(アクセス キー)
    SendKeys "{DOWN}"  '↓ [ピクセル]オプション選択
    Application.Wait Now + TimeValue("0:00:01")
    SendKeys "{TAB}"  'Tab
    SendKeys suihei  '水平設定
    SendKeys "{Enter}"  'ダイアログ ボックス確定

    SendKeys "%{F4}"  'アプリ終了 Alt+F4
    SendKeys "{Enter}"  '保存確定"

    myFile = Dir()
  Loop
  SendKeys "{NUMLOCK}"

  MsgBox "完了"

End Sub

実行すると、1つずつ画像ファイルが開き、ゆっくりと処理されていきます。

では、上記の記述についてですが、詳細は別ページでご確認ください。

キー操作を記述しているSendKeysステートメントについては、Excel VBAのヘルプ「InputBox のテキスト ボックス入力時に日本語入力をオンにする」の<ヘルプmemo>をご参照ください。

順序が逆になりましたが、フォルダー内のファイルすべてを操作するのは、ヘルプ「フォルダー内のすべてブックを開いて同じ処理を行う 《Do~Loop・Dir》」をご確認ください。

また、ペイントで画像ファイルを開くのは Shell関数を使用、また、ペイントの動作を待ってやるために使用する Waitメソッド は次のヘルプ「アプリケーションを起動し動作させる 《Shell・SendKeys・Wait》」の<ヘルプmemo>にありますのでご参照ください。

1点補足ですが、最後の「完了」メッセージの前に、SendKeysステートメントで「NumLock」キーを押すようにしています。
実は、SendKeysステートメントを続けて使用すると(組み合わせにもよるようです)、オンであった「NumLock」キーが外れるというバグがあり、今回のサンプルを実行すると外れます。
そこで「NumLock」キーをオンにするために入れている記述です。
通常PCで「NumLock」キーをオフにされている場合は、最後から3行目の

  SendKeys "{NUMLOCK}"

をコメントにするか削除してご利用ください。

さて実際、ペイントの[サイズ変更と傾斜]ダイアログ ボックスのサイズ変更の設定では、次の4つのパターンがあります。
また、画像ファイルもいろいろな種類があります。

  • 単位ピクセル/縦横比維持する
  • 単位ピクセル/縦横比維持しない
  • 単位パーセント/縦横比維持する
  • 単位パーセント/縦横比維持しない

これらをすべて網羅しサイズ変更を実行できるサンプルファイルを用意しました。
次のリンクをクリックしダウンロードしてご利用ください。

サンプルVBAファイル ダウンロード

ダウンロードいただいたファイルの説明を少しさせていただきます。

サンプルVBAファイル

まず最初にお断りですが、今回のプログラムはとても素朴なもので、動作としては1画像3秒程度かかり、対象画像のペイントの画面が前面に表示され、一時的に待ち(止まり)ながら動作します。(スマートな動作状況ではありません)
ネットでは、画像サイズ変更のこういったサンプルはほぼないようでしたので、今回掲載に至りました。
待てない方はフリーソフト、別の方法をご利用ください。

さて、Excelのシートの色つきセルに設定をしてからボタンをクリックして実行します。
詳しくはシートに説明がありますので、よく確認して実施してください。
特に注意点としては、画像ファイルはサイズ変更後上書き保存されますので、バックアップしてからの実行をおすすめします。
こちらでは何度も動作確認をしておりますが、画像の容量やPCのスペックやなんらかのタイミングにより、失敗するケースがあるかもしれません。
実施後は、変更されたサイズをざっくり確認するようにしてください。

このページでご紹介した記述は、ダウンロードいただいたブックで「Alt」+「F11」を押して VBE を開き、左の階層構造(プロジェクト エクスプローラー)の「Module2」にあります。

twitter hatena line pocket

関連ヘルプ

ブック内のすべてのワークシートで同じ処理を行う 《For Each~Next》
ブックを開くとき、閉じるときにマクロを自動実行したい 《イベント プロシージャ》
データを快速で検索するには 《Find》
アプリケーションを起動し動作させる 《Shell・SendKeys・Wait》
エラーの種類、そしてエラー処理の設置方法について 《On Error GoTo》
InputBox のテキスト ボックス入力時に日本語入力をオンにする 《SendKeys》
Excelのデータをテキスト ファイルに書き出す(出力する) 《Open・Print・Close》
ExcelからOutlookでメールを作成・送信する基本のVBA 《CreateObject関数》
Excelのメールアドレス データを使用し、Outlookのメールを自動送信する 《CreateObject関数》
ソートしたグループごとのデータを別ブックに分割するサンプルVBA
右クリック、印刷、上書き保存などブックに規制をかける 《イベント プロシージャ Cancel=True》
フォルダー内のすべてブックを開いて同じ処理を行う 《Do~Loop・Dir》
フォルダー内のフォルダーとファイルの一覧をセルに書き出す1 《Dir》
フォルダー内のフォルダーとファイルの一覧をセルに書き出す2 《FileSystemObject》
フォルダー内のファイル名を変更する 《Do~Loop・Dir・Name~As》
ColorプロパティとRGB関数について、Color値からRGB、RGBからColor値を求める方法 《Color・RGB関数》