我正在尝试将所有保存在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?
问题是INDEX
。该函数返回Range
或Array
中的位置,而不是单个值。如果您要评估公式,则可以归结为:
=INDEX("VALUE",)
而不是正确的:
=INDEX({"VALUE1","VALUE2"},)
不输入INDEX
范围或数组将返回错误
坦白地说,不确定什么地方出了问题。 (我认为这是与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