[[20190823115737]] 『VBA SpecialCells(xlCellTypeVisible)の取得範囲』(tkit) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA SpecialCells(xlCellTypeVisible)の取得範囲』(tkit)

ご存じの方がおられましたら、ご教示お願いいたします。

アウトラインを含む範囲から可視セルの値を取得するため、
以下のコードで行ったところ、途中までしか取得できませんでした。

様々検索しましたが、類似事象など該当する情報は得られませんでした。

    A
 1 あ
 2 い ※
 3 う ※
 4 え ※
 5 お ※
 6 か

※アウトラインで折り畳み状態(非表示)

 Dim temp As Variant
    With ws
        temp = .Range("A1:A6").SpecialCells(xlVisible).Value
    End With

tempには、temp(1,1):あ,temp(1,1):かを想定していましたが、
temp(1,1):あ のみ代入されています。

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 指定した範囲が複数のAreaを含む場合の配列への転換は最初のAreaのみです。
 しかも最初のAreaが単一セルなので あ が代入されます。
(seiya) 2019/08/23(金) 13:12

ちょうど、昨日今日で解決した質問に、同じ理由のものがあります。[[20190822120508]]

まず、イミディエイトウィンドウで、以下を実行してみてください。 表示されているセルだけ、正しく選択されているのが判ると思います。
? Range("A1:A6").SpecialCells(xlVisible).Address

次に、以下ですね。
? Range("$A$1,$A$6")

これは配列代入されず、先頭エリアのみ返してしまう訳です。 なので、一発代入ではなく、得られたRangeオブジェクトを For Each 等でループして、1セルずつ代入してみてください。
(???) 2019/08/23(金) 13:17


seiya様、???様、ご教示ありがとうございます。

以下のコードが、実際に組んでいた形に近いので、
これで検証しました。

    A
 1 A
 2 あ
 3 い ※
 4 う ※
 5 え ※
 6 お ※
 7 か

  Dim temp As Variant
        Debug.Print Range("A1:A7").SpecialCells(xlVisible).Address
        temp = Range("A1:A7").SpecialCells(xlVisible).Value

結果としては、A1,A2の値は代入されますが、A7の値は入りません。
イミディエイトウィンドウのアドレスは、$A$1:$A$2,$A$7 です。
$A$1:$A$2 が最初のエリアということで、このエリアのみ代入されていた
ということが分かりました。
普段から、配列へ一括代入を多用していましたが、知りませんでした。
独学で様々なサイトで基礎応用を学んできたつもりですが、まだまだでした。
勉強になりました。ありがとうございました。

(tkit) 2019/08/23(金) 13:51


 私はIsArray関数で配列であるか否かを判定します。

 If IsArray(temp) then
    '配列として処理
 Else
    '単一の値として処理
 End If
(seiya ) 2019/08/23(金) 14:18

seiya様
ありがとうございます。
参考にさせていただきます。
(tkit) 2019/08/23(金) 15:22

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.