在 VBA 中大写动态范围

Capitalize Dynamic Range in VBA

(编码菜鸟post第一次提问所以请原谅我的错误)

我正在尝试学习简单的数据验证方法。我读了另一个 post 类似于我正在做的事情:convert-entire-range-to-uppercase, 但是当我改变范围以满足我的需要时它不起作用。找不到任何其他解决此问题的方法。

我有一个名为 "Block" 的 Excel 列,它出现在不同工作簿的不同位置,我需要将该列中出现的所有字母大写。我认为代码在最后一行之前按预期工作,结果是“#NAME?”填满整个范围。

这是我目前拥有的:

Dim LastColumn As Long
Dim LastRow As Long
Dim BlockColumn As Long
Dim BlockRange As Range

    'defines LastColumn, LastRow & BlockColumn
    LastColumn = Cells.Find(What:="*", After:=Range("a1"), LookAt:=xlPart, LookIn:=xlFormulas, _
        SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False).Column
    LastRow = Cells.Find(What:="*", After:=Range("a1"), LookAt:=xlPart, LookIn:=xlFormulas, _
        SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row
    BlockColumn = Cells.Find(What:="Block", After:=Range("a1"), LookAt:=xlPart, LookIn:=xlFormulas, _
        SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Column

    'capitalizes any text in BlockColumn
    Set BlockRange = Range(Cells(2, BlockColumn), Cells(LastRow, BlockColumn))
    BlockRange = [UPPER(BlockRange)]

除了想知道我在哪里犯了错误之外,我确信我把这个复杂化了。有人可以告诉我一种重新思考或简化它的方法吗?我也想知道通过循环(而不是这种方法)完成这样的任务的一般利弊,但不确定是否是问这个问题的地方...

[] 对于 Evaluate 是 shorthand,不接受变量。

您需要实际使用评估。

您还需要 INDEX 以不使用第一个值覆盖整个范围。

blockRange.value = blockRange.Parent.Evaluate("INDEX(UPPER(" & blockRange.Address & "),)")