我在Excel VBA中有一个报告生成器,到目前为止一直有效.它读取一些输入数据并生成格式化的Excel工作表作为结果.本表的最后一列填充了某种自由文本.
现在,有时自由文本不适合最后一列,它太宽了.由于此报告的所有行的行高都是固定的,因此我无法range.WrapText=True为此列设置(要让文本保持可见,必须增加行高).手动(非VBA)解决方案很简单:将文本分成几个部分并将其分布在不同的行上.例如:
A | B |C
content |This text is too wide for column B.
here |This text fits. |
is | |
fixed | |
Run Code Online (Sandbox Code Playgroud)
应该转化为
A | B |C
content |This text is too |
here |wide for column |
is |B. |
fixed |This text fits. |
Run Code Online (Sandbox Code Playgroud)
如果我能够使用VBA确定B列中内容的实际文本宽度(使用比例字体!),我可以轻松编写代码.range.ColumnWidth给出了列的实际宽度,但我不知道如何确定"此文本对于列B来说太宽".在VBA中.有什么建议?
(我目前正在使用Excel 2002/XP).
这将有效(2003年......肯定也在2002年).
With Columns("B:B")
oldWidth = .ColumnWidth
.EntireColumn.AutoFit ' Aha!
fitWidth = .ColumnWidth
.ColumnWidth = oldWidth ' Restore original width
If oldWidth < fitWidth Then
' Text is too wide for column.
' Do stuff.
End If
End With
Run Code Online (Sandbox Code Playgroud)
如果我是你,我不会陷入这种估计业务中......这只是要求意外的事情发生.
编辑:在评论中寻址点.
以上将自动将列添加到具有最宽文本的单元格.要仅考虑当前单元格中的文本,请将单元格文本复制到某个空白列并在那里执行自动调整.
如果你担心性能,那么你必须咬紧牙关并制作一个字符宽度的查找表.Chr(i)使用上述技术循环并测量每个角色的宽度.将结果存储在一个数组中,通过查找该数组中的char宽度并求和来创建一个函数来获取字符串的宽度.制作LUT会有一个初始成本,但是查找起来非常快,不可察觉.当然,LUT只对当前字体有效,所以每次运行代码时我都会重新创建它.如果行数和你说的一样多,那就值得付出代价.
NB:fitWidth上述将返回它是一种薄"白边"的字符加上一些小的值(0.29pt我的机器上)的宽度上美观的目的单元的两侧自动添加.记得从中减去它fitWidth以获得真正的字符宽度.您可以通过对"A"和"AA"进行自动调整来确定其宽度.它们之间的差异将是单个"A"的真实宽度.