2017-10-18 116 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++的經驗,我有幾個問題,關於它的能力等 –