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 Variant03. Dim lowerwidth
As Variant, upwidth
As Variant, curwidth
As Variant04. Dim Count As Integer05. 06. '
关闭屏幕刷新07. Application.ScreenUpdating = False08. '
设置列宽为最大值09. ActiveCell.ColumnWidth = 25510. '
设置lowerwidth和upperwidth变量11. lowerwidth
= 012. upwidth =
25513. '
设置curwidth为最大允许值得一半14. ActiveCell.ColumnWidth = 127.515. curwidth =
ActiveCell.ColumnWidth16. '
设置count为0,这样当没有找到完全匹配值时不至于无限循环17. Count =
018. '
如果单元格宽度与指定值不同且循环计数少于20次的时候则继续循环19. While (ActiveCell.Width
<> points) And
(Count < 20)20. '
如过单元格宽度小于希望的单元格宽度21. If ActiveCell.Width <
points Then22. '
设lowerwidth为curwidth23. lowerwidth
= curwidth24. '
设置单元格宽度为curwidth和upwidthd的平均值25. Selection.ColumnWidth = (curwidth + upwidth) /
226. '
如过单元格宽度大于希望的单元格宽度27. Else28. '
设upwidth为curwidth29. upwidth =
curwidth30. '
设置单元格宽度为curwidth和lowerwidthd的平均值31. Selection.ColumnWidth = (curwidth + lowerwidth) /
232. End If33. '
设curwidth为目前列宽34. curwidth =
ActiveCell.ColumnWidth35. '
增加计数器36. Count =
Count + 137. Wend38.End
Sub
加载中…