Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10768 / 13644 ツリー ←次へ | 前へ→

【19963】BPM画像の大きさを取得したい kk 04/11/20(土) 17:26 質問[未読]
【19964】Re:BPM画像の大きさを取得したい かみちゃん 04/11/20(土) 18:54 回答[未読]
【19965】Re:BPM画像の大きさを取得したい kk 04/11/20(土) 19:29 質問[未読]
【19966】Re:BPM画像の大きさを取得したい かみちゃん 04/11/20(土) 20:22 回答[未読]
【19967】Re:BPM画像の大きさを取得したい kk 04/11/20(土) 20:50 質問[未読]
【19968】Re:BPM画像の大きさを取得したい Kein 04/11/21(日) 0:45 発言[未読]
【19971】Re:BPM画像の大きさを取得したい ぎこ 04/11/21(日) 13:30 回答[未読]
【19972】Re:BPM画像の大きさを取得したい ぎこ 04/11/21(日) 13:38 発言[未読]
【19973】Re:BPM画像の大きさを取得したい かみちゃん 04/11/21(日) 14:00 回答[未読]
【19977】Re:BPM画像の大きさを取得したい ぎこ 04/11/21(日) 19:16 発言[未読]
【19984】Re:BPM画像の大きさを取得したい kk 04/11/22(月) 9:55 お礼[未読]

【19963】BPM画像の大きさを取得したい
質問  kk  - 04/11/20(土) 17:26 -

引用なし
パスワード
   はじめまして。超初心者&ものすごく急いでいます。

特定のフォルダを指定したら、そのフォルダ内のBMPファイルのファイル名と縦横のサイズを取ってきてくれるVBAを作成したいのです。

BMPファイルのファイル名を取得するところまではできたのですが、BMPの縦横サイズを取得するのがわかりません。

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

【19964】Re:BPM画像の大きさを取得したい
回答  かみちゃん  - 04/11/20(土) 18:54 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>BMPファイルのファイル名を取得するところまではできたのですが、BMPの縦横サイズを取得するのがわかりません。

ファイル名を取得できているということなので、次がヒントになりませんか?
これは、特定のファイル名を表示して、そのサイズを取得しています。

Option Explicit

Sub Macro1()
 Dim strFileName As Variant
 
 Range("A1").Select
 strFileName = Application.GetOpenFilename _
  ("画像ファイル,*.bmp", 1, "画像ファイルを指定して下さい")
 
 If strFileName = False Then
  Exit Sub
 End If
 ActiveSheet.Pictures.Insert(strFileName).Select
 MsgBox "画像ファイル名 " & strFileName & vbCrLf & _
      "縦 " & Selection.Height & vbCrLf & _
       "横 " & Selection.Width
 Range("A1").Select
End Sub

【19965】Re:BPM画像の大きさを取得したい
質問  kk  - 04/11/20(土) 19:29 -

引用なし
パスワード
   ありがとうございます。
超初心者(今日初めてVBA挑戦しました)なので、本当に何もわからず、参考文書から抜き出して作ったのが以下です。

Sub GETBMP()
  Dim Filename      As String
  Dim i          As Long
  Dim ファイルオープン  As Variant

  ファイルオープン = Application _
    .GetOpenFilename(" (*.bmp), *.bmp")
 
