(编码新手发布第一个问题,请原谅我的错误)
我正在尝试学习简单的数据验证方法。我读了另一篇与我正在做的类似的文章: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 的简写,不接受变量。
您需要实际使用 Evaluate。
您还需要 INDEX 才能不使用第一个值覆盖整个范围。
blockRange.value = blockRange.Parent.Evaluate("INDEX(UPPER(" & blockRange.Address & "),)")
关于excel - 在 VBA 中大写动态范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45764359/