60

OK、レガシーExcel-VBAアプリケーションのアドオンプロジェクトを完成させようとしていますが、不思議なrange.Rows(?)プロパティとworksheet.Rowsプロパティの難問に再び直面しました。

これらのプロパティが実際に何をするのか、そしてそれらが私に何を提供するのかを誰かが知っていますか?(注:これはすべて、対応するプロパティにも当てはまる可能性があり*.Columnsます)。

私が本当にそれを使用できるようにしたいのは、次のような行の範囲を返すことです。

   SET rng = wks.Rows(iStartRow, iEndRow)

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

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

私がそれを使用することができたのは、1)範囲として単一の行を返す(rng.Rows(i))と2)範囲内の行の数を返す(rng.Rows.Count)だけです。それですか?それが良いことは本当に他に何もありませんか?

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

他に何かありますか?

4

9 に答える 9

53

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

  • Range.Rows.CountRangeの行数を返します。
  • Range.Columns.CountRangeの列数を返します。
  • Range.Rows.AutoFit()Rangeの行を自動調整します。
  • Range.Columns.AutoFit()Rangeの列を自動調整します。

あなたはそれを見つけて役に立つかもしれませんがRange.EntireRowRange.EntireColumnそれでもあなたが探しているものとは正確には異なります。それらは、表された範囲のEntireRowすべての可能な列とのすべての可能な行を返します。EntireColumn

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

  • IRange this[int row1, int column1, int row2, int column2];

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

于 2009-06-24T16:20:54.220 に答える
11

Range.Rows、Range.Columns、およびRange.Cellsは、VBA Type()関数によると、Excel.Rangeオブジェクトです。

?TypeName(Selection.rows)
範囲
ただし、それだけではありません。返されるオブジェクトは、Excel :: Rangeからすべてのプロパティとメソッドを継承する拡張型ですが、.Columnsと.Rowsには、特別なFor...各イテレータと特別な.Countプロパティがあります。親のRangeオブジェクトのイテレータおよびカウントとはまったく同じではありません。

したがって、.Cellsは、親範囲のデフォルトのイテレーターと同様に、単一セル範囲のコレクションとして繰り返され、カウントされます。

ただし、.Columnsは繰り返され、垂直サブレンジのコレクションとしてカウントされます。各サブレンジは1列幅です。

...そして.Rowsは繰り返され、水平方向のサブ範囲のコレクションとしてカウントされます。各サブレンジは1行の高さです。

これを理解する最も簡単な方法は、このコードをステップ実行して、何が選択されているかを確認することです。

パブリックサブテスト()
範囲としての薄暗いサブレンジ Dim ParentRange As Range
Set ParentRange = ActiveSheet.Range( "B2:E5")

ParentRange.Cellsのサブレンジごと SubRange.Select 次
ParentRange.Rowsのサブレンジごと SubRange.Select 次
ParentRange.Columnsの各サブレンジについて SubRange.Select 次
ParentRangeの各サブレンジについて SubRange.Select 次
サブ終了
楽しみ。そして、そこにいくつかの結合されたセルを入れて試してみて、結合された範囲がどれほど奇妙であるかを確認してください。

于 2014-04-30T17:58:15.997 に答える
7

私がこれまでにRowsandColumnsプロパティを使用したのは、2つの例だけですが、理論的には、オブジェクトで実行できることなら何でも実行できRangeます。

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

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

myRangeこれにより、 (Sheet1のセルB4:H4)の3番目の行が選択されます。

更新:やりたいことを行うには、次を使用できます。

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))
于 2009-06-24T14:06:21.763 に答える
5

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

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を使用して、範囲内の列に対して「ForEach」を実行することもできます。)

于 2014-03-06T21:45:33.400 に答える
2

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

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

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

于 2011-06-29T12:24:13.137 に答える
2

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

.Rowsと.Columnsはどちらも、RowIndexとColumnIndexの2つのオプションのパラメーターを取ります。ColumnIndexを使用してみてください。たとえば、 .Rowsと.ColumnsRows(ColumnIndex:=2)の両方でエラーが生成されます。

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

于 2009-06-24T14:26:59.083 に答える
1

それはおそらく少し厄介ですが、次のコードはあなたがやりたいと思われることを行います:

Set rng = wks.Range(wks.Rows(iStartRow), wks.Rows(iEndRow)).Rows
于 2010-03-12T02:50:16.463 に答える
1

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

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

あなたがする必要があるのはあなたの変数を文字列に変換することiStartRowですiEndRow

于 2010-12-23T21:41:11.087 に答える
1

私はこれがうまくいくことを発見しました:

Rows(CStr(iVar1) & ":" & CStr(iVar2)).Select
于 2012-09-16T15:58:05.430 に答える