• ベストアンサー

エクセルのVBA  データの行数取得

VBAの勉強をしています。参考書に下記のようなソースが載っていたのですが意味がわかりません。 データ行数を取得 lngRows = .Offset(65536 - .Row).End(xlUp).Row - .Row + 1 -.Rowとはどういう意味でしょうか? ヘルプ等で調べるとRow(2)というようにRowの後に数字が入っていて2行目を参照してる ということがわかるのですが単純にRowと描かれている場合はどこを参照している のでしょうか?教えていただけないでしょうか?

  • tkoo
  • お礼率5% (15/254)

質問者が選んだベストアンサー

  • ベストアンサー
  • taocat
  • ベストアンサー率61% (191/310)
回答No.3

こんばんは。 いきなり難しいのをやってますねぇ。(^^;;; 皆さんも仰ってるように、Withステートメントと一緒に質問した方がよかったと思います。 たぶん、こんな感じだと思いますが。 データがA列3行目から入ってるとして ---------------------------------------------- With Range("A3") lngRows = .Offset(65536 - .Row).End(xlUp).Row - .Row + 1 End With ------------------------------------------------- Withステートメントを省くと lngRows = Range("A3).Offset(65536 - Range("A3").Row).End(xlUp).Row - Range("A3").Row + 1 ------------------------------------------------ このように、.Offset、.Row の前に、 Range("A3") を入れたのと同じになるわけです。 で本題ですが、既に回答にあるように Rowプロパティは、そのセルの行番号になります。 ですから上記を例にとると 例えば、データが3~10行目まで入ってたとしたら .Row は Range("A3").Row すなわち、行番号3 .Offset(65536 - .Row).End(xlUp).Row はデータの最終行番号10 ゆえに、 lngRows = 10 - 3 + 1 = 8 となるわけです うっ、分かりにくい説明(^^;;; 以上です。

その他の回答 (2)

  • shkwta
  • ベストアンサー率52% (966/1825)
回答No.2

ワークシートやセル範囲の2行目を得るのは、Row(2)ではなくてRows(2)というようにRowsプロパティを使います。Rowプロパティは、単に行番号を示します。 たとえば、Range("D12:F53").Row は単に、セル範囲の最上行の行番号(この場合12)を返します。 したがって、この文の .Row は、Withステートメントで指定された何かのセル範囲の、最上行の行番号を表わします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

>データ行数を取得 >lngRows = .Offset(65536 - .Row).End(xlUp).Row - .Row + 1 これだけの行でご質問するというのは、参考書とあなたのレベルがあっていないような気がします。 With ステートメントで括られていて初めて意味を持ちます。 次に、どこの行であっても、「 .Offset(65536 - .Row) 」は、最下行、65536行目であるし、そこから戻って、End(xlUp).Row は、データ行の最下行です。 つまり、With ステートメントから取られた、「 .Row」は、データ行の先頭のはずです。 例えば、r = ActiveCell.Row と入れてみれば、分かるはずです。 ですから、 .Offset(65536 - .Row).End(xlUp).Row データの最下行 - .Row + 1 データの最上行+1 とすれば、データ行数が取れるわけです。 たぶん、With ステートメントは、 With Range("A1").End(xlDown) のようになっているように思います。

関連するQ&A

  • エクセルVBAで行のコピー貼り付けについて

    初心者、勉強中でエクセル2007です。 A1行からK40行までの表があります。 これを下にコピーをしながら増やしていってるのですが、マクロでしようと思い下記のとおり 考えました。 selecion.row.Offset(39, -1).Select ここでオブジェクトが必要ですと出ます。 それからその下の?とを色々ぐぐってみますがどうしてもわかりません。 それと2007ですので65536行ではないのですが、MaxRow = Cells(Rows.Count, 1).End(xlUp).Row だと動かないみたいですので下記としています。 よろしくご教授お願いします。 Sub Gcopy() MaxRow = Range("B65536").End(xlUp).Offset(-39, -1).Select データの入ってる最終行を取得 Selecion.row.Offset(39, -1).Select 選択された行から上に39行移動し選択 ?                    下へ39行まで選択   MaxRow = Range("B65536").End(xlUp).Offset(1, -1) 最終行を取得 ActiveSheet.Paste 貼り付け End Sub

  • エクセル、不特定行数の条件分岐マクロについて

    不特定行数に B3セル以降下セルに優・良・可・不可を入れたく以下のように書きましたがうまく行きません。 どのようにしたら良いでしょうか。 If Range("A4:A" & Range("A" & Rows.Count).End(xlUp).Row).Offset(,1).FormulaR1C1.Value=100Then Range("L4:L" & Range("L" & Rows.Count).End(xlUp).Row).Offset(, 1).FormulaR1C1.Value = "優" ElseIf ("L4:L" & Range("L" & Rows.Count).End(xlUp).Row).Offset(, 1).FormulaR1C1.Value = ????  ・  ・  ・ End If

  • エクセルVBAでデータ最終行取得方法

    エクセルVBAでデータ最終行取得方法で良い方法を教えてください。 データの行数、列数は不定。 最多のデータ行の列も不定。 この条件で、データ最終行を取得するにはどうすればよいでしょうか? lastrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row では、A列の最終行に限定されます。 lastrow = ActiveSheet.Cells(1, "A").SpecialCells(xlLastCell).Row では、列の限定はありませんが、一旦データ入力後、削除した部分まで入ってしまいます。 lastrow = ActiveSheet.UsedRange.Rows.Count では、データ入力後、削除した部分まで入ってしまい、かつ、1行目など上部が空白の場合、不正確になります。

  • VBAについて

    VBAで最終行を取得する際に、""などを無視するようにしたいのですが、どうすればよいのでしょうか? 最終行は以下のように取得しています。 GYOMAX_T = SH.Cells(65536, cnt).End(xlUp).Row すみませんが、よろしくお願いいたします。

  • VBAで値の取得

    VBAで値の取得 osはxp エクセル2000です。 エクセルのシートに計算した値をVBAで入れたいと思います。 行数は変動します。 入れたい値は金額×数値です。なので切捨てになります。 計算式は  F3=TRUNC(1250*B3)+TRUNC(1000*C3)+TRUNC(1000*D3)+TRUNC(1250*E3) 添付のエクセル画面を参考にして下さい。 私が考えたもので、これからどのように変更すれば値の取得ができるでしょうか? Dim LastR As Long, Cnt As Long '最終行と行番号 LastR = Range("B65536").End(xlUp).Row For Cnt = 3 To LastR 'B3から最終行まで Cells(Cnt, 6).Formula = "=TRUNC(1800 * Cells(Cnt, 2)) + TRUNC(1350 * Cells(Cnt, 3))"    Next (もちろんエラーになります。)

  • VBAで複数の行のナンバーを取得し、その行の列の値を参照して値を入れる

    下記のことをしたいのですが、調べてもわかりません。 どなたか教えてください。 よろしくお願いします。 内容: エクセルシートのA列の値が11である行ナンバーを取得(複数ある可能性があります)する。 その行のE列(5列目)の値と他のテーブルの値を参照して所定の値をA列の値が11である行のE列(5列目)に返す。 以下のVBAを書いてみましたがうまくいきません。 ----------------------------------------------------------------- Dim ROWCOUNT As Integer Dim row_array() As Variant Dim i As Integer '全行数を取得 ROWCOUNT=Worksheets("sheet1").Range("A1",Range("A65536").End(xlUp)).Count For i = 1 To ROWCOUNT If Cells(i, 1).Value = 11 Then Cells(i,1).Offset(0,5).Value=WorksheetFunction.VLookup(Cells(i, 1).Offset(0, 5).Value, Worksheets("sheet2").Range("A1:H1786"), 3, False) End If Next I

  • EXCEL VBA 早く処理をする

    よろしくお願いします 下の構文を標準モジュールに書き込み、callで実行しているのですが 処理に時間がかかります。 処理を早くする方法と構文の簡素化のご教示をお願いします。 Application.ScreenUpdating = False For i = 1 To 12 With Worksheets(i) .Select LastRow = .Range("A150").End(xlUp).Row + 1 .Range("A8:G" & LastRow).Sort Key1:=Range("A8"), order1:=xlAscending .Range("G8:G" & LastRow - 1).Formula = "=G7+E8-F8" LastRow = .Range("A150").End(xlUp).Row + 1 .Range("A" & LastRow).Select Dim EndRow As Long EndRow = .Range("A" & Rows.Count).End(xlUp).Row Cells(Rows.Count, 1).End(xlUp).Offset(1, 3) = .Name & "合計" Cells(Rows.Count, 1).End(xlUp).Offset(1, 4) = Application.WorksheetFunction.Sum(Range("E7:E" & EndRow)) Cells(Rows.Count, 1).End(xlUp).Offset(1, 5) = Application.WorksheetFunction.Sum(Range("F7:F" & EndRow)) Cells(Rows.Count, 1).End(xlUp).Offset(2, 3) = "前月繰越" Cells(Rows.Count, 1).End(xlUp).Offset(2, 4) = .Range("G7") Cells(Rows.Count, 1).End(xlUp).Offset(2, 5) = "" Cells(Rows.Count, 1).End(xlUp).Offset(3, 4) = "" Cells(Rows.Count, 1).End(xlUp).Offset(3, 3) = "次月繰越" Cells(Rows.Count, 1).End(xlUp).Offset(4, 3) = "合計" Cells(Rows.Count, 1).End(xlUp).Offset(3, 5) = Cells(Rows.Count, 1).End(xlUp).Offset(2, 4) + Cells(Rows.Count, 1).End(xlUp).Offset(1, 4) - Cells(Rows.Count, 1).End(xlUp).Offset(1, 5) Cells(Rows.Count, 1).End(xlUp).Offset(4, 4) = Cells(Rows.Count, 1).End(xlUp).Offset(2, 4) + Cells(Rows.Count, 1).End(xlUp).Offset(1, 4) Cells(Rows.Count, 1).End(xlUp).Offset(4, 5) = Cells(Rows.Count, 1).End(xlUp).Offset(3, 5) + Cells(Rows.Count, 1).End(xlUp).Offset(1, 5) Cells(Rows.Count, 1).End(xlUp).Offset(1, 6) = "" Cells(Rows.Count, 1).End(xlUp).Offset(2, 6) = "" Cells(Rows.Count, 1).End(xlUp).Offset(3, 6) = "" Cells(Rows.Count, 1).End(xlUp).Offset(4, 6) = Cells(Rows.Count, 1).End(xlUp).Offset(0, 6) .Range("C7").End(xlDown).Select Selection.Offset(4, 2).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(4, 2).Borders(xlEdgeBottom).LineStyle = xlDouble Selection.Offset(4, 3).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(4, 3).Borders(xlEdgeBottom).LineStyle = xlDouble Selection.Offset(4, 4).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(4, 4).Borders(xlEdgeBottom).LineStyle = xlDouble Selection.Offset(0, 2).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(0, 2).Borders(xlEdgeBottom).LineStyle = xlContinuous Selection.Offset(0, 2).Borders(xlEdgeBottom).Weight = xlThin Selection.Offset(0, 3).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(0, 3).Borders(xlEdgeBottom).LineStyle = xlContinuous Selection.Offset(0, 3).Borders(xlEdgeBottom).Weight = xlThin Selection.Offset(0, 4).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(0, 4).Borders(xlEdgeBottom).LineStyle = xlContinuous Selection.Offset(0, 4).Borders(xlEdgeBottom).Weight = xlThin End With Next i Application.ScreenUpdating = True

  • VBA データのある最終行の取得

    エクセルVBAで最終行を取得する良い方法を教えて下さい。 VBA初心者でいきづまっていまして、、、 内容はボタンを押した時にF列に対して最終行を取得して、 その最終行の下のセルにボタンの内容が繁栄させるようにしたくて Private Sub CommandButton202_Click() Dim lastRow As Long lastRow = Cells(Rows.Count, 6).End(xlUp).Row + 1 Cells(lastRow, 6).Value = CommandButton202.Caption End Sub と作ってみたのですが、F17より下に文字がはいっているため、 検索範囲を「F列」ではなく、「F2:F16」のように範囲を指定したいのですがどうしたらよいでしょうか、、、。 結構色々調べてはみたのですができなくて、、、

  • データの値取得マクロ

    Sub Macro1() ''Worksheets("Sheet1").Activate ' addrw = Range("b65536").End(xlUp).Offset(1).Row Cells(addrw, 2).PasteSpecial end sub でB列の最終行を取得しその後、最終行の次のセルから追加のデータを貼り付けるマクロを作成しました。 このあと、追加のデータを貼り付ける前のB列の最終行の値と貼り付け後のB列の最終行の値を取得したいのですがどうすればいいでしょうか?

  • Excel VBA について

    ExcelのVBAのコードでB列の1カ所の「zz2300」を取得したいのですが、 どういう記述をすればよろしいのでしょうか。 ※その列には同じ文字は存在しません。 test=Range("b65535").End(xlUp).Rowの定義があるのですが使えますか?

専門家に質問してみよう