web-dev-qa-db-ja.com

Excel range.Rowsプロパティは実際に何をしますか?

わかりました。レガシーExcel-VBAアプリケーションのアドオンプロジェクトを仕上げていますが、神秘的な_range.Rows_(?)および_worksheet.Rows_プロパティの難問に再び立ち向かったのです。

これらのプロパティが実際に何をするのか、そしてそれらが私に提供するものを知っている人はいますか? (注:このすべては、おそらく対応する_*.Columns_プロパティにも適用されます)。

私が本当にlikeに使用できるのは、次のような行の範囲を返すことです:

_   SET rng = wks.Rows(iStartRow, iEndRow)
_

しかし、Intellisenseが2つの議論を示しているにもかかわらず、私はそれを実現することができませんでした。代わりに、2つまたは3つの他の(非常に不器用な)テクニックのいずれかを使用する必要があります。

ヘルプは非常に役に立たない(通常はOffice VBAの場合)ため、「行」のグーグル検索は、他の用語をいくつ追加してもあまり役に立ちません。

使用できるのは、1)範囲として単一の行を返す(rng.Rows(i))および2)範囲内の行のカウントを返す(_rng.Rows.Count_)だけです。 。それですか?本当に良いものは他にありませんか?

明確化:範囲を返すことと、行の範囲を取得する他の方法があることを知っています。私が求めているのは、.Rows().Cells()からまだ取得していない.Range()から何を取得するかということです。私が知っている2つのことは、1)単一の行の範囲を返す簡単な方法と、2)範囲内の行の数をカウントする方法です。

他に何かありますか?

59
RBarryYoung

_Range.Rows_および_Range.Columns_は、新しいRangeに行または列を表すことを示すフラグがあることを除いて、本質的に同じRangeを返します。これは、Range.CountやRange.Hiddenなどの一部のExcelプロパティおよびRange.AutoFit()などの一部のメソッドに必要です。

  • _Range.Rows.Count_は、Rangeの行数を返します。
  • _Range.Columns.Count_は、Rangeの列数を返します。
  • Range.Rows.AutoFit()はRangeの行を自動調整します。
  • Range.Columns.AutoFit()は、範囲の列を自動調整します。

_Range.EntireRow_と_Range.EntireColumn_が有用であることに気付くかもしれませんが、まだ探しているものではありません。 EntireRowのすべての可能な列と、表された範囲のEntireColumnのすべての可能な行を返します。

SpreadsheetGear for .NET には、ExcelのAPIと非常によく似た.NET APIが付属しているため、これを知っています。 SpreadsheetGear APIには、IRangeインデクサーに対するいくつかの厳密に型指定されたオーバーロードが付属しています。これには、Excelに必要なオーバーロードが含まれます。

  • _IRange this[int row1, int column1, int row2, int column2];_

免責事項:私はSpreadsheetGear LLCを所有しています

53
Joe Erickson

あなたの2つの例はRowsColumnsプロパティを使用した唯一の例ですが、理論的にはRangeオブジェクトでできることなら何でもできます。 。

これらのプロパティの戻り値の型自体はRangeなので、次のようなことができます。

Dim myRange as Range
Set myRange = Sheet1.Range(Cells(2,2),Cells(8,8))
myRange.Rows(3).Select

myRangeの3行目(Sheet1のセルB4:H4)が選択されます。

pdate:やりたいことを行うには、次のようにします。

Dim interestingRows as Range
Set interestingRows = Sheet1.Range(startRow & ":" & endRow)

更新#2:または、別の範囲内から行のサブセットを取得するには:

Dim someRange As Range
Dim interestingRows As Range

Set myRange = Sheet1.Range(Cells(2, 2), Cells(8, 8))

startRow = 3
endRow = 6

Set interestingRows = Range(myRange.Rows(startRow), myRange.Rows(endRow))
7
e.James

.Rowsの結果は行で構成されるとマークされているため、次のように「For Each」で各行を個別に処理できます。

Function Attendance(rng As Range) As Long
Attendance = 0
For Each rRow In rng.Rows
    If WorksheetFunction.Sum(rRow) > 0 Then
        Attendance = Attendance + 1
    End If
Next
End Function

これを使用して、人のリスト(異なる行)のいくつかのカテゴリー(異なる列)の出席を確認します。

(そしてもちろん、.Columnsを使用して、範囲内の列に対して "For Each"を実行できます。)

3
mrento

Copyメソッドでの効果にrange.Rowsを使用していることに気付きました。行の高さをOriginからDestinationにコピーします。これが私が望む動作です。

rngLastRecord.Rows.Copy Destination:=Sheets("Availability").Range("a" & insertRow)

RngLastRecord.Rows.Copyの代わりにrngLastRecord.Copyを使用した場合、行の高さはコピー前にあったものになります。

2
Nick Mellor

よくわかりませんが、2番目のパラメーターはニシンです。

.Rowsと.Columnsは両方とも、RowIndexとColumnIndexの2つのオプションパラメーターを取ります。 ColumnIndexの使用を試みます。 Rows(ColumnIndex:=2)は、。Rowsおよび.Columnsのエラーを生成します。

何らかの意味でCells(RowIndex,ColumnIndex)プロパティから継承されていると感じていますが、最初のパラメーターのみが適切です。

2
Joel Goodwin

私はこの作品を見つけました:

Rows(CStr(iVar1) & ":" & CStr(iVar2)).Select
1
Paolo Bortolini

これはおそらく少し面倒ですが、次のコードはあなたがやりたいように見えることをします:

Set rng = wks.Range(wks.Rows(iStartRow), wks.Rows(iEndRow)).Rows
1
jswolf19

別の方法があります。これを例として取り上げます

Dim sr As String    
sr = "6:10"
Rows(sr).Select

必要なことは、変数iStartRowiEndRowを文字列に変換することだけです。

0
blash