2017-10-18 16 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 

それは範囲([セル1]、[セル2])構文に従います。
rnは既に完全に参照されている範囲アドレスであるため、範囲オブジェクトの引数として直接使用できます。 Range Syntaxの詳細

元のコードが失敗するのはなぜですか?

レンジ(引数)構文、引数名の範囲で、this articleに基づいているため。
RangeオブジェクトのデフォルトプロパティはValueです。
だからあなたのコード:

sh.Range(rn).End(xlToRight) 

は、実際にrnの価値を評価し、レンジ(引数)構文について引数としてそれを供給する。そのセルの値が有効なセルまたは範囲アドレス(または上記の記事の名前)でない場合は、エラーが発生します。実際には、上記のように、以下の評価:

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. レンジ(引数)は、有効範囲の名前またはアドレスを期待します。
  2. 範囲([セル1]、[セル2])は、有効な範囲オブジェクト参照が必要です。
+0

これはまさに問題でした。元のコードに何が間違っていたかをさらに説明できますか? –

+0

@MaxHollander私の更新を見てください。今はっきりしていることを願っています。 ;) – L42

+0

あなたはC++に多くの経験を持っていますか?能力に関するいくつかの質問があります –