查找太小而无法显示内容的文本单元格

时间:2010-01-20 22:05:17

标签: excel vba height row

我有一个工作表,其单元格可能包含有时超出单元格宽度和高度的文本。如果我没有注意到它并调整行高,则文本显示为截止值。有没有人有一个VBA片段或工具可以找到这些单元格,所以我可以调整它们?谢谢!

1 个答案:

答案 0 :(得分:2)

识别哪个列太宽会很棘手,尤其是因为单元格中的文本可能具有不同的字体和/或字体大小。通过使用Range.AutoFit方法自动调整列的大小要容易得多。

例如,您可以按如下方式调用AutoFit方法:

Dim myRange As Excel.Range
Set myRange = Application.Range("A1:C3")
myRange.Columns.AutoFit

然而,Range.AutoFit方法可能有点过于激进,导致列 narrow 。因此,您可能希望创建一个建立最小列宽的方法:

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

希望这有帮助!

更新:回复克雷格的评论:

  

Thansk Mike。使用此电子表格   作为Web界面的结构输入   发电机使列宽变化   而且不应该调整。我真的   只是在找东西扫描一下   表单中任何文本的单元格   显示比细胞宽   将允许适合,从而需要   行高越大。我不是   寻找制作过程   调整,从他们那里找到他们   容易被忽视。任何想法   是什么?

嗯,显然你想做两个事情:(1)确定哪些细胞被切断,然后(2)纠正这些截止值。

我确实理解你希望在两个不同的阶段做到这一点,但步骤(1)几乎不可能在所有情况下使用Excel正确执行,因为不仅行高和列宽可以变化,而且文本换行可以打开或off,并且字体可以是任意数量的潜在样式和/或大小的非比例字体。

简而言之,没有办法可靠地识别哪些细胞被切断,而不是没有大量的工作。但是,如果将电子表格限制为仅一种字体样式并使用非比例字体,则可以减轻它。如果这样做,那么您可以简单地将列宽与单元格中文本的长度进行比较。这是因为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字体是非比例字体,那么你有几个选项:

(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能够做什么可能不完全匹配,但我认为您应该能够完成您需要的工作吗?如果有诀窍,请告诉我们......

- 迈克