Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 列中单元格的大写字母_Excel_Vba_Excel Formula - Fatal编程技术网

Excel 列中单元格的大写字母

Excel 列中单元格的大写字母,excel,vba,excel-formula,Excel,Vba,Excel Formula,我试图将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(

我试图将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)中的名称将替换为#值
任何人都可以帮助找出问题所在,以及如何纠正我的vba

老实说,我不知道出了什么问题。(我认为这与范围(“B2:B2”)的原因相同。不能设置跨越同一单元格的范围)
您的
单元格(Rows.Count,“B”).End(xlUp)
返回最后一个单元格的值,我不确定它是如何工作的。
但是,您可以更改代码,使其范围为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

老实说,我不确定出了什么问题。(我认为这与范围(“B2:B2”)的原因相同。不能设置跨越同一单元格的范围)
您的
单元格(Rows.Count,“B”).End(xlUp)
返回最后一个单元格的值,我不确定它是如何工作的。
但是,您可以更改代码,使其范围为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

问题是
索引
。函数返回
范围
数组
中的位置,而不是单个值。如果你对公式进行评估,可以归结为:

=INDEX("VALUE",)
而不是正确的:

=INDEX({"VALUE1","VALUE2"},)
不向
索引
提供范围或数组将返回错误


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

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
测试将使该单元格保持完整


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

问题是
索引
。函数返回
范围
数组
中的位置,而不是单个值。如果你对公式进行评估,可以归结为:

=INDEX("VALUE",)
而不是正确的:

=INDEX({"VALUE1","VALUE2"},)
不向
索引
提供范围或数组将返回错误


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

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
测试将使该单元格保持完整


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

您的代码工作得非常好。非常感谢您的帮助。您的代码运行得非常好。非常感谢您的帮助。这段代码也非常有效。有点奢侈这一点,我收到了两个对我的要求的答复,他们都解决了我的问题!非常感谢您的帮助。这段代码也非常有效。有点奢侈这一点,我收到了两个对我的要求的答复,他们都解决了我的问题!非常感谢你的帮助。