英寸(inch)是一种长度单位,通常用于衡量较小的物体的大小,例如屏幕尺寸、手机尺寸等。磅(Point,缩写为 pt)是一种常见的印刷单位,通常用于表示文字的大小。像素(Pixel)是组成数字图像的最基本的图像单元。
英寸、厘米、磅之间的互换
英寸、厘米、磅之间可以直接进行互换:
1 英寸(inch)= 2.54 厘米(cm)= 72 磅(point)
1 磅(point)= 1/72 英寸(inch)= 2.54/72 厘米(cm)≈ 0.035 厘米(cm)
1 厘米(cm)= 1/2.54 英寸(inch)= 72/2.54 磅(point)≈ 28.35 磅(point)
1 米(m)= 100 厘米(cm) = 1000 毫米(mm)
在 VBA 中,可以使用 Application 对象的 InchesToPoints 方法和 CentimetersToPoints 方法可将英寸和厘米换算为磅。
将英寸换算为磅:
' 换算1英寸等于72磅
Debug.Print Application.InchesToPoints(1)
将厘米换算为磅:
' 换算1厘米约等于28.35磅
Debug.Print Application.CentimetersToPoints(1)
除了使用 VBA 自带函数,还可以使用自定义函数来相互换算:
Function Point2Inch(ByVal dPoint As Double)
' Point 转 Inch
Point2Inch = dPoint / 72
End Function
Function Inch2Point(ByVal dInch As Double)
' Inch 转 Point
Inch2Point = dInch * 72
End Function
Function Point2Centimeters(ByVal dPoint As Double)
' Point 转 Centimeter
Point2Centimeters = dPoint / 72 * 2.54
End Function
Function Centimeters2Point(ByVal dCentimeter As Double)
' Centimeter 转 Point
Centimeters2Point = dCentimeter * 72 / 2.54
End Function
像素、磅之间的互换
在 Excel VBA 中,许多有关长度的单位都是磅,比如单元格的行高,Shape 对象的长宽等。要将像素转换为磅需要考虑屏幕像素密度,像素转换为磅的公式如下:
磅数 = 像素数 / 屏幕像素密度 * 72
像素数 = 磅数 * 屏幕像素密度 / 72
其中,屏幕像素密度(PPI, pixels per inch)表示每英寸的像素数,可以使用 VBA 得到当前屏幕的 PPI,详见:使用 VBA 获取屏幕分辨率和 PPI。例如,假设一个屏幕的像素密度为 200 PPI,我们要将 24 像素的元素转换为磅数,则磅数为:
磅数 = 24 / 200 * 72 = 8.64 磅
DPI (Dots Per Inch) 是指每英寸内打印或印刷出的点数,即在一英寸线性长度上能打印或印刷出的点的数量。比如,在 Word 中默认的像素和磅的换算关系为 96 DPI(dots per inch),即每英寸 96 个像素。根据这个换算关系,我们可以将像素转换为磅:
磅数 = 像素数 / 96 * 72
我们可以使用自定义函数来实现像素、磅之间的互换代码如下:
#If VBA7 And Win64 Then
Declare PtrSafe Function GetDC Lib "user32" (ByVal hWnd As LongPtr) As Long
Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal hWnd As LongPtr, ByVal hDC As Long) As Long
Declare PtrSafe Function GetDeviceCaps Lib "Gdi32" (ByVal hDC As LongPtr, ByVal index As Long) As Long
#Else
Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hDC As Long) As Long
Declare Function GetDeviceCaps Lib "Gdi32" (ByVal hDC As Long, ByVal index As Long) As Long
#End If
Function PPI()
Dim hDC As Long
' 获取句柄
hDC = GetDC(0)
Dim PPIX, PPIY
' 屏幕水平PPI
PPIX = GetDeviceCaps(hDC, 88) 'LOGPIXELSX = 88
' 屏幕垂直PPI
PPIY = GetDeviceCaps(hDC, 90) 'LOGPIXELSY = 90
PPI = PPIX
' 释放句柄
ReleaseDC 0, hDC
End Function
Function Point2Pixel(ByVal dPoint As Double)
' Point转Pixel
' PPI为每英寸像素数,由自定义函数 PPI 得到
Point2Pixel = dPoint / 72 * PPI
End Function
Function Pixel2Point(ByVal dPixel As Double)
' Pixel转Point
' PPI为每英寸像素数,由自定义函数 PPI 得到
Pixel2Point = dPixel * 72 / PPI
End Function