フォルダー内の画像名を取得する方法とは?

このQ&Aのポイント
  • VB初心者がフォルダー内の画像名を取得する方法について教えてください。
  • jpg以外の画像も取得できるようにするにはどうすればいいですか?
  • 提供されたコードを使用して画像名と画像サイズを取得する方法を教えてください。
回答を見る
  • ベストアンサー

フォルダーに入った画像名の取得したい

VB初心者です。色々調べて、セルに「画像名と画像サイズ一覧」を 書き出すことができました。 しかし、書き出せたのはjpgだけで、gifやpngをフォルダー内に入れると エラーが・・・・ どうしたらgifやpngも書き出せるコードになるか教えてください。 よろしくお願いします。 書いたコードは下記です。 Sub GetImageSize(ByVal f, ByRef x, ByRef y) Dim p Set p = LoadPicture(f) x = CLng(CDbl(p.Width) * 24 / 635) y = CLng(CDbl(p.Height) * 24 / 635) Set p = Nothing End Sub Sub main() Dim FSO As New FileSystemObject Dim FLD As Folder Dim FLE As File Dim FF As File Dim x As Long Dim y As Long Set FLD = FSO.GetFolder("C:\画像の入ったフォルダー名") For Each FF In FLD.Files Call GetImageSize(FF, x, y) Name = FF.Name Name_x = x Name_y = y myCnt = myCnt + 1 Cells(myCnt, "A").Value = FF.Name Cells(myCnt, "B").Value = x Cells(myCnt, "C").Value = y Next FF End Sub

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

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

LoadPictureはgifやpngには対応していませんので、最近のWindowsなら標準で持っているGDI+という機能を用いています。なるべく元の形に添わせました。簡便さ優先で毎回GDI+のオブジェクトを生成しているので、重たいと思います。ご参考まで。 (訳の分からないものを使うのは嫌という場合は、他の回答者様の回答をお待ち下さい。)Windows7Home(64bit),xl2010で試しています。 Private Type GdiplusStartupInput GdiplusVersion As Long DebugEventCallback As Long SuppressBackgroundThread As Long SuppressExternalCodecs As Long End Type Private Declare Function GdipCreateBitmapFromFile Lib "Gdiplus" (FileName As Any, bitmap As Long) As Long Private Declare Function GdipDisposeImage Lib "Gdiplus" (ByVal Image As Long) As Long Private Declare Function GdipGetImageHeight Lib "Gdiplus" (ByVal Image As Long, Height As Long) As Long Private Declare Function GdipGetImageWidth Lib "Gdiplus" (ByVal Image As Long, Width As Long) As Long Private Declare Sub GdiplusShutdown Lib "Gdiplus" (ByVal token As Long) Private Declare Function GdiplusStartup Lib "Gdiplus" (token As Long, pInput As GdiplusStartupInput, pOutput As Any) As Long Function GetImageSize(ByVal f As File, ByRef x As Long, ByRef y As Long) As Boolean Dim udtInput As GdiplusStartupInput Dim lngToken As Long, lngStatus As Long Dim pSrcBmp As Long, pDstBmp As Long Dim lngWidth As Long, lngHeight As Long Dim srcPath As String srcPath = f.Path udtInput.GdiplusVersion = 1 If GdiplusStartup(lngToken, udtInput, ByVal 0&) <> 0 Then GetImageSize = False Exit Function End If If GdipCreateBitmapFromFile(ByVal StrPtr(srcPath), pSrcBmp) <> 0 Then GdiplusShutdown lngToken GetImageSize = False Exit Function End If GdipGetImageWidth pSrcBmp, lngWidth GdipGetImageHeight pSrcBmp, lngHeight x = lngWidth y = lngHeight GdipDisposeImage pSrcBmp GdiplusShutdown lngToken GetImageSize = True End Function Sub main() Dim FSO As New FileSystemObject Dim FLD As Folder Dim FLE As File Dim FF As File Dim x As Long Dim y As Long Dim myCnt As Long Set FLD = FSO.GetFolder(GetDesktopPath & "\picsizetest") For Each FF In FLD.Files If GetImageSize(FF, x, y) Then myCnt = myCnt + 1 Cells(myCnt, "A").Value = FF.Name Cells(myCnt, "B").Value = x Cells(myCnt, "C").Value = y End If Next FF End Sub 'パスの伏せ字をなくすためデスクトップ上のフォルダーとしています Private Function GetDesktopPath() As String Dim wScriptHost As Object, strInitDir As String Set wScriptHost = CreateObject("Wscript.Shell") GetDesktopPath = wScriptHost.SpecialFolders("Desktop") Set wScriptHost = Nothing End Function

