我有一个工作表,其中的单元格可能包含有时超过单元格宽度和高度的文本。如果我没有注意到并调整行高,则文本显示为截止。有没有人有可以定位这些单元格的 VBA 片段或工具,以便我可以调整它们?谢谢!
1 回答
识别哪一列太宽会很棘手,特别是因为单元格中的文本可以有不同的字体和/或字体大小。通过使用Range.AutoFit方法来自动调整列的大小要容易得多。
例如,您可以按如下方式调用 AutoFit 方法:
Dim myRange As Excel.Range
Set myRange = Application.Range("A1:C3")
myRange.Columns.AutoFit
Range.AutoFit 方法可能有点过于激进,但是会导致列太窄。因此,您可能希望创建一个建立最小列宽的方法:
Sub AutoFitColumns(theRange As Excel.Range, minColumnWidth As Double)
theRange.Columns.AutoFit
Dim column As Excel.Range
For Each column In theRange.Columns
If column.ColumnWidth < minColumnWidth Then
column.ColumnWidth = minColumnWidth
End If
Next column
End Sub
上面可以调用如下,以自动调整列,但最小宽度为 8.5:
Dim myRange As Excel.Range
Set myRange = Application.Range("A1:C3")
Call AutoFitColumns(myRange, 8.5)
您还可以自动调整范围的行。这很少需要,但要这样做,你会使用类似的东西:
myRange.Rows.AutoFit
希望这可以帮助!
更新:回复克雷格的评论:
谢谢迈克。此电子表格用作 Web 界面生成器的结构化输入,因此列宽会发生变化且不应调整。我真的只是在寻找一些东西来扫描工作表中显示的文本比单元格允许的范围宽的任何单元格,因此需要更大的行高。我不是在寻找进行调整的过程,只是找到它们,因为它们很容易被忽略。有什么想法吗?
好吧,显然你想做两件事:(1)确定哪些细胞被切断,然后(2)纠正这些切断。
我确实理解您希望在两个不同的阶段执行此操作,但步骤 (1) 几乎不可能在所有使用 Excel 的情况下正确执行,因为不仅行高和列宽可以变化,而且文本换行可以打开或关闭,并且字体可以是任意数量的潜在样式和/或大小的非比例字体。
简而言之,没有办法可靠地识别哪些细胞被切断了,这需要大量的工作。但是,如果您将电子表格限制为仅一种字体样式并使用非比例字体,则可以缓解这种情况。如果你这样做,那么你可以简单地将列宽与单元格内的文本长度进行比较。这是因为Excel.Range.ColumnWidth属性返回其宽度已校准,因此一个单位的列宽等于 Normal 样式中一个字符的宽度。对于比例字体,使用字符 0(零)的宽度。
因此,对于不使用自动换行且字体为 Normal 样式的简单情况,理想情况下,Normal 字体是非比例字体,那么您可以遍历范围内的所有单元格以查找值的位置保持比列宽长:
Dim myRange As Range
Set myRange = Application.Range("A1:E5")
Dim cell As Excel.Range
For Each cell in myRange.Cells
If Len(CStr(cell.Value)) > cell.ColumnWidth Then
MsgBox "The cell at " & cell.Address & " has text that is too long!"
End if
Next cell
但现在是下一部分......你将如何纠正这个?同样,如果您有一个非常简单的情况,即不使用自动换行并且字体为 Normal 样式,并且理想情况下,Normal 字体是非比例字体,那么您有几个选择:
(1) 设置列宽以匹配单元格的值长度:
Dim myRange As Range
Set myRange = Application.Range("A1:E5")
Dim cell As Excel.Range
For Each cell in myRange.Cells
If Len(CStr(cell.Value)) > cell.ColumnWidth Then
cell.ColumnWidth = Len(CStr(cell.Value))
End if
Next cell
(2) 自动适配柱子:
Dim myRange As Range
Set myRange = Application.Range("A1:E5")
Dim cell As Excel.Range
For Each cell in myRange.Cells
If Len(CStr(cell.Value)) > cell.ColumnWidth Then
cell.Columns.AutoFit
End if
Next cell
但是,如果我们要自动调整列,那么直接调用它会容易得多,而无需先检查列宽,因为不仅会一次更正所有单元格的宽度,而且 Range.AutoFit方法可以处理任何样式的任何字体,包括非比例字体。
因此,直接使用自动调整方法,我们有两个选择:自动调整列或自动调整行。根据您最近的报价,听起来您想重新调整行的大小:
我真的只是在寻找一些东西来扫描工作表中显示的文本比单元格允许的范围宽的任何单元格,因此需要更大的行高。
为此,我将使用文本换行,然后自动调整行。例如,
Dim rng As Excel.Range
Set rng = Application.Range("A1:E5")
With rng.Rows
.WrapText = True
.AutoFit
End With
我认为这些是关于你所有的选择。最后,你想做什么和 Excel 能做什么可能不完全匹配,但我认为你应该能够完成你需要做的事情?让我们知道它是否可以解决问题...
——迈克