如何以绝对单位设置列宽

时间:2014-10-17 23:05:21

标签: excel vba

我想出来并在下面发布了问题陈述和解决方案:

我一直在尝试这样做,因此无论用户设置如何,我创建的电子表格中的边距和列宽都是相同的,因此它会为所有用户打印相同的内容。我能提出的唯一方法涉及两个宏。一个宏将测量行,列和边距,并将其存储在PC上的Excel文件中的单元格中,其中所有内容都在查找和打印。在用户打印之前,第二个宏取这些值并将边距等设置为正确的值。

我的问题是ColumnWidth函数测量与默认字体相关的单位行,可以在用户设置中更改。为了解决这个问题,我尝试使用.width(以pts为单位测量),但我刚刚了解到这个函数可以测量宽度但不能设置它。但我意识到我所要做的就是在第二个宏中选择要测量的列,并使用该测量和原始测量来得出转换因子。

这是第一个宏的列测量部分(我最初有一个循环,但我意识到我只需要测量一列):

 'Collumn Width
  .Cells(249, 84).Value = .Cells(1, 1).Width
  For i = 1 To 65
     .Cells(250 + i, 81).Value = .Cells(1, i).ColumnWidth
  Next i

以下是具有适当转换因子的第二个宏的校正列宽设置部分:

'Set Column Widths
'[column width in current font]
'*[correct width of any collumn in pts]/[current width of same column in pts]
For j = 1 To 65
With ActiveWorkbook.ActiveSheet
    .Columns(j).ColumnWidth = .Cells(250 + j, 81).Value * _
        .Cells(249, 84).Value / .Cells(1, 1).Width
End With
Next j

3 个答案:

答案 0 :(得分:3)

我相信RowHeight属性以点数设置高度。它是columnWidth属性,它根据默认字体大小设置宽度。

但是,列的Width属性以磅为单位读取宽度。您可能无法准确设置列宽,但这里有一种方法可以让您关闭,将高度和宽度设置为72点。

Option Explicit
Sub SetWidthHeightPoints()
    Const dWidth As Double = 72
    Const dHeight As Double = 72
    Dim RW As Range, COL As Range
Set RW = ActiveSheet.Rows(1)
Set COL = ActiveSheet.Columns(1)

RW.RowHeight = dHeight
COL.ColumnWidth = dWidth / COL.Width * COL.ColumnWidth
COL.ColumnWidth = dWidth / COL.Width * COL.ColumnWidth

MsgBox "Row Height: " & RW.Height & vbLf & "Column Width: " & COL.Width

End Sub

修改

@AlexPeters提出了一个很好的建议,通过将列宽调整放入循环,可以得到与所需结果更接近的结果。我们循环直到没有变化,并且对循环次数设置限制为10:

Option Explicit
Sub SetWidthHeightPoints()
    Const dWidth As Double = 72
    Const dHeight As Double = 72
    Dim RW As Range, COL As Range
Set RW = ActiveSheet.Rows(1)
Set COL = ActiveSheet.Columns(1)

Dim CNT As Long, lastWidth As Double

RW.RowHeight = dHeight

CNT = 0
Do Until CNT = 10 Or COL.Width = lastWidth
    lastWidth = COL.Width
    COL.ColumnWidth = dWidth / COL.Width * COL.ColumnWidth
    CNT = CNT + 1
Loop

MsgBox "Row Height: " & RW.Height & vbLf & "Column Width: " & COL.Width _
        & vbLf & "Required: " & CNT & " iterations"

End Sub

答案 1 :(得分:0)

' 以节省太多循环

'使用像'大动作后小动作

' WidthColumn WidInPts, CI, 5

' WidthColumn WidInPts,CI,0.5

' '

Sub WidthColumn(ColWid!, ColNum&, ChangeBy!)

'太大

While Columns(ColNum + 1).Left - Columns(ColNum).Left > ColWid

  Columns(ColNum).ColumnWidth = Columns(ColNum).ColumnWidth - ChangeBy

温德

'太小

While Columns(ColNum + 1).Left - Columns(ColNum).Left < ColWid

  Columns(ColNum).ColumnWidth = Columns(ColNum).ColumnWidth + ChangeBy

温德

' 靠近它 '看结果 ' 单元格(2, ColNum) = Columns(ColNum).ColumnWidth 'Cells(3, ColNum) = ColWid

结束子

答案 2 :(得分:-1)

使用.RowHeight。

更多信息herehere