• ベストアンサー

ExcelVBAで画像のサイズを調べるマクロを作ろうと思っています

VBAはほんの少しだけ触れた事のある初心者です。 全シートを走査して、シート上にある特定のサイズ以上の画像ファイルを探し、それらの画像ファイルを指摘(こことここの画像がサイズオーバーです! など)するアドインを作りたいと思っています。 さらにに、できるようであれば指摘後に画像をリサイズして張りなおすような事もしたいです。 作るに当たって、何から手を付けて良いかさっぱりわかりません。 使用する関数や、サンプルなど、何でも良いのでアドバイスをお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#2です。EnhancedMetaFileのお勉強をしていました。 ワークシートに貼り付けた画像を選択した状態で、下記のコードを実行すると、オリジナルのピクセル数が取得できると思います。 ・APIの定数、関数等の入手先-必要なものをセットしないと動きません。長いので割愛します。 http://homepage2.nifty.com/nonnon/Win32Api/ ・最もキーとなった、参考URL http://nienie.com/~masapico/api_GetEnhMetaFileBits.html Sub getPixelCount() Dim SrcData() As Byte Dim hSrcMetaFile As Long Dim BufSize As Long Dim SrcIdx As Long Dim RecordHeader As emr Dim strechDibRecord As EMRSTRETCHDIBITS Selection.Copy If OpenClipboard(0) Then hSrcMetaFile = GetClipboardData(CF_ENHMETAFILE) hSrcMetaFile = CopyEnhMetaFile(hSrcMetaFile, vbNullString) CloseClipboard End If If hSrcMetaFile = 0 Then Exit Sub BufSize = GetEnhMetaFileBits(hSrcMetaFile, ByVal 0, ByVal 0) ReDim SrcData(BufSize) BufSize = GetEnhMetaFileBits(hSrcMetaFile, BufSize, SrcData(0)) If BufSize = 0 Then Exit Sub SrcIdx = 0 While SrcIdx < BufSize MoveMemory RecordHeader, SrcData(SrcIdx), Len(RecordHeader) If RecordHeader.iType = EMR_STRETCHDIBITS Then MoveMemory strechDibRecord, SrcData(SrcIdx), Len(strechDibRecord) End If SrcIdx = SrcIdx + RecordHeader.nSize Wend DeleteEnhMetaFile hSrcMetaFile With strechDibRecord Debug.Print ".cxSrc - ", .cxSrc Debug.Print ".cySrc - ", .cySrc End With End Sub Public Function EnumFunc( _ ByVal hdc As Long, _ ByVal pHandles As Long, _ ByVal pRecord As Long, _ ByVal HandleNum As Long, _ ByVal pData As Long) As Long Dim eh As ENHMETARECORD RtlMoveMemory VarPtr(eh), pRecord, Len(eh) EnumFunc = 1 End Function

その他の回答 (2)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

シートに貼り付けた画像は、元画像のサイズや、解像度dpiの情報を保持している様ですが、 ローカルウィンドウを表示させてメンバーを眺めていても、それらしい物が見つかりません。 ご存じの方がいたら、自分も是非知りたいです。 ベタな方法ですが、解像度96dpi決め打ちで、下記により画像のサイズ(ピクセル数)が取得できるかも。 (クリップボードから貼り付けたり、解像度情報の無いファイルだと、96dpiと見なされる様です) なお、VBAによる画像のリサイズについては、下記に回答した例があります。 http://okwave.jp/qa/q5647625.html xl2000のコードです。他の環境で動かない場合はあしからず。 Type shapeSize Width As Long Height As Long End Type Sub test() Dim shp As Shape Dim shpSize As shapeSize For Each shp In ActiveSheet.Shapes If shp.Type = msoPicture Then shpSize = test2(shp) Debug.Print shpSize.Width, shpSize.Height End If Next shp End Sub Function test2(shp As Shape) As shapeSize Dim originalSize As shapeSize Application.ScreenUpdating = False originalSize.Width = shp.Width originalSize.Height = shp.Height shp.ScaleWidth 1, msoTrue shp.ScaleHeight 1, msoTrue test2.Width = shp.Width * 96 / 72 test2.Height = shp.Height * 96 / 72 shp.Width = originalSize.Width shp.Height = originalSize.Height Application.ScreenUpdating = True End Function

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

