以像素为单位获取excel单元格的大小

时间:2011-05-06 21:26:05

标签: c++ excel vba

我正在尝试以编程方式(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 表示列宽。)

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

从点到像素的转换取决于您的DPI设置。有72个点到一英寸,所以如果你有96点,这是4/3英寸。如果你的DPI(在显示属性中)是120,则可以达到160像素。

换句话说,pixels = points * DPI / 72

但是,这不需要考虑缩放。 Excel中的ActiveWindow.Zoom是百分比,因此例如200是正常大小的两倍。请注意,UI仍显示未校正的像素。

答案 1 :(得分:1)

OP表示:

  

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