循环遍历指定范围的所有值

时间:2019-06-26 19:35:56

标签: excel vba range

which python [your path]/miniconda3/envs/mlvision/bin/python 范围内,我有许多命名范围。

enter image description here

现在,我想通过遵循相关topic的第二个答案来遍历每个命名范围

Workbook

此宏向我显示了msgbox中的所有名称,例如Sub Range1() Dim i As Integer For i = 2 To ActiveWorkbook.Names.Count MsgBox ActiveWorkbook.Names(i).Name Next i End Sub 。我按照以下方式修改脚本,以根据相应范围的名称“调用”每个范围。

C_1

我得到的错误是:

  

“运行时错误'1004':对象'_ Apolication的方法'Range'失败

知道我在做什么错吗?如果检查元素,我会发现Sub Range2() Dim i As Integer Dim rng As Range Dim nm As Name Dim rng_name As String For i = 2 To ActiveWorkbook.Names.Count Set nm = ActiveWorkbook.Names(i) rng_name = nm.Name Set rng = Application.Range(nm.Name) `This line yields an error MsgBox rng.Address Next i End Sub 等于“ C_1”。

编辑

我相信这与命名范围的创建方式有关。这可以通过以下方式完成:

rng_name

1 个答案:

答案 0 :(得分:1)

请参阅:

For i = 1 To ActiveWorkbook.Names.Count
    Set nm = ActiveWorkbook.Names(i)
    Set rng = ActiveWorkbook.Names(nm.Name) 'This is where the error was
    MsgBox rng.Address
Next i

我还删除了rng_name,因为您没有使用它。


编辑1:

我无法使Application.Range(nm.Name)正常工作,但是能够使用名为“ c”和“ d”的不同图纸上的范围使ActiveWorkbook.Range(nm.Name)工作。我注意到nm = ActiveWorkbook.Names(i) 没有在记录时包含工作表名称。

使用下划线和数字命名范围时(我尝试过c_1和c_2),我无法使代码正常工作;在调试模式下检查nm时,我注意到它也列出了工作表名称。我必须指定比rng .RefersToRange来获得不显示工作表名称的单元格地址。

我又进行了两次检查,一个检查的下划线没有数字(使用“ d_”),另一个检查的下划线没有数字(使用“ name2”),并且两个都给我相同错误。两种方案都将工作表名称保留在字符串nm中。

这是我正在执行/逐步执行的测试代码以解决该问题:

Dim rng As Range, i As Long
For i = 1 To ActiveWorkbook.Names.Count
    Set nm = ActiveWorkbook.Names(i)
    'Set rng = ActiveWorkbook.Names(nm.Name)
    Set rng = nm.RefersToRange
    'Debug.Print rng.Address
    MsgBox rng.Address
Next i

在所有情况下都使用Set rng = nm.RefersToRange,而Set rng = ActiveWorkbook.Names(nm.Name)仅使用字母字符名称。

建议,坚持使用.RefersToRange作为可靠的代码。