在VBA中dynamic范围大写

(编码新手张贴第一个问题,所以请原谅我的错误)

我试图学习简单的数据validation方法。 我读了另一篇文章,类似于我正在做的: convert-entire-range-to-uppercase,但是当我改变范围以适应我的需要时,它不起作用。 找不到解决这个问题的其他东西。

我有一个名为“块”的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)] 

除了想知道我犯了什么错误之外,我确信我已经过分复杂了。 有人能给我一种重新思考或简化的方法吗? 我也想知道通过循环(而不是这种方法)完成这样的任务的一般优点和缺点,但不知道这是否是要求…

[]是评估的简写,不接受variables。

您将需要实际使用评估。

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

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