1

我在 Excel 中有一个命名范围,其中包含一些我想在子例程或函数中处理的数据,但是我很难弄清楚如何引用范围的各个部分。我正在尝试使用该Cells功能,但它似乎不起作用。

这是我的代码片段:

Sub sub1()
x = Range("Test")

For Each i In x
    v = x.Cells(i, 1)
    calculate(v)
Next i

End Sub

截至目前,命名范围“Test”以 A1:A18 命名,并且尚未编写计算函数。使用 VBA 中的调试工具,程序在以下行抛出错误v = x.Cells(i,1):“运行时错误'424':需要对象”

我似乎遗漏了一些明显的东西。也许有一种方法可以将命名范围转换为数组?

4

2 回答 2

3

一切都在 Siddharth Rout 答案中;我将进行更详细的解释。

缺陷是 x 未声明,因此 VB 使用Variant. 你需要 x 是一个Range类型,所以你可以引用它的Cells属性。因此,您应该这样声明。

Dim x as Range作为第一行插入sub1。然后,您必须使用Set关键字分配给 x :Set x = Range("test")

Set是用于分配对象的语法。

此外,该Cells属性是 的默认属性Range。因此,不需要明确地写出来。

For each i in x 

分配给 iaRange对象,它是范围 x 的第 i 个单元格。所以你可以在 i 上应用计算。

现在最后一件事:Calculate可以应用于单个单元格或范围。因此, x.Calculate 可以工作(不需要循环)。

这给出了:

Sub sub1()
  Dim x as Range
  Dim i as Range
  Set x = Range("Test")

  For Each i In x
      i.Calculate
  Next i

End Sub

或更简单:

Sub sub1()
  Dim x as Range
  Set x = Range("Test")

  x.Calculate

End Sub

如果“计算”是用户函数:

Sub sub1()
  Dim x as Range
  Dim i as Range
  Set x = Range("Test")

  For Each i In x
      Call CalculateMyPurpose(i)
  Next i

End Sub

Sub CalculateMyPurpose(myCell as Range)
  'Do something on myCelll
End Sub

注意:我建议您声明所有变量。这将确保它们具有您想要的类型。要强制执行变量声明,请写Option Explicit为模块的第一行。

于 2013-09-16T07:14:53.767 回答
1

你不需要使用Cells:)

这是你在做什么(未经测试)?

Sub sub1()
    Dim cl As Range, nmRange As Range

    Set nmRange = Range("Test")

    For Each cl In nmRange
        calculate (cl)
    Next cl
End Sub

'~~> Some sub
Sub calculate(rng As Range)

End Sub
于 2013-09-16T06:23:29.780 回答