我在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 | |
应该转化为
A | B |C
content |This text is too |
here |wide for column |
is |B. |
fixed |This text fits. |
如果我能够使用VBA确定B列中内容的实际文本宽度(使用比例字体!),我可以轻松编写代码。 range.ColumnWidth
给出了列的实际宽度,但我不知道如何确定“此文本对于列B来说太宽”。在VBA中的宽度。有什么建议吗?
(我目前正在使用Excel 2002 / XP)。
答案 0 :(得分:5)
这将有效(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
如果我是你,我不会陷入这种估计业务中......这只是要求意外的事情发生。
编辑:在评论中处理要点。
以上将自动将列添加到具有最宽文本的单元格。要仅考虑当前单元格中的文本,请将单元格文本复制到某个空白列并在那里执行自动调整。
如果您担心性能问题,那么您必须咬紧牙关并制作一个字符宽度查找表。循环浏览Chr(i)
并使用上述技术测量每个角色的宽度。将结果存储在一个数组中,通过查找该数组中的char宽度并求和来创建一个函数来获取字符串的宽度。制作LUT会有一个初始成本,但是查找起来非常快,不可察觉。当然,LUT只对当前字体有效,所以每次运行代码时我都会重新创建它。如果行数和你说的一样多,那就值得付出代价。
注意:上面的fitWidth
将返回字符PLUS的宽度一些小的值(在我的机器上为0.29pt),这是一种薄的“白边”,自动添加在单元的两侧以用于美学目的。记得从fitWidth
中减去它以获得真正的字符宽度。您可以通过对“A”和“AA”进行自动调整来确定其宽度。它们之间的差异将是单个“A”的真实宽度。
答案 1 :(得分:1)
对于一个应该是wysiwyg excel的应用程序,在一致的庄园中渲染字体的工作相当糟糕。您看到的内容因字体,字体大小,缩放级别而异,并且在屏幕和打印之间有所不同。抛出非比例字体会变得更糟。
计算字符串宽度的任何解决方案都将充满复杂性。
作为替代方案,请考虑合并B列中的某些单元格并使用包装。如果文本下方有空格,合并中的一些额外行不会影响结果,因此计算行数可以保守地进行(错误偏高)