わかりました。レガシー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)範囲内の行の数をカウントする方法です。
他に何かありますか?
_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を所有しています
あなたの2つの例はRows
とColumns
プロパティを使用した唯一の例ですが、理論的には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))
.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"を実行できます。)
Copyメソッドでの効果にrange.Rowsを使用していることに気付きました。行の高さをOriginからDestinationにコピーします。これが私が望む動作です。
rngLastRecord.Rows.Copy Destination:=Sheets("Availability").Range("a" & insertRow)
RngLastRecord.Rows.Copyの代わりにrngLastRecord.Copyを使用した場合、行の高さはコピー前にあったものになります。
よくわかりませんが、2番目のパラメーターはニシンです。
.Rowsと.Columnsは両方とも、RowIndexとColumnIndexの2つのオプションパラメーターを取ります。 ColumnIndexの使用を試みます。 Rows(ColumnIndex:=2)
は、。Rowsおよび.Columnsのエラーを生成します。
何らかの意味でCells(RowIndex,ColumnIndex)
プロパティから継承されていると感じていますが、最初のパラメーターのみが適切です。
私はこの作品を見つけました:
Rows(CStr(iVar1) & ":" & CStr(iVar2)).Select
これはおそらく少し面倒ですが、次のコードはあなたがやりたいように見えることをします:
Set rng = wks.Range(wks.Rows(iStartRow), wks.Rows(iEndRow)).Rows
別の方法があります。これを例として取り上げます
Dim sr As String
sr = "6:10"
Rows(sr).Select
必要なことは、変数iStartRow
、iEndRow
を文字列に変換することだけです。