【问题标题】:Capital letters to cells in column列中单元格的大写字母
【发布时间】:2019-11-22 16:05:59
【问题描述】:

我正在尝试将所有包含 B2 列及以下数据的单元格中的所有字母更改为大写字母。得到这个VBA。

Sub CapitalLettersColumnB()

    'Capital Letters to names in column B (from B2 and down)
    'Column B holds headers!

    With Range("B2", Cells(Rows.Count, "B").End(xlUp))
        .Value = Evaluate("INDEX(UPPER(" & .Address(External:=True) & "),)")
    End With

End Sub

当我的工作表包含 2 行数据(以及更多)时,不计算标题,vba 工作得很好。 但是,当我的工作表只包含 1 行数据(不计算标题)时,B 列(单元格 B2)中的名称将替换为 #VALUE!。 任何人都可以帮助找出问题所在,以及如何纠正我的 vba?

【问题讨论】:

    标签: excel vba excel-formula


    【解决方案1】:

    问题是INDEX。该函数返回RangeArray 中的位置,而不是单个值。如果您要评估公式,它会归结为:

    =INDEX("VALUE",)
    

    而不是正确的:

    =INDEX({"VALUE1","VALUE2"},)
    

    不向INDEX 提供范围或数组将返回错误


    要更正您的代码,您需要确保始终有一个大于一个单元格的范围对象,例如:

    Sub CapitalLettersColumnB()
    
    With Range("B1", Cells(Rows.Count, "B").End(xlUp))
        .Value = Evaluate("IF(ROW(" & .Address & ")>1,INDEX(UPPER(" & .Address & "),)," & .Address & ")")
    End With
    
    End Sub
    

    这将从B1 开始工作,但将通过我们IF 语句中的ROW 测试保持该单元格完整。

    另一个小提示,我肯定会使用明确的单元格引用(至少包括一个工作表)

    【讨论】:

    • 您的代码运行良好。非常感谢您的帮助。
    【解决方案2】:

    老实说,不知道出了什么问题。 (我认为这与 range("B2:B2") 的原因相同。您不能设置跨越同一个单元格的范围)
    您的 Cells(Rows.Count, "B").End(xlUp) 返回最后一个单元格的值,我不确定它是如何工作的。
    但是您可以更改代码以将范围更改为 lastrow。
    但是如果 lastrow 是 2 代码会失败,所以 if 转到 else 并且它只会改变单元格 B2 的 Ucase。

    If Cells(Rows.Count, "B").End(xlUp).Row > 2 Then
        ' more than one row after B2
        With Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row)
            .Value = Evaluate("INDEX(UPPER(" & .Address(external:=True) & "),)")
        End With
    Else
        ' no rows past B2
        Range("B2").Value = UCase(Range("B2").Value)
    End If
    

    【讨论】:

    • 这段代码也很好用。有点奢侈,我的请求收到了两个答案,它们都解决了我的问题!非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    相关资源
    最近更新 更多