nyoromo11
質問者

お礼

mitarashiさん 大変ありがとうございます! jpg gif png全て書き出せました^^ gif pngに対応するために、2,3行追加すればなんて、 甘いこを考えていた昨日の自分・・・ ご丁寧にコードまで書いて頂き大変感謝しております! 本当にありがとうございました。

関連するQ&A

  • PNG画像の大きさ取得(エクセルvba)

    PNG画像の幅と縦の取得ができなくて困っています。 PNG以外でしたら、下記の関数に画像ファイルのパスを渡せば求められるのですが、 LoadPicture関数がPNG未対応のようです。 Sub subGetPicSize(PicPath As String) Dim P Set P = LoadPicture(PicPath) MsgBox CLng(P.Width * 0.0378) & "×" & CLng(P.Height * 0.0378) End Sub 画像変換ツールでPNGをBMPなどほかの形式にすれば、大きさを求められますが、よりよい方法を知っていれば教えてください。 宜しくお願いします。

  • VBAのUserFormでサブルーチンを用いる

    UserFormのコードに次のように書いてbuttomを押してみると コンパイルエラー:ByRef引数の型が一致しません。 と出てしまいます。 どこが間違っているのでしょうか?ご回答お願いします。 Private Sub buttom_Click() Dim i As Integer Dim name As String i = 1 name = "名前" Call test(i , name) End Sub ---------------------------------------------- Sub test(i As Integer, name As String) Cells(i , 1) = name End Sub

  • エクセルVBA For~Nextについての質問

     初めまして、よろしくお願いします。  最近VBAを見よう見まねで入力している超初心者です。 C1からC10までにA1+B1の計算結果を入力するVBAで Sub TEST()  Dim myCnt As Long   For myCnt = 1 To 10     Cells(myCnt, 3).Value = Cells(myCnt, 1).Value + Cells(myCnt, 2).Value   Next myCnt End Sub というVBAが有りますが、このA1からA10、B1からB10の間に未入力などが有ると計算の途中でエラーになってしまうようです。エラーにならない対策方法を教えていただきたく、よろしくお願いします。

  • Excel マクロ

    Private Sub Workbook_Open() Dim name As String name = "7月" '//ワークシート名----編集用(本日曜日カラー変更ロジック用----月初変更箇所) Dim week As String Dim Y As Integer Dim X As Integer '//処理(1)-(1) すべての曜日セルの背景を白にする Worksheets(name).Range("A13:M13").Interior.ColorIndex = 19 '白 '//処理(1)-(2) 今日の曜日を取得して色を変更する week = WeekdayName(Weekday(Now), False) '今日の曜日 Y = Worksheets(name).Cells.Find(week).Row X = Worksheets(name).Cells.Find(week).Column Worksheets(name).Cells(Y, X).Interior.ColorIndex = 45 'オレンジ系の色 '//処理(2) 本日日付を取得して色を変更する Dim D As Integer D = Day(TODAY()) '本日の日付 Y = Worksheets(name).Cells.Find(D, LookAt:=xlWhole).Row X = Worksheets(name).Cells.Find(D, LookAt:=xlWhole).Column Worksheets(name).Cells(Y, X).Interior.ColorIndex = 19 ' End Sub 途中なのですが、日付を取得して色を変える というロジックを作っていて 処理(2)からを新しく付け足した時にエラーが起こりました。 内容は「SubまたはFunctionが定義されていません」です。 どうやらD = Day(TODAY())らへんでエラーになっているようなのですが どなたか分かる方教えてください(´・ω・`)(´-ω-`))ぺこり

  • サブフォルダからエクセルブックをとりだすマクロ

    特定のフォルダからエクセルブックのみを抽出し別のフォルダに集める(コピーする)マクロを作りたいと思い、以下のように作成しました。 (AAAフォルダ⇒移動元、BBBフォルダ⇒移動先) ただしこれだと、AAAフォルダ内にあるサブフォルダからは拾ってこれないようです。 AAA内の全てのサブフォルダからエクセルブックを拾ってくるにはどう修正すればよろしいでしょうか。 ――――――――――― Sub sample1() Dim FSO As Object, fld As Variant, bk As Variant Const Fld1 As String = "C:\AAA" Const Fld2 As String = "C:\BBB\" Const tgt As String = "*.xlsx" Set FSO = CreateObject("Scripting.FileSystemObject") For Each fld In FSO.GetFolder(Fld1).SubFolders For Each bk In fld.Files If bk.Name Like tgt Then bk.Copy Fld2 End If Next bk Next fld End Sub

  • 単純な掛け算なのにわけのわからない小数点が、、、

    表題のとおりですが、EXCEL VBAでシートと複合させて計算したところ次のような結果が出ました。 マクロは以下のとおりです。 Private Sub CommandButton1_Click()  Dim i As Integer Dim n As Integer Dim x As Integer Dim y As Single  Dim d1 As Single Dim d2 As Single  n = Range("L4").Value 'L4には現在399が入力されています。 y = Range("L2").Value 'L2には現在0.048が入力されています。  d1 = Range("D11").Value d2 = Range("E11").Value If n = 0 Then Exit Sub For i = 0 To n x = i + 6 Cells(x, 13) = i Cells(x, 14) = Cells(x, 13) * y Cells(x, 15) = Cells(x, 14) + d1 Cells(x, 16) = d2 - Cells(x, 14)     x = x + 1 Next i End Sub こうするとCells(7, 14)に0.0480000004172325という数字が入り始め、 続きも同じように小数点の小さい桁にわけの分からない数字が出て来ます。いったい何が原因か分かりません。 よろしくお願いします。

  • エクセルVBAで2つの画像を比較したい

    こんにちは。VBAの初心者です。 エクセル2003のVBAを使って、シートに読み込んだ縦横24ピクセルの2つの画像(picA、picB)を比較したいと考えています。VBなどのページを参考に、APIのGetPixel関数を使えばなんとかなりそうだというところまではたどり着いて、以下のコードを組んでみたのですが、うまく動きません。 Private Declare Function GetPixel Lib "gdi32" _ (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long Private Sub CommandButton1_Click() Dim picA As Image Dim picB As Image Dim p1 As Integer Dim p2 As Integer Dim ScreenhDC As Long For x = 1 To 24 For y = 1 To 24 p1 = picA.GetPixel(ScreenhDC, x, y) p2 = picB.GetPixel(ScreenhDC, x, y) If p1 <> p2 Then MsgBox "違う画像です" Exit Sub End If Next Next MsgBox "同じ画像です" End Sub 「p1 = picA.GetPixel(ScreenhDC, x, y)」のところで「実行時エラー'91': オブジェクト変数またはWithブロック変数が設定されていません。」というメッセージが出て止まってしまいます。解決法をご教示いただけませんでしょうか。 そもそもエクセルのVBAではAPIは使えないなどということはありますか?

  • ※VBA配列

    http://oshiete1.goo.ne.jp/qa5196795.htmlで 質問させてもらった者です。質問不足だったため 質問の内容を追加したかったのですが、追加の方法がわからず またこちらで質問させていただきました Dim time1 As Integer, time As Integer Dim X As Integer, Y As Integer Dim X1 As Integer, Y1 As Integer Dim X2 As Integer, Y2 As Integer Dim maru As String, yoko As String, tate As String Dim sankaku As String, shikaku As String Sub 描画() Cells(Y2, X2).Value = shikaku Cells(Y1, X1).Value = sankaku Cells(Y, X).Value = maru End Sub Sub 削除() Cells(Y2, X2).Value = "" End Sub Sub 待機() For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next End Sub Sub 座標移動() X2 = X1 Y2 = Y1 X1 = X Y1 = Y If yoko = "右" Then X = X + 1 Else X = X - 1 End If If X = 30 Then yoko = "左" ElseIf X = 1 Then yoko = "右" End If If tate = "上" Then Y = Y + 1 Else Y = Y - 1 End If If Y = 20 Then tate = "下" ElseIf Y = 1 Then tate = "上" End If End Sub Sub main() maru = "●" sankaku = "▲" shikaku = "■" X = 1 Y = 1 X1 = 1 Y1 = 1 X2 = 1 Y2 = 1 yoko = "右" tate = "上" Do 描画 待機 削除 待機 座標移動 Loop End Sub a~tの文字が、上記のような動きをする プログラムを作成するにはどのように配列を活かせばいいですか? 配列がよくわかっておらず勉強したのですが…使えずにいます;;

  • Excel VBA ・・・教えてください

    何度も質問させて頂いてます。すみません、 下記のプログラムはこの場で教えて頂いたプログラムで、 実行すると●の後を▲や■が追いかける動きをします。 下記のプログラムをある程度使用して 1~20の数字が順々で追いかけっこする プログラムを作成するにはどのようにすればいいのでしょうか… できればプログラムは長めにならず 20の数字から簡単に増やすことのできるような そんなプログラムが作成したいです… どなたかアドバイスお持ちの方 教えて下さいお願いします... Dim time1 As Integer, time As Integer Dim X As Integer, Y As Integer Dim X1 As Integer, Y1 As Integer Dim X2 As Integer, Y2 As Integer Dim maru As String, yoko As String, tate As String Dim sankaku As String, shikaku As String Sub 描画() Cells(Y2, X2).Value = shikaku Cells(Y1, X1).Value = sankaku Cells(Y, X).Value = maru End Sub Sub 削除() Cells(Y2, X2).Value = "" End Sub Sub 待機() For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next End Sub Sub 座標移動() X2 = X1 Y2 = Y1 X1 = X Y1 = Y If yoko = "右" Then X = X + 1 Else X = X - 1 End If If X = 30 Then yoko = "左" ElseIf X = 1 Then yoko = "右" End If If tate = "上" Then Y = Y + 1 Else Y = Y - 1 End If If Y = 20 Then tate = "下" ElseIf Y = 1 Then tate = "上" End If End Sub Sub main() maru = "●" sankaku = "▲" shikaku = "■" X = 1 Y = 1 X1 = 1 Y1 = 1 X2 = 1 Y2 = 1 yoko = "右" tate = "上" Do 描画 待機 削除 待機 座標移動 Loop End Sub

  • エクセル VBA Call

    VBA初心者です。 callというのを知ったのですが、 ------------------------------- sub aaa() Dim z As Integer For z = 1 To 30 Step 1 Dim y As String y = Cells(2 + z, 3).Value Dim x As String x = Cells(2 + z, 2).Value ・ ・ call m1 call m2 call m3 call m4 ・ ・ next z end sub という記載があって呼び出し元に sub m1 sheet(y).select と書きたいです。この y とか x を先に記載した内容と同じ 認識にするにはどうしたら良いですか。 ど素人に分かるようにお願いします。教えてエクセル大先生。

専門家に質問してみよう