VBAで画像を表示し、スクロールバーを表示させる


◆概要
 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)
    Frame1.ScrollHeight =  CLng(obj.Height * 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.Width
    Frame1.Picture = obj

    '◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
    '必要であればスクロールの初期値位置を設定する
    Frame1.ScrollTop = 500
    Frame1.ScrollLeft = 200
    Frame1.Zoom = 80
    '◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
    
End Sub

◆シート側のマクロ

ユーザーフォームを先に宣言しておいて、表示したままExcelの選択行が変わったタイミングで画像だけ入れ替える。画像を見ながらひたすらEnterキーを押すことで画像だけ切り替えることができる。
------------------------------------------------------------------
  
Private frm As UserForm1
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  '例として画像のパスをA列の1行目から6行目までに設定
    If 1 <= Target.Row And Target.Row <= 6 Then
        If frm Is Nothing Then
            Set frm = New UserForm1
            frm.Show vbModeless
        End If
        
        frm.fstrPath = Sheet1.Range("A" & Target.Row)
        frm.SetImage
        Sheet1.Select
        
    End If
End Sub


PowerShellでEdgeを自動化(インストール不要。参考:郵便追跡サービス自動操作)

1.経緯について  RPAのソフトをインストールできないので、これまでVBSでCreateObjectでブラウザの自動操作をすることがたまにあった。 ※いざというときの手札として持っているだけで安心感が段違い  見た目上IEがインストールされていなくても、CreateObject...