我正在尝试以编程方式(C ++但VBA解释没问题)以像素为单位获取excel单元格的大小。 excel应用程序gui将单元格的大小显示为:
宽度: 8.28(160像素)高度: 24.6(41像素),字体为Arial 20 pt。
使用excel系列我可以得到:
ColumnWidth: 8.3 ,RowHeight: 24.6
范围宽度: 96 ,范围高度 24.6
我尝试使用PointsToScreenPixelsX和PointsToScreenPixelsY获取上述所有值,但是它们返回的值与excel gui所说的不匹配( 396 表示行/单元格高度, 136 表示列宽, 224 表示列宽。)
有什么想法吗?
答案 0 :(得分:5)
从点到像素的转换取决于您的DPI设置。有72个点到一英寸,所以如果你有96点,这是4/3英寸。如果你的DPI(在显示属性中)是120,则可以达到160像素。
换句话说,pixels = points * DPI / 72
。
但是,这不需要考虑缩放。 Excel中的ActiveWindow.Zoom
是百分比,因此例如200是正常大小的两倍。请注意,UI仍显示未校正的像素。
答案 1 :(得分:1)
excel应用程序gui将单元格的大小显示为:
宽度: 8.28(160像素)高度: 24.6(41像素),字体为Arial 20 pt。
首先让我澄清一下:应用程序gui 以十进制测量和像素测量显示列宽和高度,无论字体大小,屏幕大小,缩放等等。对于这些因素中的任何一个,如果Excel列宽为8.43,则始终将定义为64 像素。第二,我有点困惑,因为我的Excel版本(2010年版)和我记得的每个先前版本的标准列宽为8.43等于64 像素;同样,标准行高15等于20 像素,这似乎与OP的例子不匹配。
确定了这一点,一张海报问“为什么?”原因之一是:如果您正在调整列宽或行高,Excel允许在离散单位中,不幸的是,他们决定命名像素。也许它们与某些早期版本中的像素有关,但它们看起来与使用的单位一样随机 - 8.43是什么,英寸,皮卡,???不是缇,这是肯定的!在这里,我将其称为十进制单位。
无论如何,对于超过1.00的所有列宽,该离散像素单位是十进制单位的1/7。奇怪的是,1.00以下的列宽分为12个单元。因此,最大为2.00十进制单位的离散宽度如下:
0.08, 0.17, 0.25, 0.33, 0.42, 0.5, 0.58, 0.67, 0.75, 0.83, 0.92, 1.00,
1.14, 1.29, 1.43, 1.57, 1.71, 1.86, 2.00
2.00等于19 像素。是的,当你难以置信地摇头时,我会停下来,但这就是他们如何做到的。
幸运的是,行高似乎更均匀,1 像素等于0.75十进制单位; 10 像素等于7.50;标准行高20 像素等于15.00;等等。为了防止你需要在这些随机离散单元之间进行转换,这里有几个VBA函数:
Function ColumnWidthToPixels(ByVal ColWidth As Single) As Integer
Select Case Round(ColWidth, 4) ' Adjust for floating point errors
Case Is < 0:
ColumnWidthToPixels = ColumnWidthToPixels(ActiveSheet.StandardWidth)
Case Is < 1:
ColumnWidthToPixels = Round(ColWidth * 12, 0)
Case Is <= 255:
ColumnWidthToPixels = Round(12 + ((Int(ColWidth) - 1) * 7) _
+ Round((ColWidth - Int(ColWidth)) * 7, 0), 0)
Case Else:
ColumnWidthToPixels = ColumnWidthToPixels(ActiveSheet.StandardWidth)
End Select
End Function
Function PixelsToColumnWidth(ByVal Pixels As Integer) As Single
Select Case Pixels
Case Is < 0:
PixelsToColumnWidth = ActiveSheet.StandardWidth
Case Is < 12:
PixelsToColumnWidth = Round(Pixels / 12, 2)
Case Is <= 1790:
PixelsToColumnWidth = Round(1 + ((Pixels - 12) / 7), 2)
Case Else:
PixelsToColumnWidth = ActiveSheet.StandardWidth
End Select
End Function
答案 2 :(得分:-1)
示例强>
此示例确定活动窗口中所选单元格的高度和宽度(以像素为单位),并返回lWinWidth和lWinHeight变量中的值。
With ActiveWindow
lWinWidth = PointsToScreenPixelsX(.Selection.Width)
lWinHeight = PointsToScreenPixelsY(.Selection.Height)
End With