1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【VBA】外部の画像を読込んで、リンクを作成する

Posted at

#はじめに#
備忘録として投稿します。
Excelに画像を読込んで、読込んだ画像にリンクを設定するマクロです。
画像をクリックすると、元の画像が表示されるようにします。

このマクロを書いたのは、入力された情報をもとにレポートを作成し、固定の枠に(セルが結合されていてもOK)画像を差し込むときに作りました。

#調整が必要だったこと#
わりと簡単に出来るのですが、細かい部分で調整が必要でした。
・画像を差し込む枠から、画像が少しはみ出る。(枠の内側に収まるようにtop,leftの位置を「+1」して調整)
・画像を枠のサイズに合わせると、画像がゆがむ。(画像の縦横比率を維持したまま、縮小する。)
・画像を縮小すると、少しはみ出る。(1%だけ小さくする。)

#コード#
コードの細かい説明は、コメントに書きました。

Private Sub PictureLinkAdd(ByVal strSheetName As String, ByVal strRange As String, ByVal strPicturePath As String)
'*************************************
'画像リンクを作成します。
'*************************************
'<注意>
’シートの表示を「標準」にしておかないと画像がずれて配置される事がありました。

    On Error GoTo PictureLinkAddErr
    
    'オブジェクトをセット
    Dim objSheet As Worksheet
    Set objSheet = ThisWorkbook.Sheets(strSheetName)
    
    '画像の取り込み
    'top,leftの位置を枠の内側に収まるように「+1」して調整する。
    With objSheet.Shapes.AddPicture( _
            FileName:=strPicturePath, _
            LinkToFile:=False, _
            SaveWithDocument:=True, _
            Left:=objSheet.Range(strRange).Left + 1, _
            Top:=objSheet.Range(strRange).Top + 1, _
            Width:=0, _
            Height:=0)
        '一旦、元のサイズに戻す
        .ScaleHeight 1, msoTrue
        .ScaleWidth 1, msoTrue
        'サイズ調整、枠内に収める(アスペクト比を変えずに画像のサイズ調整)
        Dim objRange As Range
        Set objRange = objSheet.Range(strRange)
        Dim dblScal As Double
        If objRange.Width / .Width < objRange.Height / .Height Then
            dblScal = WorksheetFunction.RoundDown(objRange.Width / .Width, 2)
        Else
            dblScal = WorksheetFunction.RoundDown(objRange.Height / .Height, 2)
        End If
        Set objRange = Nothing
        '画像がはみ出さないように「1%」だけ小さくする
        dblScal = dblScal - 0.01
        .Width = .Width * dblScal
        .Height = .Height * dblScal
    End With
    '画像にハイパーリンクを作成する(画像をクリックすると画像を開くようになる)
    'objSheet.Shapes.Countは、最後に追加されたオブジェクト(=自分で追加した画像オブジェクト)のインデックスを得るために使っています。
    objSheet.Hyperlinks.Add Anchor:=objSheet.Shapes(objSheet.Shapes.Count), Address:=strPicturePath
    
    Exit Sub

PictureLinkAddErr:
'ここで起きたエラーはスルーする。
'調査の時は、on error gotoをコメントにして下さい。
    Err.Number = 0
    Set objSheet = Nothing
End Sub

#最後に#
最初は難しく思いましたが、案外簡単に出来ます。
※シートの表示を「標準」にしておかないと画像がずれてしまう事があるので、注意してください。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?