根据列宽跨多行拆分文本

Doc*_*own 4 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      |                 |
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).

Jea*_*ett 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
Run Code Online (Sandbox Code Playgroud)

如果我是你,我不会陷入这种估计业务中......这只是要求意外的事情发生.


编辑:在评论中寻址点.

以上将自动将列添加到具有最宽文本的单元格.要仅考虑当前单元格中的文本,请将单元格文本复制到某个空白列并在那里执行自动调整.

如果你担心性能,那么你必须咬紧牙关并制作一个字符宽度的查找表.Chr(i)使用上述技术循环并测量每个角色的宽度.将结果存储在一个数组中,通过查找该数组中的char宽度并求和来创建一个函数来获取字符串的宽度.制作LUT会有一个初始成本,但是查找起来非常快,不可察觉.当然,LUT只对当前字体有效,所以每次运行代码时我都会重新创建它.如果行数和你说的一样多,那就值得付出代价.

NB:fitWidth上述将返回它是一种薄"白边"的字符加上一些小的值(0.29pt我的机器上)的宽度上美观的目的单元的两侧自动添加.记得从中减去它fitWidth以获得真正的字符宽度.您可以通过对"A"和"AA"进行自动调整来确定其宽度.它们之间的差异将是单个"A"的真实宽度.