'  Filename = "*.*"
  If ファイルオープン <> False Then
    i = 2
    ファイルオープン = Left(ファイルオープン, InStrRev(ファイルオープン, "\")) & "*.bmp"
    Filename = Dir(ファイルオープン)
'    Do Until ファイルオープン = ""
    Do Until Filename = ""
      Cells(i, 1).Value = Filename
      Filename = Dir
      i = i + 1
    Loop
 
  End If


End Sub

これに、画像の幅と高さをセルに表示するようにプログラムを追加したいのですが、どうやってみても値0が返ってきてしまって、いそいでいるのに出来なくて泣きが入ってます。
すみませんが、よろしくお願いいたします。

【19966】Re:BPM画像の大きさを取得したい
回答  かみちゃん  - 04/11/20(土) 20:22 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>これに、画像の幅と高さをセルに表示するようにプログラムを追加したいのですが、どうやってみても値0が返ってきてしまって、いそいでいるのに出来なくて泣きが入ってます。

急いでいるのは、わかりますが、どのようにしたら0の値が返ってくるのでしょうか?
提示いただいたコードでは、ただ単にファイル名の一覧を表示するだけのように見えます。
さきほどのコメントのコードは参考にしていただけましたか?

もしかして、画像を表示せずに、縦横のサイズを取得したいということですか?

以下のコードは、画像を表示して、縦横のサイズを取得しています。
ご提示いただいたコードにさきほどのコードを加味して修正しました。
なお、変数名は、半角英数字にしたほうがいいので、変えています。
また、動作は、WindowsXP(HomeEdition) + Excel2002(SP3)で確認済みです。

Option Explicit
Sub Macro1()
 Dim strFileName As Variant
 Dim strFolderName As Variant
 Dim i As Integer

 Range("A1").Select
 strFileName = Application.GetOpenFilename _
  ("画像ファイル,*.bmp", 1, "画像ファイルを指定して下さい")
 
 If strFileName = False Then
  Exit Sub
 End If
 i = 2
 strFolderName = Left(strFileName, InStrRev(strFileName, "\")) & "*.bmp"
 strFileName = Dir(strFolderName)
 Do Until strFileName = ""
  Cells(i, 1).Value = strFileName
  '画像を表示
  ActiveSheet.Pictures.Insert(strFileName).Select
  MsgBox "画像ファイル名 " & strFileName & vbCrLf & _
       "縦 " & Selection.Height & vbCrLf & _
        "横 " & Selection.Width
  strFileName = Dir
  i = i + 1
 Loop
 Range("A1").Select
End Sub

【19967】Re:BPM画像の大きさを取得したい
質問  kk  - 04/11/20(土) 20:50 -

引用なし
パスワード
   かみちゃんさん、ありがとうございます。

>さきほどのコメントのコードは参考にしていただけましたか?
はい。参考にさせていただきました。。。が、自力では改造できませんでした。

>もしかして、画像を表示せずに、縦横のサイズを取得したいということですか?
そうなのです。しかも、単位をピクセルでサイズ取得したいのです。
ビットマップ画像のサイズのコードは下記なのですが、
biWidth ・・・ビットマップの幅(pixel)
biHeight ・・・ビットマップの高さ(pixel)
どうやったらこの情報を取得できるのかがわからないのです。

そして、メッセージボックスではなく、セルに結果(ファイル名・幅・高さ)を表示したいのです。

何度もすみません。よろしくお願いいたします。

【19968】Re:BPM画像の大きさを取得したい
発言  Kein  - 04/11/21(日) 0:45 -

引用なし
パスワード
   まず、BMPの構造から勉強して下さい。↓
http://page.freett.com/honmyou/bmp_structure.htm
それによると、ヘッダ部の19バイトから26バイト目にかけて、縦横のサイズが
記録されていることが分かりますよね ? で、Bmpファイルの内容を読み取るには
↓のようにOpenステートメントで Binaryモードを使って開けばよいのですが
http://park7.wakwak.com/~efc21/cgi-bin/wwwlng.cgi?print+200311/03110308.txt
テストしてみたら最初の2バイトの "BM" ぐらいしか正確に読み取れませんでした。
これはただ "このファイルはbmpですよ" という情報でしかないので、無意味ですね。
で、お手上げのときは余計な意見なんぞ書き込まずに、フリーのソフトでも探して
リンクを張ってあげる方がよっぽど親切かと思うんだけど、目的がよく分からないから
止めておきますね。失礼しました (^^;;

【19971】Re:BPM画像の大きさを取得したい
回答  ぎこ  - 04/11/21(日) 13:30 -

引用なし
パスワード
   http://hp.vector.co.jp/authors/VA023539/tips/bitmap/001.htm
このページを見ると、Bmpファイルの情報は、
BITMAPFILEHEADER
BITMAPINFO
の2つの構造体に収まってることがわかる。
(さらに、BITMAPINFOのメンバには、BITMAPINFOHEADERと、RGBQUADがある。)
と言うことは、画像サイズまでのオフセットは、固定なので、
以下の様な構造体を定義してもサイズを取得できる。

以下サンプル。

●標準モジュールへ
Option Base 0
Option Explicit

Private Type MY_BITMAPINFO
 strType As String * 2
 bytDummy(15) As Byte
 biWidth As Long
 biHeight As Long
End Type


●ユーザフォームへ
Private Sub CommandButton1_Click()
 Dim strPath As String
 Dim s As MY_BITMAPINFO
 
 strPath = ThisWorkbook.Path & "\test.bmp"

 Open strPath For Binary As #1: Get #1, , s: Close #1

 '先頭がBMの別ファイルならどうするか?
 '確立は、少ないけど、その辺も考慮すること。
 If s.strType = "BM" Then
  MsgBox "幅=" & s.biWidth & " : 高さ=" & s.biHeight
 End If

End Sub

【19972】Re:BPM画像の大きさを取得したい
発言  ぎこ  - 04/11/21(日) 13:38 -

引用なし
パスワード
   追記。
BITMAPCOREINFOもあるよ。

【19973】Re:BPM画像の大きさを取得したい
回答  かみちゃん  - 04/11/21(日) 14:00 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>もしかして、画像を表示せずに、縦横のサイズを取得したいということですか?
>そうなのです。しかも、単位をピクセルでサイズ取得したいのです。

Keinさんが紹介されたページを見ながら、書き換えてみました。
ただし、ピクセルではなくドット単位に取得しています。

Sub Macro1()
 Dim strFileName As Variant
 Dim strFolderName As Variant
 Dim i As Integer, i_Byte As Integer
 Dim b As Byte
 Dim FileSize As Long, x As Long, y As Long '4バイトずつ読み込むので必ずLong型

 Range("A1").Select
 strFileName = Application.GetOpenFilename _
  ("画像ファイル,*.bmp", 1, "画像ファイルを指定して下さい")

 If strFileName = False Then
  Exit Sub
 End If
 i = 2
 strFolderName = Left(strFileName, InStrRev(strFileName, "\")) & "*.bmp"
 strFileName = Dir(strFolderName)
 Do Until strFileName = ""
  Cells(i, 1).Value = strFileName
  '----------------------------------------
  'BMPファイル解析
  '----------------------------------------
  'ファイルを内部で開く
  Open strFileName For Binary As #1
  '1バイトから2バイト読み捨て
  For i_Byte = 1 To 2
   Get #1, , b
  Next
  'ファイルサイズを取得 3バイト目から4バイト(Long型変数で取得)
  Get #1, , FileSize
  '7バイトから12バイト読み捨て
  For i_Byte = 7 To 18
   Get #1, , b
  Next
  'イメージの幅(つまり横のドット数)を取得 19バイト目から4バイト(Long型変数で取得)
  Get #1, , x
  'イメージの高さ(つまり縦のドット数)を取得 23バイト目から4バイト(Long型変数で取得)
  Get #1, , y
  Close #1
  'BMPファイル解析 終了
  
  MsgBox "画像ファイル名 " & strFileName & vbCrLf & _
       "ファイルサイズ " & FileSize & vbCrLf & _
        "縦 " & y & vbCrLf & _
         "横 " & x
  
  strFileName = Dir
  i = i + 1
 Loop
 Range("A1").Select
End Sub

>そして、メッセージボックスではなく、セルに結果(ファイル名・幅・高さ)を表示したいのです。

Msgbox "aaa"

Cells(1,1)="aaa"
のよう感じで書けますので、ご自分で書き直してみてください。

【19977】Re:BPM画像の大きさを取得したい
発言  ぎこ  - 04/11/21(日) 19:16 -

引用なし
パスワード
   ▼かみちゃん さん:
>ただし、ピクセルではなくドット単位に取得しています。
そのドットがピクセルです。

あと、構造体を使わない方法で行くなら、ループで読み飛ばす必要ないです。

Private Sub CommandButton1_Click()
 Dim strPath As String
 Dim strType As String * 2
 Dim biWidth As Long
 Dim biHeight As Long
 
 strPath = ThisWorkbook.Path & "\test.bmp"

 Open strPath For Binary As #1
  Get #1, , strType
  Get #1, 19, biWidth’ファイルポインタを進める
  Get #1, , biHeight
 Close #1

 If strType = "BM" Then
  MsgBox "幅=" & biWidth & " : 高さ=" & biHeight
 End If

End Sub

厳密には、この方法でも駄目なことがあるかも。
以下、ヘルプより。
BITMAPINFO構造体またはBITMAPCOREINFO構造体は、 DIBファイル内のBITMAPFILEHEADER構造体の直後に置かれます。
BITMAPINFOと、BITMAPCOREINFOのサイズ用メンバは、異なる型…。

【19984】Re:BPM画像の大きさを取得したい
お礼  kk  - 04/11/22(月) 9:55 -

引用なし
パスワード
   みなさん、ありがとうございます。
思っていた通りに結果がでるプログラムに感動しました!!
私、全くの初心者なのに、いきなり高度なことをやろうとしていたのですね。
これから勉強して頑張ってみます。
また分からないことがあったらお世話になるかと思いますので、よろしくお願いいたします。
本当にありがとうございました。

10768 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free