2011-05-06 225 views
2

我想以编程方式(C++但VBA解释正常)以像素为单位获取excel单元格的大小。 excel应用程序gui将单元格大小显示为:
宽度:8.28(160像素)高度:24.6(41像素),字体是Arial 20 pt。以像素为单位获取excel单元格的大小

使用Excel的范围,我可以得到:
columnWidth时:8.3,rowHeight的:24.6
范围宽:,距离高度24.6

我使用PointsToScreenPixelsX和PointsToScreenPixelsY尝试对于所有上述值,但它们返回的值与Gui表示的不匹配(行/单元格高度,1对于列宽度为36,对于列宽度为)。

任何想法?

+1

这些时髦值可能缇测量(http://en.wikipedia.org /维基/缇)。如果您想将缇转换为像素,请查看此Microsoft文章:http://support.microsoft.com/kb/94927 – ray 2011-05-07 02:08:46

回答

5

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

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

但是,这不考虑放大。 Excel中的ActiveWindow.Zoom是一个百分比,所以例如200是正常大小的两倍。请注意,用户界面仍然显示未放大的像素。

-1

本示例确定在活动窗口所选择的单元格的高度和宽度(以像素为单位),并在lWinWidth和lWinHeight变量返回的值。

With ActiveWindow 
    lWinWidth = PointsToScreenPixelsX(.Selection.Width) 
    lWinHeight = PointsToScreenPixelsY(.Selection.Height) 
End With 
+0

您能解释我得到的奇怪值吗? (这在我的帖子中详细描述,我试图使用你正在建议的......) – 2011-05-06 22:00:07

+0

+1。这适用于我,但只是大约。 :)如果我开始一个新工作表,并将宽度写入单元格A1,使用默认的Calibri 11字体,单元格显示为108,Excel的UI显示为109.如果我将字体大小增加到20,单元格显示为119,用户界面显示我124.我认为这是进入字体字符填充和比例字体的东西在这一点上... – 2011-05-06 22:18:26

+0

这不是什么OP说他已经尝试过了吗? – 2011-05-07 09:51:34

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个像素。是的,我会停下来,而你难以置信地摇头,但他们是这样做的。

幸运的是,行高看起来更均匀,其中像素等于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 
相关问题