使用变量设置位置的VBA范围

时间:2017-10-18 21:32:29

标签: vba excel-vba excel

我想让我的程序在由变量定义的特定位置开始计数。我知道您可以使用rn = sh.Cells(9, 1),变量rn现在占据cells(9,1)的位置。但是当我在count命令中使用变量rn时,我收到以下错误:

  

方法'范围'对象' _Worksheet'

失败了

这是我的代码:

Option Explicit
Sub Struc_Equa()
Dim n As Integer

End sub
Sub countN(n)

Dim sh As Worksheet
Dim rn As Range
Dim SheNa As String
SheNa = ActiveSheet.Name
Set sh = ThisWorkbook.Sheets(SheNa)

Set rn = sh.Cells(9, 1)

' The command below does not work
'n = sh.Range(rn, sh.Range(rn).End(xlToRight)).Columns.Count

' I am able to do what I want but in a inefficient way (shown below)
'n = sh.Range("A9", sh.Range("A9").End(xlToRight)).Columns.Count
rn.Activate
 MsgBox (n)

End Sub

为什么会发生这种错误?

1 个答案:

答案 0 :(得分:1)

试试这个:

n = sh.Range(rn, rn.End(xlToRight)).Columns.Count

它遵循范围([Cell1],[Cell2])语法 请记住,rn已经是一个完全引用的范围地址,因此您可以直接将其用作 Range 对象的参数。有关Range Syntax的更多信息。

为什么原始代码会失败?

因为基于this article,在范围(arg)语法中, arg 命名范围。
请注意范围对象的默认属性为Value 所以你的代码:

sh.Range(rn).End(xlToRight)

实际上正在评估rn的值,并为 Range(arg)语法提供 arg 。如果该单元格的值不是有效的单元格或范围地址(或文章中提到的名称),则会引发错误。以上实际评估如下:

sh.Range("value from rn range object").End(xlToRight)

如果您尝试使用有效的单元格或范围名称/地址更改该单元格的值,它将起作用。例如:

With sh
    Set rn = .Cells(9, 1)
    rn.Value2 = "A9"
    n = .Range(rn, .Range(rn).End(xlToRight)).Columns.Count
    MsgBox n
End With

简而言之:

  1. 范围(arg)需要有效的范围名称或地址。
  2. 范围([cell1],[cell2])需要有效的范围对象引用。