Excel VBA:SpecialCellsのコレクションへのインデックス付け


0

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が返されます(ここでも、下の画像を参照)。それぞれのケースで戻り値が異なる理由を誰かが知っていますか?

enter image description here


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

この行は修正が必要です。 .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。
Rajesh S

私は別のVBAコードを投稿しています。使用するRangeを使用していて、それも1、2、および3つすべての状況で3、以前のコメントで説明したこと。
Rajesh S

回答:


0

enter image description here

B1:B3のテスト収集の状況

  1. 1,2,3
  2. 1 =2, 3
  3. 1, =a1+a2, 3

    Sub TestofCollection()
      Dim Collection1 As Collection
       Dim n As Integer
        Dim x As Integer
    
       Set Collection1 = New Collection
    
       n = 1
    
      On Error Resume Next
         For Each Cell In Range("B1:B3")
            Collection1.Add n, CStr(Cell.Value)
            n = n + 1
        Next Cell
     On Error GoTo 0
    
     For x = 1 To Collection1.Count
        Range("C" & x).Value = Collection1.Item(x)
     Next x
    
    End Sub
    
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.