excel - 在 VBA 中大写动态范围

标签 excel vba dynamic range uppercase

(编码新手发布第一个问题,请原谅我的错误)

我正在尝试学习简单的数据验证方法。我读了另一篇与我正在做的类似的文章: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/

相关文章:

php - 使用 phpSpreadsheet 将 Excel 转换为 pdf

vba - 获取其他收件箱的引用

dynamic - 处理串联表键的通用方法

c++ - 如何在 C++ 中获取二维动态字符串数组的维度?

mysql - Excel VBA 程序停止执行 MySQL 查询

excel - 跨多个 Excel 和多台计算机共享数据

c# - 格式化 Excel 单元格(货币)

html - 如何使用vba填写html自动完成字段?

vba - 在尝试取消选择之前检查 AutoFilter 中的元素

ruby - 列出 Mongoid 模型中的动态属性