【问题标题】:Set range via Range object -> Range object fails?通过 Range 对象设置范围 -> Range 对象失败?
【发布时间】:2019-04-22 11:47:05
【问题描述】:

谁能帮我调试这段代码?

....    
Dim searchRng as Range

With Sheets("Database")

    Set searchRng = Range("pointer.address:.cells(pointer.End(xlDown).Row,pointer.Column).address") 

End with

我不断收到错误 1004:对象“_Global”的方法“范围”失败 “指针”是先前定义的一个单元格范围(B6)。 经过各种调试尝试,问题似乎与.address有关......据我所知,这就是它。

提前致谢! 狮子座

【问题讨论】:

  • 好吧,首先,您将整个内容作为字符串发送...去掉双引号,您将收到更具描述性的错误消息/编译错误
  • 好的。引号是不是必须的,如图所示?!:docs.microsoft.com/en-us/office/vba/api/excel.range(object)
  • 引号用于引用工作表上的实际地址,如"A5",或命名范围(公式 --> Excel 中的名称管理器)。如果您进一步向下查看您链接的页面,您可以看到如何按照您尝试的方式进行引用。比如Set rnSource = Range(Range("A1"), Range("A100").End(xlDown))中的外层Range

标签: vba set range


【解决方案1】:

这里的问题是引号用于将范围名称传递给.Range() 对象,但您希望将调用.address 方法的结果传递给它。如果您将这些方法调用放在引号中,VBA 将不会运行它们,而是会尝试将您在其中的内容解释为您所指的范围的名称。您需要使用这些方法构造范围名称字符串并将结果传递给.Range() 对象。

有几种方法可以做到这一点。第一个分离出范围名称的构造并将其分配给一个变量,然后可以将其传递给.Range()。

Sub test()

Dim searchRng As Range
Dim CllNameA As String
Dim CllNameB As String
Dim CllRange As String

With Sheets("Database")
    CllNameA = .Range("pointer").Address
    CllNameB = .Range("pointer").End(xlDown).Address


    CllRange = CllNameA & ":" & CllNameB


    Set searchRng = .Range(CllRange)


End With

End Sub

下一个子例程将相同的方法压缩为一行。它仍然在做同样的事情,但是因为它同时完成所有事情,所以人类读者更难以理解。

Sub test2()

Dim searchRng As Range

With Sheets("Database")

    Set searchRng = .Range(.Range("pointer").Address & ":" & .Range("pointer").End(xlDown).Address)

End With

End Sub

还有其他方法可以实现相同的目标,但我希望这至少能让你走上正确的道路。

【讨论】:

  • 非常感谢您的准确和清晰的解释!你的冠军!
  • @Ardnic 不客气。如果这对你有用,请接受答案:)
猜你喜欢
  • 2022-10-17
  • 1970-01-01
  • 2018-09-21
  • 2016-11-11
  • 2013-11-15
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多