2011-05-06 183 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 
相關問題