2017-10-18 112 views
2

我希望有我的计划,在由变量定义的特定位置开始计数。我知道,你可以使用rn = sh.Cells(9, 1)例如,变量rn现在持有的cells(9,1)位置。但是,当我在计数命令使用变量rn,我收到以下错误:VBA范围使用一个变量来设置位置

Method 'Range' of object' _worksheet' failed

这里是我的代码:

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

尝试这种情况:

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

它遵循范围([CELL1],[小区2])语法。
记住rn已经是一个充分的参考范围内的地址,所以你可以直接使用它作为参数传递给范围对象。更多关于Range Syntax

为什么你原来的代码会失败?

因为基于this article,在范围(ARG)语法,ARG名称的范围内。
并注意到,Range对象的默认属性是Value
所以,你的代码:

sh.Range(rn).End(xlToRight) 

实际评估rn值并将其作为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])需要有效的范围对象引用。
+0

这正是问题。你能否进一步解释原代码出了什么问题? –

+0

@MaxHollander查看我的更新。我希望现在更清楚。 ;) – L42

+0

你有很多与C++的经验,我有几个问题,关于它的能力等 –