やりたいのは分りますが >VBAはほんの少しだけ触れた事のある初心者です。 では・・・ 十分理解してからでないと難しいと思いますよ まずは、この辺から Sub Macro1() Dim ws As Worksheet Dim i For Each ws In Worksheets With ws For i = 1 To .Shapes.Count With .Shapes(i) MsgBox "SheetName = " & ActiveSheet.Name & vbCrLf & _ "ShapeName = " & .Name & vbCrLf & _ "ShapeHeight = " & .Height & vbCrLf & _ "ShapeWidth = " & .Width End With Next i End With Next ws End Sub 参考まで

goo020
質問者

補足

ご回答ありがとうございます。 この程度でしたら理解できます。 すみません、言い方が悪かったです。 画像の縦横のサイズではなく、画像自体のファイルサイズを取得して警告を出したいなと考えています。 メッセージボックスの出し方やループに関しては参考にさせていただきます。

関連するQ&A

  • ExcelVBAでJPEG画像を比較

    ExcelVBAの初心者です。 Excelにイメージコントロールを2つ貼り付け、片方には任意のJPEGファイルを表示させるというVBAを作成しました(やっとの思いで)。JPEGファイルは特定のフォルダに多数存在しています。 片方のJPEGファイルが表示された時、同じ画像の(又は酷似している)ファイルがあれば、その画像をもう1つのイメージコントロールに表示させるという事はできるのでしょうか。もしできるのであれば、その方法と記述を教えて頂きたいのです。 なにぶん初心者です...よろしくお願いします。 ちなみに、Excel2000です。

  • ExcelVBAのアドインファイル作成について

    今晩は VBA初心者です。 アドインファイルを作成したいのですが、 どうやれば、できるのでしょうか? 宜しくお願い致します。

  • ヤフオクの画像サイズ

    ヤフオクに載せる画像ですがJTrimで画像を連結していざヤフオクに掲載したところエラーになってしまいます。 ちなみにデジカメで撮影しパソコンに写したものをJTrimで連結したのですがサイズがオーバーなのでしょうか?デジカメにはL M S 640というリサイズが出来ますがどのサイズが一番いいのでしょうか? ヤフオクに詳しい方がいましたらご回答宜しくお願いします

  • 画像のサイズについて

    ブログにのせる写真のサイズのことで質問です(初心者) いつもデジカメで撮った写真をリサイズして使っていたのですが たまたまよそのブログの写真をいただいたところ 写真のサイズが幅300px 高さ400px で20KBでした(image/pjpeg形式) 画像はかなり鮮明です 私がいつもリサイズしていた写真は 同じ幅300px 高さ400px の場合163KBもあります ブログで使える容量の限界もあり 写真のサイズは極力小さくしたいのです 画質を落とさず写真を小さくすることなく 容量(?)だけ小さくするにはどうしたらよいのでしょうか フリーソフトがあるようですが サイズについてもよく分からず 詳しく教えていただけるとありがたいです よろしくお願いいたします

  • どっちが正しい画像サイズ?フォトショとFinderのファイルサイズ表示の違い

    同じ画像なのに、フォトショとFinderの画像サイズ表示が違うのはなぜ? 昔から不思議に思っていたのですが、 一つの画像をフォトショップで開いて イメージ→画像解像度で表示されるファイルサイズと、 その画像を一度閉じたあと、そのファイルのアイコンをワンクリッし、finder→ファイル→情報を見る  で表示されるファイルサイズが違うのですが、 これはどういうことなのでしょうか? 私は当初、フォトショのほうが正しい情報と思っていたのですが finderの表示が、画像閲覧ソフトのBridgeで表示されるファイルサイズ 表示とほぼ同じなことから、(若干違うのも気になるのですが) フォトショ VS finder&ブリッジ どっちの表示が正しいのか迷っています。。。 またfinder、Bridgeで表示されるファイルサイズより フォトショのファイルサイズ表示のほうがいつも大きい気が するのもよく理解できません。 初心者的な質問かもしれないのですが どうぞ正しいファイルサイズの認識方法を教えて下さい。 また、追加質問となりますが フォトショップで画像をリサイズする場合、 解像度やドキュメントサイズの縦横を変えて欲しい ファイルサイズにすると思うのですが たとえば「この写真を50KBにしてほしい」 と言われた場合、KB優先(ファイルサイズ優先) でリサイズする方法、、、、、 などあるのでしょうか。 よろしくお願いします。

    • 締切済み
    • Mac
  • 画像サイズの変更

    読んでもらえばわかりますが、あまりパソコンには詳しくない主婦です(^_^;) デジカメ画像をファイルに貼り付ける際、とても大きなサイズででてくるため、小さくしようと「リサイズ」で5%まで小さくしたところ画質まで荒くなってしまいました。 あろうことか それを上書き保存してしまい一番いい写真が台無しに・・・(ToT) これを元のサイズ・・・というか画質を元に復元する簡単な方法はないでしょうか? 「リサイズ」って大きさだけの変更じゃないんですか? 画質はそのままで、表示される大きさだけの変更ってどうすればいいのでしょうか? 主婦にもわかるように優しい回答 よろしくお願いしますm(__)m

  • 画像サイズを変更するマクロ

    Excelで、アクティブシート内の画像(msoPicture)全てを、縦横比を保持したまま一括で縮小するマクロはありますでしょうか? 元のサイズは、 高さ:12.7cm、幅:16.93cm 変更後のサイズは 高さ:6.82cm、幅:10.12cm (高さの倍率81%、幅の倍率76% です) 説明に不足がありましたら、お手数ですがご指摘頂けますと幸いです。 よろしくお願いいたします。

  • 投稿画像のサイズを調整をしたい

    bloggerを利用しています。 画像を投稿すると、ある一定のサイズに自動的にリサイズされてしまい困っております。 例えば... 400pxの画像を投稿すると自動的に200pxにリサイズされます。また、100pxの画像を投稿するとそのまま100pxで投稿されます。(数値は分かりやすい任意の数です) そこで、リサイズされる画像のサイズを200pxではなく300pxにしたいのですが、そのやり方が分からなくて困っています。 これまで試した事... imgタグのwidthを300pxに指定したところ、著しく劣化した300pxの画像になりました。 どのタグをどのように書き換えれば画質を劣化させずに画像のサイズ調整ができるのか教えていただきたいです。 よろしくお願いします。

  • Excel アドインの更新配布について

    今、アドインにてユーザ定義関数を使用しています。 アドイン内の関数を修正しているのですが、 最新版がどれか分かるように、バージョンを記載しようと考えています。 アドインのVBA内に記載すればいいのですが、それだとファイル名で管理出来ないため、 後々面倒だと思い、アドインファイル名自体を変更したのですが、 既に、旧アドイン内の関数を利用しているエクセルシート内で 旧バージョンのアドインファイルを読みに行こうとしてエラーが出てしまいました。 通常、どのような管理方法をするのか教えてください。

  • 画像ファイルサイズ圧縮

    phpを使用して、画像の大きさは変えずにファイルサイズを500KB以下に圧縮したいのですが、何か良い方法はありますでしょうか? 検索して出てくる方法は、画像のリサイズが主で、画質を下げて(?)ファイルサイズを一定以下に抑える方法が出てきません。 シンプルに「500KB以下ならそのまま、500KB以上なら圧縮」ということだけが出来るものがあれば嬉しいです。

    • 締切済み
    • PHP

専門家に質問してみよう