Excel中以Point单位精确设置列宽ColumnWidth
(2018-05-23 18:08:02)
标签:
excelvbaword代码 |
分类: VBA专区 |
Excel中单元格有Width和Height的属性, 这两个属性以Point为单位,但它们只是可读属性, 如果需要设置行高和列宽的话, 要用到另两个可写属性RowHeight和ColumnWidth。RowHeight属性同样以Point为单位,实际上就等于Height属性。 但ColumnWidth属性和Width属性不同,下面是ColumnWidth属性的说明。
ColumnWidth 属性
返回或设置指定区域中所有列的列宽。Variant 类型,可读写。
说明
一个列宽单位等于”常规”样式中一个字符的宽度。对于比例字体,则使用字符“0”(零)的宽度。如果区域中所有列的列宽都相等,ColumnWidth 属性返回该宽度值。如果区域中的列宽不等,本属性返回 Null。
ColumnWidth属性用的是列宽单位,就是说一列的ColumnWidth值刚好就是在“常规”样式下单元格可容纳的0的个数。这个“常规”样式说的是创建这个文件时使用StandardFont属性和StandardFontSize属性的“常规”(regular)样式。例如,ColumnWidth为10的单元格,使用默认字体,可以显示非粗体、非斜体和Arial的10个“0”。Excel使用数字的个数来作为列宽单位以确保当你改变一个工作表的字体时,列会自动扩大或收缩来适应显示指定数目的字符。
正因为ColumnWidth属性,没有直接方法以Point或Pixel来完全正确地设置列的宽度。使用ActiveCell.Width/ActiveCell.ColumnWidth这个比例可以近似地调整列宽到指定的Point值,但仍然会有一些误差。
微软的帮助文件介绍了一个方法以英寸或厘米来精确设置列宽,通过循环来一步一步的调整列宽达到指定的值。但是它的示例中都使用Integer变量,没有考虑到小数点的问题,出来的结果和设定值仍然有误差。这里将定义变量修改成Variant类型,并做成传递以Point为单位的值的自定义过程,这样就可以精确的使用Point、Inch、cm或Pixel来精确地设置列宽了。Inch和Pixel到Point的转换可以参考另一篇文章。
01.
Sub
ColumnWidthInPoints(points
As
Variant
)
02.
Dim
savewidth
As
Variant
03.
Dim
lowerwidth
As
Variant
, upwidth
As
Variant
, curwidth
As
Variant
04.
Dim
Count
As
Integer
05.
06.
'
关闭屏幕刷新
07.
Application.ScreenUpdating =
False
08.
'
设置列宽为最大值
09.
ActiveCell.ColumnWidth = 255
10.
'
设置lowerwidth和upperwidth变量
11.
lowerwidth
= 0
12.
upwidth =
255
13.
'
设置curwidth为最大允许值得一半
14.
ActiveCell.ColumnWidth = 127.5
15.
curwidth =
ActiveCell.ColumnWidth
16.
'
设置count为0,这样当没有找到完全匹配值时不至于无限循环
17.
Count =
0
18.
'
如果单元格宽度与指定值不同且循环计数少于20次的时候则继续循环
19.
While
(ActiveCell.Width
<> points)
And
(Count < 20)
20.
'
如过单元格宽度小于希望的单元格宽度
21.
If
ActiveCell.Width <
points
Then
22.
'
设lowerwidth为curwidth
23.
lowerwidth
= curwidth
24.
'
设置单元格宽度为curwidth和upwidthd的平均值
25.
Selection.ColumnWidth = (curwidth + upwidth) /
2
26.
'
如过单元格宽度大于希望的单元格宽度
27.
Else
28.
'
设upwidth为curwidth
29.
upwidth =
curwidth
30.
'
设置单元格宽度为curwidth和lowerwidthd的平均值
31.
Selection.ColumnWidth = (curwidth + lowerwidth) /
2
32.
End
If
33.
'
设curwidth为目前列宽
34.
curwidth =
ActiveCell.ColumnWidth
35.
'
增加计数器
36.
Count =
Count + 1
37.
Wend
38.
End
Sub