Excel VBA-列中单元格的大写字母

问题描述 投票:1回答:2

我正在尝试将所有保存在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

当我的工作表包含两行数据(以及更多行),不计算标题时,vba正常工作。但是,当我的工作表仅包含1行数据,不计标题时,B列(单元格B2)中的名称将替换为#VALUE!。任何可以帮助发现问题的人以及如何纠正我的vba?

excel vba excel-formula
2个回答
1
投票

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

=INDEX("VALUE",)

而不是正确的:

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

不输入INDEX范围或数组将返回错误


0
投票

坦白地说,不确定什么地方出了问题。 (我认为这是与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
© www.soinside.com 2019 - 2024. All rights reserved.