用VBA布局EXCEL報表的列寬問題


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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM