エビデンス貼付マクロその3
1 その3の経緯
その2では画像があったら勝手に消した.さすがに乱暴なので,消すか消さないか選択できるようにしようかと考えたが,画像があったらジャンプして下に行けばよいことに気付いた.
2 コード
(1)同一フォルダ内の画像を貼付
'** '* 画像貼付のセル結合対応版 '* 貼付順をコントロールするためにファイル名に数字をふること '* 画像があったら,そのセルを飛ばして下のセルに貼る. Sub 画像貼付8() Application.ScreenUpdating = False '前提:MicroSoft Scripting Runtime を事前に参照設定しておくこと With New FileSystemObject Dim myFolder As Folder: Set myFolder = .GetFolder(ThisWorkbook.Path) Dim myFiles As Files: Set myFiles = myFolder.Files End With '貼付開始位置 Dim my貼付セル As Range: Set my貼付セル = ActiveCell Dim my貼付ファイル As file For Each my貼付ファイル In myFiles '画像ファイル以外(設定ファイルなどの隠しファイル)はスキップ If Not (isPicture(my貼付ファイル)) Then GoTo Continue '貼付セル決定(重複張り付けを防止) Call slideToNoPictureCell(my貼付セル) '貼付 Call PastePicture(my貼付ファイル, my貼付セル) '貼付先セルを1つ下の(結合)セルに移動 Set my貼付セル = my貼付セル.Offset(1, 0) '画像ファイル以外(隠しファイルなど)ならNext(次ファイル)へ Continue: Next my貼付ファイル Application.ScreenUpdating = False MsgBox "完了" End Sub '** '* 画像ファイルかどうか,拡張子をチェック '* Function isPicture(targetFile As file) '前提:MicroSoft Scripting Runtime を事前に参照設定しておくこと With New FileSystemObject Select Case .GetExtensionName(targetFile) Case "jpeg", "jpg", "gif", "png", "bmp" isPicture = True Case Else isPicture = False End Select End With End Function '** '* セルに画像があったら,その下にずれていく. Sub slideToNoPictureCell(ByRef my貼付セル As Range) Dim myshape As Shape For Each myshape In ActiveSheet.Shapes If myshape.TopLeftCell.Address = my貼付セル.Address Then my貼付セル = my貼付セル.Offset(1, 0) End If Next '再帰呼び出し Call slideToNoPictureCell(my貼付セル) End Sub '** '* 結合セルにも対応するため,MergeAreaを使用している Sub PastePicture(my貼付画像 As file, my貼付セル As Range) '仮に縦横サイズ0で(引数Width,Height(ポイント単位)が省略不可なので) With ActiveSheet.Shapes.AddPicture( _ Filename:=my貼付画像.Path, _ linktofile:=False, _ savewithdocument:=True, _ Left:=my貼付セル.MergeArea.Left, _ Top:=my貼付セル.MergeArea.Top, _ Width:=0, _ Height:=0) ' ’既に入力済の文字が消えてよければ右横にファイル名を書いておくのもアリかも. 'my貼付セル.Offset(0, 1).Value = myfile.Name ' '縦横比1倍に戻す .ScaleHeight 1, msoTrue .ScaleWidth 1, msoTrue '画像を縮小してセルに収める Dim my横倍率 As Double: my横倍率 = my貼付セル.MergeArea.Width / .Width Dim my縦倍率 As Double: my縦倍率 = my貼付セル.MergeArea.Height / .Height If my縦倍率 > my横倍率 Then Dim my縮小率 my縮小率 = my横倍率 Else my縮小率 = my縦倍率 End If Const my余白ポイント As Long = 6 'どれだけ枠から離すかは好み .Width = .Width * my縮小率 - my余白ポイント '左右 .Height = .Height * my縮小率 - my余白ポイント '上下 '画像を縦横の中央に配置(余白を上下左右均等に割り振る) ''例 横長画像を正方形セルに入れるなら、左右余白は3ずつになる(横長画像なら上下は余白大きい) .Left = .Left + (my貼付セル.MergeArea.Width - .Width) / 2 .Top = .Top + (my貼付セル.MergeArea.Height - .Height) / 2 End With End Sub
(2)削除
貼付をやり直したいときなどに,アクティブセルのある列の画像を全部消す
'** '** '* 特定列の画像を全部消す '* Sub deletePictureInColumn() If MsgBox("現在選択しているセルの列にある画像等を全部消しますか.", vbYesNo, "削除したら元に戻せません") = vbNo Then Exit Sub End If Dim myshape As Shape For Each myshape In ActiveSheet.Shapes If myshape.TopLeftCell.Column = ActiveCell.Column Then myshape.Delete End If Next Dim m As String: m = "" m = m & "現在選択しているセルの列にある画像等を削除しました." & vbNewLine m = m & "誤って削除した場合は,ファイルを保存しないで閉じてください" MsgBox m End Sub
3