根据列宽将文本分割成多行

我在Excel VBA中有一个报表生成器,目前工作。 它读取一些input数据,并生成一个格式化的Excel表格作为结果。 这张表的最后一列填有一些自由文本。

现在,有时自由文本不适合最后一列,它太宽了。 由于此报表中所有行的行高都是固定的,因此无法为此列设置range.WrapText=True (要让文本保持可见状态,则必须增加行高度)。 手动(非VBA)解决scheme非常简单:将文本分成几个部分,并将其分散在不同的行上。 例如:

 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中。 有什么build议么?

(我目前正在使用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 

如果我是你的话,我不会陷入这个评估业务。这只是要求意外的事情发生。


编辑:解决您的评论中的点。

以上将AutoFit列到最宽的文本的单元格。 要仅考虑当前单元格中的文本,请将单元格文本复制到某个空白列中,然后在那里执行AutoFit。

如果你关心性能,那么你必须咬牙切齿,制作一个字符宽度的查找表。 循环Chr(i)并使用上述技巧测量每个字符的宽度。 将结果存储在一个数组中,通过查找该数组中的字符宽度和求和来获得一个string宽度的函数。 制作LUT将会有一个初始成本,但查找起来会非常快,不可思议。 当然,LUT只对当前字体有效,所以每次运行代码时都要重新创build它。 如果您所说的行数很多,那就值得您付出代价。

注意:上面的fitWidth会返回字符的宽度加上一些小的值(0.29pt在我的机器上),这是一种薄薄的“白边”,自动添加在单元格的两侧用于审美目的。 请记住从fitWidth减去以获得真正的字符宽度。 您可以通过在“A”和“AA”上进行自动调整来弄清楚有多宽。 这些差异将是单个“A”的真实宽度。

对于一个应用程序来说,这个应用程序是一个非常糟糕的工作,以一致的方式呈现字体。 您看到的内容因字体,字体大小,缩放级别而异,并且在屏幕和打印之间也有所不同。 扔在不成比例的字体,它变得更糟。

计算string宽度的任何解决scheme都将充满复杂性。

作为替代,考虑合并列B中的一些单元格并使用换行。 如果文本下面有空格,则合并中的多个行不会影响结果,因此可以保守地计算行数(错误高)