ExcelVBA技 全般 E13M012

E13M012 (Excel2000~2013)
図形描画の長さ単位にcm及びピクセルを用いる

VBAでは図形描画の長さ単位はポイント(pt)が用いられています。
従って、他の単位で設定するには、ポイント単位に変換する必要があります。
長さをcm単位で指定する場合の変換には Application.CentimetersToPoints メソッド が用意されています。
また、長さをピクセル(px)単位で設定する関数を併せて示します

'標準モジュール
Option Explicit
Option Private Module
Const LOGPIXELSX = 88
Const LOGPIXELSY = 90
#If VBA7 And Win64 Then
Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32" _
  (ByVal hDc As LongPtr, ByVal nIndex As Long) As Long
Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hWnd As LongPtr) As LongPtr
Private Declare PtrSafe Function ReleaseDC Lib "user32" _
  (ByVal hWnd As LongPtr, ByVal hDc As LongPtr) As Long
#Else
Private Declare Function GetDeviceCaps Lib "gdi32" _
  (ByVal hDc As Long, ByVal nIndex As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Sub ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hDc As Long)
#End If

'kpx2pt関数
'ピクセル単位の数値をポイント単位に変換
'px  :変換の対象となるピクセル単位の数値
'戻り値:ポイント単位の数値
Function kpx2pt(px As Long, Optional vertical As Boolean) As Double
  Dim hDc
  Static xx#, yy#
  If xx = 0 Then
    hDc = GetDC(0)
    xx = 72 / GetDeviceCaps(hDc, LOGPIXELSX) 'xDPI
    yy = 72 / GetDeviceCaps(hDc, LOGPIXELSY) 'yDPI
    ReleaseDC Application.hWnd, hDc
  End If
  kpx2pt = IIf(vertical, px * yy, px * xx) '0.6' 0.75
End Function

'kcm2pt関数
'センチメートル単位の数値をポイント単位に変換
'cm  :変換の対象となるセンチメートル単位の数値
'戻り値:ポイント単位の数値
Function kcm2pt(cm As Double) As Double
  kcm2pt = Application.CentimetersToPoints(cm)
End Function

'kpx2pt関数の使用例
'アクティブの図形を幅をピクセル単位で設定する
Sub example_kpx2pt()
  If VarType(Selection) <> vbObject Then Exit Sub
  With Selection.ShapeRange
    .Width = kpx2pt(150) '幅を150pxに
    .Height = kpx2pt(150, True) '高さを150pxに
  End With
End Sub

'kcm2pt関数の使用例
'アクティブの図形を幅をcm単位で設定する 図形を選択して実行
Sub example_kcm2pt()
  If VarType(Selection) <> vbObject Then Exit Sub '図形ではない
  With Selection.ShapeRange
    .Width = kcm2pt(5.5)  '幅を5.5cmに
    .Height = kcm2pt(5.5) '高さを5.5cmに
  End With
End Sub