1

ListObject テーブルの特定の列の可視セルのみを範囲オブジェクトに取得しようとしています。

これはうまくいかないようです。

dim rng as range
with activesheet.listobjects("Tab_data").databodyrange
    set rng=.specialcells(xlcelltypevisible)
end with

しかし、これは範囲全体を選択し、最初の列をオフセットして他の2つの必要な列を選択すると機能します!

dim rng as range
with activesheet.usedrange
    Set rng = .Offset(1, 1).Resize(.Rows.Count-1, .Columns.Count-1).SpecialCells(xlCellTypeVisible)
end with

しかし、私の式は以下に示すリストオブジェクトの2つの列のみを参照しているため、式で上記を使用することはできません:

ここに画像の説明を入力

ワークシートの UDF 式:

=TagCloud(RngWrdLst as Range)

そして私はそれを次のように使用しています:

=TagCloud(tab_data[[Brands]:[Index]])

画像からわかるように、「COLUMN」列のセルではなく、列「Brands」と「Index」の可視セル範囲のみが必要です。

したがって、私が望む可視範囲は次のとおりです。

"$B$2:$C$3,$B$45:$C$45,$B$75:$C$78"

@Jeeped の編集:

ワークシート セルから呼び出される UDF 関数があり、列 B と C の ListObject 範囲 (databodyrange 全体ではなくこれらの列のみ) を渡した場合、RngWrdLst の可視範囲を見つけるにはどうすればよいですか?

例えば

ワークシートからの呼び出し:

=TagCloud(tab_data[[Brands]:[Index]])

関数定義:

Function TagCloud(RngWrdLst As Range)
Dim VisibleRng As Range

With RngWrdLst
    Set VisibleRng = Intersect(.SpecialCells(xlCellTypeVisible), Union(.Columns(2), .Columns(3)))
    Debug.Print VisibleRng.Address(0, 0)
End With

'   do something with the visibleRng......
End Function

ところで、RngWrdLst には B と C の 2 つの列が含まれます。コードを変更して、関数から可視範囲のみを取得するにはどうすればよいですか?

4

1 に答える 1

1

必要な列のUnion メソッドでIntersect メソッドを使用します。

Dim rng As Range
With ActiveSheet.ListObjects("Tab_data").DataBodyRange
    Set rng = Intersect(.SpecialCells(xlCellTypeVisible), _
                        Union(.Columns(2), .Columns(3)))
    Debug.Print rng.Address(0, 0)
End With

または、最初の列を右にシフトし、 .DataBodyRange プロパティに含まれる列よりも 1 列小さいサイズに変更します。

Dim rng As Range
With ActiveSheet.ListObjects("Tab_data").DataBodyRange
    With .Resize(.Rows.Count, .Columns.Count - 1).Offset(0, 1)
        Set rng = .SpecialCells(xlCellTypeVisible)
    End With
    Debug.Print rng.Address(0, 0)
End With

何をしたいかによっては、 Range.Areas プロパティrngをループする必要がある場合があります。

于 2016-03-23T23:48:40.440 に答える