基礎編ではファイル選択ダイアログから単純に画像の取得だけをするサンプルコードを紹介しましたが、VBAから画像を取得するのなら、貼付位置やサイズ調整なども指定して取得するほうが便利かと思います。
実用編ではそういった機能を盛り込んだサンプルコードと、調整のポイントを紹介します。
コードはできるだけコピペでそのまま組み込めるように書いたつもりですが、不要な部分は削除したり、値を変更するなど、必要に応じて調整してご利用ください。
Shapes.AddPictureメソッド
基礎編では解説の都合上、Pictures.Insertメソッドから紹介しましたが、実用編ではおすすめのShapes.AddPictureメソッドをメインに記載します。
特殊な事情がない限り、こちらを使ってもらうのが良いと思います。
ただ、1点だけ注意事項として、保護シートで使用する場合は、別途VBAからの変更ができる保護(保護処理の引数にUserInterfaceOnly:=Trueを付けたもの)をかけた上で使用してください。
Sub 画像取得_実用版_SA()
'=====基本設定=====
'取得シートの指定
Sheet1.Activate '★
'画像取得位置の指定
Dim GetRng As Range
Set GetRng = Range("B5") '★
'取得画像のサイズ指定(高さのピクセルサイズで指定)
Dim PictHeight As Long
PictHeight = 100 '★
'=====取得画像の選択=====
'画像取得ダイアログを開く
Dim PictName As String
PictName = Application.GetOpenFilename _
("画像(*.png; *.jpg; *.jpeg; *.gif),*.png; *.jpg; *.jpeg; *.gif", , "画像ファイルの選択")
'ダイアログでキャンセルした場合
If PictName = "False" Then Exit Sub
'=====画像の取得=====
On Error GoTo NextE 'エラー発生時の処理先
With ActiveSheet
'指定位置に原本サイズで取得(リンクなし)
Set GetPic = .Shapes.AddPicture( _
Filename:=PictName, _
LinkToFile:=False, _
SaveWithDocument:=True, _
Left:=GetRng.Left, _
Top:=GetRng.Top, _
Width:=-1, _
Height:=-1)
End With
'=====サイズ調整等=====
With GetPic
'縦横比固定で高さを基準にサイズを指定
.LockAspectRatio = msoTrue
.Height = PictHeight
'最前面に配置
.ZOrder msoBringToFront '最背面に配置する場合はmsoSendToBack
'画像のロック解除(保護シートでも操作できるようにするため)
.Locked = False
End With
'=====配置調整=====
'取得位置から対象画像を特定
Dim PictSP As Shape
For Each PictSP In ActiveSheet.Shapes
If Not Intersect(Range(PictSP.TopLeftCell, PictSP.BottomRightCell), GetRng) Is Nothing Then
'画像をセルの中央位置へ移動
ActiveSheet.Shapes(PictSP.Name).Left = GetRng.Left + (GetRng.Width - ActiveSheet.Shapes(PictSP.Name).Width) / 2
ActiveSheet.Shapes(PictSP.Name).Top = GetRng.Top + (GetRng.Height - ActiveSheet.Shapes(PictSP.Name).Height) / 2
End If
Next
'=====終了処理=====
'正常終了
Exit Sub
NextE: 'エラー発生時終了処理
'エラー発生時はメッセージを表示して収量
MsgBox "取得中にエラーが発生しました。", vbExclamation
End Sub
処理の概要
- 基本設定(重要)
- 取得画像の選択
- 画像の取得
- サイズ調整等(取得画像のプロパティ変更)
- 配置調整
- エラー対応(エラーが発生した場合のみ)
一覧として見やすいようセクションごとにリストアップしましたが、単にサンプルコード内に記載したコメントのとおりです。
一番上の赤字の基本設定は使う前に必ず見直してください。取得位置(どのシートのどのセルに画像を取得するか)や、サイズの指定はここでまとめてできるようにしています。
各処理の解説
簡単な解説を記載しておきます。これを見ればカスタマイズがしやすいと思います。
基本設定
基本設定は、先にも記載したように使う前に必ず変更してください。具体的には★印のついた行です。
Sheet1.Activateは取得シートの指定になります。サンプルコードではオブジェクト名で指定していますが、シート名でもインデックス番号でも大丈夫です。
画像取得位置の指定はRange(“B5”)を都合のいいセルに変更してください。このセルの真ん中に画像を取得します。(画像がセルより大きい場合は画像の中心がセルの中心になるよう配置されます。)
取得画像のサイズについては、取得処理の中で画像の縦横比を固定し、高さの指定で幅も比例してサイズ変更するようにしています。PictHeight = 100は画像の高さを100ピクセルにするという意味なので、ここを好みの数値に変更すればOKです。
取得画像の選択
ダイアログのファイルフィルターは次の赤字部分で行っています。
(“画像(*.png; *.jpg; *.jpeg; *.gif),*.png; *.jpg; *.jpeg; *.gif“, , “画像ファイルの選択”)
サンプルコードでは拡張子でダイアログに表示するファイルの種類を絞り込んでいます。
追加する場合はセミコロンで区切って同じ形式(; *.○○○)で追加すればダイアログに表示するファイルの種類を増やすことができますし、指定を減らせば絞り込めます。
もし、すべてのファイルを表示したい場合は、赤字部分をすべて削除し空欄にするか、「*.*」とだけ指定してください。
青地部分はダイアログの右下に出てくる案内(フィルター名)です。基本的には単に表示するだけの文字列なので好きに変更して差支えありません。
右側の「画像ファイルの選択」はダイアログウインドウの上に表示するタイトルです。ここも好きに変更できます。
なお、ダイアログでファイルを選択せずに「キャンセル」ボタンを押した場合は、”False”が返ります。その場合はIf PictName = “False” Then Exit Subによって処理を中断しています。
画像の取得
基礎編でも記載しましたが、Shapes.AddPictureメソッドは引数が省略できないためすべて記載する必要があります。
ここではとりあえず各引数について簡単に説明いたします。(赤字部分がサンプルコードの値)
引数 | 説明 |
---|---|
Filename:=PictName | 画像のフルパスを指定 (PictNameにはダイアログで選択したファイルのフルパスを格納) |
LinkToFile:=False | 画像リンクの取得はTrue、画像データを取り込む場合はFalse |
SaveWithDocument:=True | LinkToFileと逆の値を設定(True/False) |
Left:=GetRng.Left | 取得位置(起点セルの左端) (GetRngには基本設定で指定したセルを格納) |
Top:=GetRng.Top | 取得位置(起点セルの上端) (GetRngには基本設定で指定したセルを格納) |
Width:=-1 | 取得サイズの幅(-1は変更なし) |
Height:=-1 | 取得サイズの高さ(-1は変更なし) |
サイズ調整等
ここでは、次のことをしています。
- 画像の縦横比固定
- サイズ調整(高さで指定)
- 最前面へのレイアウト変更
- ロック解除
それぞれの処理をコード別に説明すると次のとおりです。
各処理 | 説明 |
---|---|
.LockAspectRatio = msoTrue | 縦横比固定、msoFalseで解除 |
.Height = PictHeight | 高さ指定 (PictHeightは基本設定で指定した高さ) |
.ZOrder msoBringToFront | 最前面にレイアウト (msoSendToBackで最背面に変更) |
.Locked = False | ロック解除(シート保護対応) |
配置調整
配置調整は取得した画像を、指定セルの中心に配置する処理です。
調整できる箇所は特にないと思いますが、不要な場合はブロックごと削除して大丈夫です。
一応、処理内容を簡単に言うと、取得位置から画像の存在を認識させ、画像の幅と高さから左上の起点ピクセルを算出して配置しています。
エラー対応
画像の取得処理の1行目のOn Error GoTo NextEというコードは、「この行以降で何らかのエラーが発生した場合に、その時点から終盤のNextE:の位置まで処理をジャンプする」ということです。サンプルコードではジャンプ先でエラーメッセージを表示するだけです。
ちなみに、エラーが出ずに正常に処理が進んだ場合、このNextE:の前で処理を終了しないと、正常に進んだにも関わらずエラーメッセージを表示してしまいます。
そのため、NextE:の前のExit Subは消さないようにしてください。
Pictures.Insertメソッド
いらないとは思いますが、一応、Pictures.Insert版のものも書いておきます。
Sub 画像取得_実用版_PI11()
'=====基本設定=====
'取得シートの指定
Sheet1.Activate '★
'画像取得位置の指定
Dim GetRng As Range
Set GetRng = Range("B5") '★
'取得画像のサイズ指定(高さのピクセルサイズで指定)
Dim PictHeight As Long
PictHeight = 100 '★
'=====取得画像の選択=====
'画像取得ダイアログを開く
Dim PictName As String
PictName = Application.GetOpenFilename _
("画像(*.png; *.jpg; *.jpeg; *.gif),*.png; *.jpg; *.jpeg; *.gif", , "画像ファイルの選択")
'ダイアログでキャンセルした場合
If PictName = "False" Then Exit Sub
'=====画像の取得=====
On Error GoTo NextE 'エラー発生時の処理先
With ActiveSheet.Pictures.Insert(PictName)
.Top = GetRng.Top
.Left = GetRng.Left
.CopyPicture 'クリップボードにコピー(リンク切れなしの画像とするためのコピー)
.Delete 'リンク画像を削除
End With
'上記でコピーした画像を貼り付け(これでリンク切れなしの画像になる)
GetRng.Select '貼り付ける場所を指定
ActiveSheet.Paste
'=====サイズ調整=====
'縦横比を固定
Selection.ShapeRange.LockAspectRatio = msoTrue
'サイズ調整
Selection.ShapeRange.Height = PictHeight
'=====ロック解除と配置調整=====
'取得位置から対象画像を特定
Dim PictSP As Shape
For Each PictSP In ActiveSheet.Shapes
If Not Intersect(Range(PictSP.TopLeftCell, PictSP.BottomRightCell), GetRng) Is Nothing Then
'画像のロック解除(保護シートでも操作できるようにするため)
PictSP.Locked = False
'画像をセルの中央位置へ移動
ActiveSheet.Shapes(PictSP.Name).Left = GetRng.Left + (GetRng.Width - ActiveSheet.Shapes(PictSP.Name).Width) / 2
ActiveSheet.Shapes(PictSP.Name).Top = GetRng.Top + (GetRng.Height - ActiveSheet.Shapes(PictSP.Name).Height) / 2
End If
Next
'=====終了処理=====
'正常終了
Exit Sub
NextE: 'エラー発生時終了処理
'エラー発生時はメッセージを表示して収量
MsgBox "取得中にエラーが発生しました。", vbExclamation
Exit Sub
End Sub
各処理の概要はShapes.AddPictureメソッドとほとんど共通です。
若干処理の手順が異なる部分はありますが、各処理の概要についてはShapes.AddPictureメソッドの解説を見ればわかると思うので、必要に応じて確認してみてください。
まとめ
単に画像の取得をしたいだけなら、挿入メニューから普通に取得すればいいという話になります。
では今回紹介したコードがどういう役に立つかというと、主には次の2つのシーンになると思います。
- 保護シートでの画像取得
- 配置やサイズの調整自動化
具体的には、他者と共有するような入力様式など一般的にシート保護をかけて使用するファイルでの利用が考えられますし、多くの画像取得を行う場合は配置やサイズの調整ができるだけで手間が省けて便利です。
なお、保護シートでの利用に関しては繰り返しになりますが、別途VBAからの変更ができる保護(保護処理の引数にUserInterfaceOnly:=Trueを付けたもの)をかけた上で使用しないとエラーになりますのでご注意ください。
また、サンプルコードの利用に当たっては自己責任でお願いします。
以上、簡単ですが、ダイアログから画像を取得するサンプルコードの紹介でした。
コメント