ユーザーが選択した画像をワークシートに挿入するには次のようにします。
Sub Sample1() Dim PicFile As String PicFile = Application.GetOpenFilename() If PicFile = "False" Then Exit Sub ActiveSheet.Pictures.Insert PicFile End Sub
GetOpenFilenameメソッドで画像ファイルを指定して、PicturesコレクションのInsertメソッドで挿入します。簡単ですね。では、選択された画像の大きさを、挿入する前に取得するにはどうしたらいいでしょう。何となくVBAだけでは無理っぽい予感がしますので、ここはひとつ発想を変えて「とりあえず挿入してみて、挿入した画像の大きさを調べる」という手を検討してみます。挿入する画像(Sample.jpg)の大きさは、上のように「W283 × H212」です。
Sub Sample2() Dim PicFile As String PicFile = Application.GetOpenFilename() If PicFile = "False" Then Exit Sub ActiveSheet.Pictures.Insert PicFile With ActiveSheet.Pictures(1) MsgBox .Width & " × " & .Height End With End Sub
なんか微妙に違いますね。
実は、画像を挿入する前に、画像の大きさを取得するのは、けっこう簡単にできます。それもVBAの機能だけで。
Sub Sample3() Dim PicFile As String, P As Object PicFile = Application.GetOpenFilename() If PicFile = "False" Then Exit Sub ''選択した画像ファイルをオブジェクト型変数に格納する Set P = LoadPicture(PicFile) MsgBox CLng(P.Width * 0.0378) & " × " & CLng(P.Height * 0.0378) End Sub
LoadPicture関数は、引数に指定した画像ファイルをImageコントロールのPictureプロパティに設定するときなどに使います。LoadPicture関数はPicture型のオブジェクトを返しますが、このPicture型オブジェクトにはWidthプロパティとHeightプロパティが実装されています。
画像の大きさはピクセルですので、単位を変換するために0.0378を乗じています。これを応用すると、次のように画像を管理するUserFormなども作成できそうですね。
TreeViewコントロールやListViewコントロールの使い方は次のページを参照してください。
TreeViewでフォルダツリーを登録する部分は手を抜きましたが(^^; だいたい次のような感じです。
Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem) Image1.Picture = LoadPicture(TreeView1.SelectedItem.Key & "\" & Item) End Sub Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node) Dim TargetPath As String, buf As String, P As Object TargetPath = Node.Key buf = LCase(Dir(TargetPath & "\*.*")) Do While buf <> "" If Right(buf, 3) = "jpg" Or _ Right(buf, 3) = "gif" Or _ Right(buf, 3) = "bmp" Then Set P = LoadPicture(TargetPath & "\" & buf) With ListView1.ListItems.Add .Text = buf .SubItems(1) = FileLen(TargetPath & "\" & buf) .SubItems(2) = CLng(P.Width * 0.0378) .SubItems(3) = CLng(P.Height * 0.0378) End With End If buf = Dir() Loop End Sub