根据列宽跨多行拆分文本

时间:2011-03-21 09:56:08

标签: excel vba

我在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)。

2 个答案:

答案 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列中的某些单元格并使用包装。如果文本下方有空格,合并中的一些额外行不会影响结果,因此计算行数可以保守地进行(错误偏高)