クリップボードのbmpデータをダブルクリックで貼り付けて操作マニュアルお手軽作成

'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
'■
'■ クリップボードbmpデータをダブルクリックしたセルに、セルサイズに合わせて貼

’■ り付けるイベントマクロ
'■ 操作マニュアルを作るときにプリントスクリーンした画面ショットを次々に貼って

’■いくなど。
'■ 使い方

’■ マクロを埋め込みたいシートオブジェクトに記載する。
'■ ex.スクリーンショット⇒ダブルクリック
'■ ex. ctr+C⇒ダブルクリック
'■
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Dim myPic As Variant
  myPic = Application.ClipboardFormats 'クリップボード上のデータを取得

  '------------------step1クリップボードが空のとき、終了--------------
  If myPic(1) = True Then
    MsgBox "クリップボードは空です"
    Exit Sub
  End If

  '------------------step2クリップボードにデータがあるとき------------------
  Application.ScreenUpdating = False '画面更新停止

  Dim myRange As Range '画像を貼り付けるセル範囲(セル結合してもOK)
  Set myRange = Target  '画像(myPic)をこのセルの大きさに合わせて縮小する

  '縮小作業
  Dim rX As Double       'セル幅に合わせるための画像横倍率
  Dim rY As Double       'セル高さに合わせるための画像縦倍率
  Dim i As Long
  For i = 1 To UBound(myPic)       '1つのデータが複数形式で保持されることがあるのでbmpを探す(逆引き辞典パーフェクト)
    If myPic(1) = xlClipboardFormatBitmap Then
      ActiveSheet.Paste
      With ActiveSheet.Shapes(ActiveSheet.Shapes.Count)
        .Left = myRange.Left
        .Height = myRange.Height
        rX = myRange.Width / .Width      '横倍率
        rY = myRange.Height / .Height    '縦倍率

        '縦横の倍率の小さい方を基準倍率にする。
        If rX > rY Then '縦倍率の方が小さいとき
          .Height = .Height * rY - 6       '縦を縮める
        Else                                              '横倍率の方が小さいとき
          .Width = .Width * rX - 6         '横を縮める
        End If

        '中央に配置
        .Top = .Top + (myRange.Height - .Height) / 2 '余白をセル内上下均等に
        .Left = .Left + (myRange.Width - .Width) / 2   '余白をセル内左右均等に
      End With
      Exit For
    End If
  Next i
  Application.ScreenUpdating = True
  Cancel = True 'ダブルクリック操作をキャンセル
End Sub

 

================================================

数式をいじくって計算するのではなく、画像をうまく配置するという今までみてきたのと違うマクロ。こんなマクロも作れるのかと驚いた。

もと画像の縦横比率がこれで維持されるのだが、なぜ維持されるのかがわからない。

 

参考

 ExcelVBA逆引き辞典パーフェクト630(田中亨)