SpecialCellsメソッドを範囲に適用してから、結果のコレクションの要素にインデックスを付けると、返されるのは元の範囲のすべての要素で、SpecialCells基準に基づく新しい範囲の要素ではないことに気付きました。
Sub test()
Dim i As Range
Selection.SpecialCells(xlCellTypeConstants).Select
For Each i In Selection
Debug.Print i
Next
End Sub
たとえば、定数とそれに続く式、定数の順で上記のコードを実行し、イミディエイトウィンドウでSelectionの要素を確認すると、1、2、3(下の画像を参照してください。
ただし、Selectionを反復処理すると、期待どおりに値1と3が返されます(ここでも、下の画像を参照)。それぞれのケースで戻り値が異なる理由を誰かが知っていますか?
1
選択はApplicationオブジェクトのプロパティです。これはRangeオブジェクトではなく、Variant型に似た特別な型を持ちます。 ForEachを使用してSelectionを反復処理すると、Selection-Area-Cellのように反復処理されます。 Selection.AddressとSelection.Areas(i).Addressを表示します。 Selection(params)を使用すると、SelectionはRangeに変換され、Range(Selection.Address)(params)として扱われます。 Selectionにエリアのリストが含まれている場合は、最初のエリアのアドレスが使用されます。この場合のparamsはオフセットされているので、Selection(X)とSelection(X、Y)の両方が有効です。そして、X、Yの値が形式的に大きすぎてもエラーにはなりません。
—
Akina
この行は修正が必要です。
—
Rajesh S
.Select
と .Activate
Selection.SpecialCells(xlCellTypeConstants).Activate
。各選択は選択オブジェクトを作成します。 Activateは単にオブジェクトをアクティブオブジェクトにします。これを理解するための最良の方法は 「多くのセルを選択できますが、アクティブセルは常に1つだけです。」 Activeでは、3つの状況を試しました。最初は1,2,3、他は1、= 2,3& Aです。最後の1は1、A1 + A2 = 2、3でコードは1、2& 2を返します。あらゆる状況で3。
私は別のVBAコードを投稿しています。使用するRangeを使用していて、それも1、2、および3つすべての状況で3、以前のコメントで説明したこと。
—
Rajesh S