◆概要
VBAのフォームに画像を表示する際に、スクロールバーを付けて表示させる。
同じ様式の画像の差異をチェックするために、Excelの選択行にファイルパスを設定して起き、カーソル移動で画像の表示を変更する。
スクロールバーを表示させるためにFrameコントロールを利用するが、ScrollHeightとScrollWidthに設定する値が難しい。いろいろとネットを見ているとLoadPictureで読み込んだ画像に「24/635」をかけることで、画像プロパティの詳細設定にある幅、大きさを算出することができる。0.0378をかけているサンプルも多い
※24はビット深さ?635はわからない・・・。
Dim obj As Object
Set obj = LoadPicture(fstrPath)
'画像の大きさはピクセルなので単位変換
'MsgBox "H" & CLng(obj.Height * 24 / 635) & " W" & CLng(obj.Width * 24 / 635)
'画像の大きさはピクセルなので単位変換
'MsgBox "H" & CLng(obj.Height * 24 / 635) & " W" & CLng(obj.Width * 24 / 635)
Frame1.ScrollHeight = CLng(obj.Height * 24 / 635)
Frame1.ScrollWidth = CLng(obj.Width * 24 / 635)
Frame1.ScrollWidth = CLng(obj.Width * 24 / 635)
なんだか係数の理由がわからないのが怖いので、今回はImageコントロールを使って幅と大きさを取得する。
◆ユーザーフォームのマクロ
画面上にImageコントロールとFrameコントロールを配置する。
fstrPathには画像パスを設定する。
------------------------------------------------------------------
Public fstrPath As String
Public Sub SetImage()
Dim obj As Object
Set obj = LoadPicture(fstrPath)
'AutoSizeをTrueにしておいて画像に合わせてImageコントロールのサイズが変わるようにしておく
Image1.Visible = False
Image1.AutoSize = True
Image1.Picture = obj
Frame1.ScrollBars = fmScrollBarsBoth
Frame1.ScrollHeight = Image1.Height
Frame1.ScrollWidth = Image1.WidthFrame1.Picture = obj'◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
'必要であればスクロールの初期値位置を設定する
Frame1.ScrollTop = 500
Frame1.ScrollLeft = 200
Frame1.Zoom = 80
'◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆End Sub
◆シート側のマクロ
ユーザーフォームを先に宣言しておいて、表示したままExcelの選択行が変わったタイミングで画像だけ入れ替える。画像を見ながらひたすらEnterキーを押すことで画像だけ切り替えることができる。
------------------------------------------------------------------
Private frm As UserForm1Private Sub Worksheet_SelectionChange(ByVal Target As Range)'例として画像のパスをA列の1行目から6行目までに設定If 1 <= Target.Row And Target.Row <= 6 ThenIf frm Is Nothing ThenSet frm = New UserForm1frm.Show vbModelessEnd Iffrm.fstrPath = Sheet1.Range("A" & Target.Row)frm.SetImageSheet1.SelectEnd IfEnd Sub