2016-10-28 5 views
3

与えられたRangeオブジェクトが完全に列全体であるか全行であるか、または2つのうちのどれでもないかどうかを判断する必要があります。Excel Rangeが行全体または列全体を表すかどうかをVBAでどのように確認できますか?

私が今行うことは、私のために働く次のコードに基づいています。

If Range.Rows.Count = Range.EntireColumn.Rows.Count Then 
... 
ElseIf Range.Columns.Count = Range.EntireRow.Columns.Count Then 
... 
End If 

もっと効率的かつ/またはエレガントなやり方があるかどうか知りたいですか?おそらく、私が見落としてきたいくつかの組み込みプロパティですか?

UPDは:

Worksheet.Range("NamedRange") 

ありがとう:私は範囲を取得します。

+1

の変数であることは、IMO、最良の方法です。 –

+0

最新の回答をご覧ください。 – Miqi180

+2

私が知っている組み込みプロパティはありませんが、 'Long'変数のmax rowsとcolumnsを保存します' maxRows = Rows.Count' – Slai

答えて

1

あなたはこのようなものを使用することができます enter image description here

ので、あなただけの行をカウントする必要があります。Excelの定数(Excelのバージョンによって異なります)されている行と列の

Sub somethinglikethis() 

    Dim rRange As Range 

    Set rRange = Range("A:A") 

    With rRange 
     If .Rows.Count = 1048576 And .Columns.Count < 16384 Then 
      Debug.Print "Range represents Column(s)" 
     ElseIf .Rows.Count < 1048576 And .Columns.Count = 16384 Then 
      Debug.Print "Range represents row(s)" 
     ElseIf .Rows.Count = 1048576 And .Columns.Count = 16384 Then 
      Debug.Print "Range represents whole sheet" 
     Else 
      Debug.Print "Range represents none of row(s) or column(s)" 
     End If 
    End With 

End Sub 

量を範囲内の列とこれらの値を行と列の既定値と比較する

+0

あなたの答えをありがとう。私が自分のためにファイルを保管しておけば、これは私にとって理想的な解決策になると思います。異なるExcelバージョンを持つ多数のユーザーに配布する予定であるため、コードでバージョンを確認するのが面倒です。しかし、バックアップとしてこれを保持します。 – hypers

+1

@hypers次の比較のためにバージョンをチェックして変数を割り当てるのは大したことではなく、ただ1行のコード( 'if application.Version> ...'または 'if [A:A] .rows.count次に= ... ')はあなたに道を与えますが、もちろんそれはあなた自身のものです... – Vasily

+1

@hypers数値はExcelのバージョンではなく、ファイルの種類によって異なります。ブックを新しい形式または古い形式で保存する場合は、同じ方法で変更することもできます。 – Slai

2

これはすべてのExcelバージョンで有効です。

Function cellsInRange(rng As Range) As Boolean 

    Dim cellsInCol As Long, cellsInRow As Long, cols As Long, count As Long, rws As Long 

    With ActiveSheet 
     cellsInCol = .Columns("A").Cells.count 
     cellsInRow = .Rows(1).Cells.count 
    End With 

    With rng 
     cols = .Columns.count 
     count = .Cells.count 
     rws = .Rows.count 
    End With 

    If cols = 1 And count = cellsInCol Then 
     cellsInRange = True 
    ElseIf rws = 1 And count = cellsInRow Then 
     cellsInRange = True 
    End If 

End Function 

編集

を、より具体的な詳細は、範囲のオブジェクトについて必要とされる場合は、以下の適応が有用であることを証明し得る:

Function cellsInRange(rng As Range) As String 

    Dim cellsInCol As Long, cellsInRow As Long, cols As Long, count As Long, rws As Long 

    With ActiveSheet 
     cellsInCol = .Columns("A").Cells.count 
     cellsInRow = Rows(1).Cells.count 
    End With 

    With rng 
     cols = .Columns.count 
     count = .Cells.count 
     rws = .Rows.count 
    End With 

    If cols = 1 And count = cellsInCol Then 
     cellsInRange = "Single column" 
    ElseIf rws = 1 And count = cellsInRow Then 
     cellsInRange = "Single row" 
    Else 
     cellsInRange = "Neither single column nor single row" 
    End If 

End Function 
+0

ありがとうございます回答。私は、行全体と列全体を区別するためにこれを少し修正しなければならないと思います。現在のところ、それがあれば真です。 – hypers

+1

その場合、ブール値の代わりに文字列を返すように関数を変更し、条件文に適切な応答テキストを挿入してください。論理はまったく同じです。 – Miqi180

1

あなたはrng.Address(0,0)を解析することができるかもしれ。(というよりもVBA)英語中:

s = rng.Address(0,0) 
If s contains no letters then rng contains only full rows 
If s contains no numbers then rng contains only full columns 
+0

あなたの疑似コードをありがとう。当初は同じ方向に考えていました。しかし、私はこの仕事のためにRegexpや他の文字列操作を使わない方が良いと判断しました。 – hypers

+2

@hypers私の投稿は思考のためだけの食べ物だった –

1

私の0,02セント

Select Case rng.Address 
    Case rng(1).EntireColumn.Address 
     MsgBox "column" 
    Case rng(1).EntireRow.Address 
     MsgBox "row" 
End Select 

rngは何をやっているRangeタイプ

+0

あなたのバージョンをありがとう。それは悪くないようです。しかし、私の初期のアプローチよりも少し遅いです。私のPCでの簡単なテストでは、私のバージョンは約4,96(1mio繰り返し)、あなたのものは8,33秒近くかかったことがわかりました。 – hypers

+0

フィードバックありがとう – user3598756

関連する問題