2017-09-19 5 views
1

VBAを学習していて、正確にはRange()がVBAのために取り込むものは本当に混乱しています。私は、OOPとJava/Pythonのような言語をかなり堅固に把握していますが、VBAはここでループのためにちょっと投げています。ActiveCellを使用したVBAでのセルと範囲の関係

私は

Set MyRange = Range(ActiveCell, Range(ActiveCell.End(xlDown))) 

を使用しようとすると、私は正解が

Set MyRange = Range(ActiveCell,ActiveCell.End(xlDown)) 

であることを知っている。しかし、私はこのような場合は理由を理解しようとしているエラーが発生します。エラーは具体的にはRange(ActiveCell.End(xlDown))から発生しています。私は.End()RangeオブジェクトをMSDN documentationから返すことを知っています。私は

MsgBox (TypeName(ActiveCell)) 

を書くとき

しかし、私はActiveCellRangeオブジェクトであることを知らされています。 Range("A1")は完璧に(もちろん)うまく動作しますが、Range(ActiveCell)はエラーをスローします。したがって、Range()Rangeのオブジェクトでは発生しません。

しかし、"A1"は明らかにStringです。 Range()をVBAエディタに入力すると、Range()が引数のパラメータとしてCellを受け入れることがわかります。だからVBACellRangeの関係はどうなっていますか? RangeCellから継承していますか?私はなぜRange()が他のRangeオブジェクトを受け入れ、またStringを受け入れるのか混乱していますか?

Range()がパラメータとしてRangeオブジェクトを受け入れない場合、なぜこのコードが機能しますか?

Range("A2", Range("A2").End(xlDown).End(xlToRight))

ここRangeオブジェクトを返す.End()はありませんか? ActiveCell.End(xlDown)が既に範囲を返し

+0

これはあなたのための良い読書になります:https://msdn.microsoft.com/en-us/vba/excel-vba/articles/range-object-excel –

答えて

5

レンジで試しレンジ()

にそれをラップする必要はありません。範囲の範囲を示すオブジェクト。

ActiveCellは、それ自体の範囲オブジェクトです。範囲内でそれを使用するときに:

Range(ActiveCell.End(xlDown))

範囲は、第2の範囲のオブジェクトを探しています。

あなたは、文字列としてアドレスを返すことができます動作しますが、変換の多くを行うためにVBEを強制します

Range(ActiveCell.End(xlDown).Address)

。それはあなたの電話を充電するためにDC電源をACに変換してDCに戻すようなものです。単純に使用して

:範囲オブジェクト作品として

ActiveCell.End(xlDown)

Set MyRange = Range(ActiveCell, ActiveCell.End(xlDown)) 

これは理由Range("A2", Range("A2").End(xlDown).End(xlToRight))が原因です。 2つの範囲オブジェクトを返します。 VBEは内部範囲の各としてRange("A2")

Range(Range("A2"), Range("A2").End(xlDown).End(xlToRight))

ワークスする範囲の最初の場所で"A2"範囲オブジェクトを作成する文字列を使用していることを前提とします。

あなたの最初のようなものです:あなたが第二の範囲が今だけ1つの範囲の対象と範囲を見つけようとしていると、それは、2つの実行可能である必要が見ることができるように

Range("A2", Range(Range("A2")).End(xlDown).End(xlToRight))

範囲。

+0

ありがとう!これは大きな説明です。だから 'Range()'は 'String'と' Range'オブジェクトを混在させることができますか? Range( "A2"、Range( "A2")。End(xlDown).End(xlToRight)) 'の例のように、最初の引数はStringで、2番目の引数はRangeオブジェクトです。 –

+0

@YuChen編集を参照してください –

1

として、あなたはセルのアドレスまたは2つの範囲を表す文字列を探している

Set MyRange = Range(ActiveCell, ActiveCell.End(xlDown)) 
+0

ありがとう - 私は編集を追加しました。私はこれがもっと分かりにくいということを知っていました。しかし、私はなぜそれを理解しようとしています。 'Range(" A2 "、Range(" A2 ")。End(xlDown).End(xlToRight))'において、 'Range'オブジェクトは' Range'オブジェクトを取り入れています。 –

+0

Scott Cranerの答えが最も完成しました! –

関連する問題