EXCEL的行高單位rowheight為磅值,列寬單位columnwidth為字寬,且字寬跟EXCEL的默認字體樣式有關。
這個“正文字體”,又跟當前EXCEL文件的主題字體有關:
列寬不僅與每個字符的“標准寬度”有關,還有一個“調整寬度”,因為EXCEL默認總是要使單元格每一個字符“清晰可見”。
用以下代碼,通過調整一系列columnwidth值,嘗試分析列寬columnwidth與實際寬度width的關系:
Sub aa() Dim bk As Workbook Set bk = ThisWorkbook Dim st As Worksheet, st1 As Worksheet Set st1 = bk.Worksheets(1) Set st2 = bk.Worksheets(2) Dim cw As Double, w As Double, i As Integer st2.Cells.Clear For i = 1 To 100 st1.Columns("A:A").ColumnWidth = i cw = st1.Cells(1, 1).ColumnWidth w = st1.Cells(1, 1).Width st2.Cells(i, 1).Value = cw st2.Cells(i, 2).Value = w'Debug.Print "cw" & cw & " w" & w & " w/cw" & w / cw Next i End Sub
得到以下結果:
1 12 2 18.75 3 25.5 4 32.25 5 39 6 45.75 7 52.5 8 59.25 9 66 10 72.75 11 79.5 12 86.25 ... ...
觀察其中關系,發現無論列寬columnwidth的“字符個數寬度”多少,“調整寬度”是固定的。
設每個字符對應的標准寬度為x,調整寬度為y,利用上述第1、2條數據有:
1 * x + y = 12
2 * x + y = 18.75
解之,x = 6.75 y = 5.25
故若每頁報表列數不一樣的時候,為了使每頁的總體實際寬度一直,在設置列寬的時候應注意單元格的“調整寬度” 。
當然,先要用一個函數,以實驗測試的方式,得到目標工作簿下的“標准字寬”和單元格“調整寬度”,比如這樣:
'用於計算當前EXCEL設置下的單元格字符標准寬度和調整寬度(磅值) Function getStandardCW() Dim c As Range Set c = ThisWorkbook.Worksheets(1).Cells(1, 1) Dim cw0 As Double, w As Double, w1 As Double cw0 = c.ColumnWidth c.ColumnWidth = 1 w = c.Width c.ColumnWidth = 2 w1 = c.Width c.ColumnWidth = cw0 getStandardCW = Array(w1 - w, 2 * w - w1) End Function
實際調整報表列寬的時候,獲取當前環境的一個單元格調整寬度相當於的columnWidth:
Dim gw As Double T = getStandardCW() gw = T(1) / T(0)
假若報表總列數為4時,為“標准情況”,那么在調整其他列數有差別的報表時,再分別調整:
超過/不足4列后的每一列,應該調整減少/增加1個gw。