如何使用VBA检测不适合Excel单元格的值?

我们正在使用各种工具生成长的Excel工作表,这些工具必须在工作stream程中进一步查看和使用。 问题是某些单元对于包含的文本太小。 所以正在阅读工作表的人和程序将看不到相同的数据。

这通常适用于包含自动包装的文本的合并单元格时,Excel不正确地调整行高。 但是也有其他的一些情况:例如,当某些列的宽度已经明确设置时,这对于long值是不够的。

|Group|Def1 |Subgroup|Definition| Id |Data |Comment | |-------------------------------------------------------| | G1 | | G1-1 |Important |G1-1-1|... | | | |Long | |about G1-1|G1-1-2|.....|........ | | |text |-------------------------------------------| | |about| G1-2 |Another |G1-2-1|... | | | |group| |important |G1-2-2|... |long comme| | |G1. | |text about|G1-2-3| | | |-------------------------------------------------------| 

在这里,“定义”和“评论”中的某些单元格不完全可见。 有没有任何方法来编程find这样的细胞?

为了检测这些单元(我不是在讨论解决这个问题),你可以使用Range对象的Text方法。

例如, Range("A1").Value可能是123456789,但如果它的格式为数字和列不够宽, Range("A1").Text将是“###”(或许多#号适合在细胞中)。

这是我以前用过的一个技巧:

 With Columns("B:B") oldWidth = .ColumnWidth ' Save original width .EntireColumn.AutoFit fitWidth = .ColumnWidth ' Get width required to fit entire text .ColumnWidth = oldWidth ' Restore original width If oldWidth < fitWidth Then ' Text is too wide for column. ' Do stuff. End If End With 

当然,这将适用于整个专栏。 您仍然可以通过将单元格逐个复制到虚拟列,然后在那里执行AutoFittesting来使用它。

但对你来说可能更有用的是我的这个问题的更早的答案: 根据列的宽度跨越多行分割文本 。 它描述了一种方法来确定任何给定单元格中文本的宽度(并将其与单元格的实际宽度进行比较以确定文本是否适合)。

编辑回应你的评论:如果你的一些单元格高得足以显示两行或多行文字,那么你可以使用类似的方法,如我以前的答案中所述 ,首先使用.EntireRow.AutoFit来确定字体的高度和.RowHeight来确定单元格中有多less条线条,然后使用前一个问题的方法,确定文本是否可以适应该宽度的单元格中的线条数量。

取消合并工作簿中的所有单元格,然后使用Thisworkbook.sheets(“Name”)。rows(index).entirerow.autofit对列进行同样的操作。 除了审美原因外,还有什么方法可以保留合并的单元格? 只考虑“基本单元”的值(左上angular)。

今天我遇到了同样的问题。 我正在尝试这个技巧来躲避它。 也许,这可能对你有用。 它被编码来处理一个列宽合并区域:

 'Sheet2 is just merely support tool no data sheet in ThisWorkbook With Sheet2.Range(target.Address) target.Copy .PasteSpecial xlPasteAll .UnMerge If .MergeArea.Count > 1 Then .UnMerge .ColumnWidth = target.ColumnWidth .Value = target.Value .EntireRow.AutoFit target.MergeArea.EntireRow.RowHeight = _ 1.05 * .RowHeight / target.MergeArea.Rows.Count .ClearContents .ClearFormats End With 

不幸的是,如果有几列这样的合并单元格,也许它们相互之间需要的高度会相互碰撞,需要额外的代码来恢复和谐。 看起来像是一段有趣的代码。 希望你觉得这有帮助。