• ベストアンサー

Excelでフィルターのかかっているときの最終行の取り方。

Dim mySh As Worksheet Set mySh = Sheet("Sheet1") Debug.Print mySh.Cells(mySh.Rows.Count,1).End(xlup).Row でデータのあるA列の最終行を取得していますが、この場合、フィルターがかかっていると実際のデータのある最終行でなくて見えている部分の最終行が返ってきます。 Excel2003 SP3 WindowsXP SP3 フィルターがかかっていても実際のデータのある最終行を取得する方法あるのでしょうか?

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

  • ベストアンサー
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

A列とフィルタ範囲が別の場合も考慮してみました。 Dim mySh As Worksheet Dim c As Range Dim cRow As Long Dim Row1 As Long Dim Row2 As Long Set mySh = Sheets("Sheet1") Row1 = mySh.Cells(mySh.Rows.Count, 1).End(xlUp).Row If ActiveSheet.AutoFilterMode Then Row2 = mySh.AutoFilter.Range(mySh.AutoFilter.Range.Count).Row End If For Each c In mySh.Range(mySh.Cells(Row1, 1), mySh.Cells(Row2, 1)) If c <> "" Then cRow = c.Row Next MsgBox cRow

tss_jp
質問者

お礼

ありがとうございます。 正しい値が返ってきました。 参考にさせていただきたいと思います。 ≦(._.)≧

その他の回答 (1)

  • OtenkiAme
  • ベストアンサー率77% (69/89)
回答No.1

こんにちは。 > フィルターがかかっていても実際のデータのある最終行を取得する方法 データ範囲そのものの行数を取得するか Dim mySh As Worksheet Set mySh = Worksheets("Sheet1") Debug.Print mySh.Range("A1").CurrentRegion.Rows.Count Set mySh = Nothing オートフィルタのかかっているデータ範囲の行数を取得されては如何でしょうか。 Dim mySh As Worksheet Set mySh = Worksheets("Sheet1") If mySh.AutoFilterMode Then Debug.Print mySh.AutoFilter.Range.Rows.Count End If Set mySh = Nothing ところで、 Set mySh = Sheet("Sheet1") はエラーになりませんか?(Sheets)

tss_jp
質問者

補足

>はエラーになりませんか?(Sheets) なります。 10行目がタイトル行でそれ以降にAccessから取得した レコードが表示されていますが、タイトル行より上の 行も値があるとカウントされてしまいますので 先の方法はちょっと、怖いです。 上の行数を固定すればいけるかもしれません。 下の方は、何度も書いたり消したりしていると一番 最大の行(削除していても)を取得するようでちょっと だめかもしれません。

関連するQ&A

  • エクセル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でたとえばC列にどこまでデータが入力されているかを調べるとき、通常は r = Cells(Rows.Count, "C").End(xlUp).Row などでできます。 しかし添付画像のような入力フォームが出来上がっており、かつC列に最初から何らか(画像では〒マーク)の入力がされているので、そこに回答者が途中まで入力された場合、これでは最終行は取得できません。 逆に上からEnd(xlDown)でやろうとしても、途中に空白セルがあってお手上げです。 余分な〒マークを元データから削除してしまいたいのですがそれでは入力されているところのマークまで消えてしまいます。 このようなファイルが何百もあり、それを1枚のシートにまとめようとしているのですが、この最終行取得でつまずいてしまいました。 どのような方法があるでしょうか? 画像はエクセル2013ですが、実際にマクロを動かすのは2010です。

  • オートフィルタ 最終行を指定する必要は?

    エクセルでVBAでオートフィルタをする場合、 ******************************************* Sub test1() 最終列 = Range("IV1").End(xlToLeft).Column Range(Cells(1, 1), Cells(1, 最終列)).AutoFilter End Sub Sub test2() 最終行 = Range("a65536").End(xlUp).Row 最終列 = Range("IV1").End(xlToLeft).Column Range(Cells(1, 1), Cells(最終行, 最終列)).AutoFilter End Sub ******************************************* どちらでもできるのですが、 test2のように最終行を取得・指定する必要はあるのでしょうか?

  • フィルタで選択した行を別シートにコピーするマクロ

    よろしくお願いします シート1 の一行目にタイトルがあって 二行目以降にデータ(30列目まで)が 入っております そのデータをオートフィルタで抽出して 抽出されたデータ(タイトル行は不要)を 選択してシート2のデータ最終行の 一行下へ貼り付けたいのですが。 シート1で Range(Cells(2, 1), Cells(Cells(65536, 1).End(xlUp).Row, 30)).Select こうやって選択した後の記述がわかりません。 このままシート2の最終行を 選択貼り付けしようとするとシート1の選択内容が 消えてしまう(シート2が最新の選択になるため?) 挿入の際に「下へ」「右へ」など聞かれるのも 面倒なので行選択したいのですが 御教授ねがいます

  • オートフィルタをしても本当の最終行を取得したい

    エクセル2007のVBAについて教えてください。 A1→目次 A2→あ A3→い A4→う A5→え A6→お オートフィルタで「え」を抽出します。 この状態で Sub test() MsgBox Range("a65536").End(xlUp).Row End Sub を実行すると、5が返ってきますが 実際の最終行は6です。 オートフィルタをしつつ、最終行を取得するには どうすればいいのでしょうか? ご回答よろしくお願いします。

  • 何列の何行目が最終行なのか取得するコードはありますでしょうか?

      A列  B列  C列 1  ○   ○ 2        ○ 3               ○ これは最終行が3行目と言うのがぱっと見でわかりますが もっと列も行も多い場合、 シート内の何列の何行目が最終行なのか取得するコードはありますでしょうか? Cells(65536, ?).End(xlUp).Row を行ないたいのですが 毎回何列の行が一番下かを取得する方法があれば教えてください。 よろしくお願い致します。

  • 対象のシートが3行目からになった修正について

    対象のシートが3行目からになってしまったのですが、修正したいのですが、どこを修正したらよいかが分からず、困っています。お教え頂けませんか。よろしくお願いします。初心者で申し訳ありません。 Sub 統合() Dim J As Long Dim r As Long Dim s As Long Dim Sh As Worksheet Dim MaxRow As Long Dim MaxCol As Long Dim MyArray As Variant Dim JoinSh As Worksheet Set JoinSh = Worksheets("統合") '統合シートを変数に格納 JoinSh.Cells.Delete 'すでに統合シートが存在する場合は一旦セルを削除 s = 1 '最大行を超えた場合次の統合シートを作成するための番号 For i = s + 1 To Worksheets.Count 'シートを統合シートの次~末尾までループ With Worksheets(i) '各月シート If J = 1 Then r = 1 '最初だけ項目も取得 Else r = 1 '最初以外は2行目から取得 End If MaxRow = .Cells(Rows.Count, 10).End(xlUp).Row '9列目で最終行を取得 MaxCol = .Cells(1, Columns.Count).End(xlToLeft).Column '1行目で最終列を取得 MyArray = Range(.Cells(r, 10), .Cells(MaxRow, MaxCol)) 'A1~データ末尾まで配列に格納 End With With JoinSh '統合シート MaxRow = .Cells(Rows.Count, 10).End(xlUp).Row '統合シートの9列目で最終行取得 If MaxRow + UBound(MyArray) > Rows.Count Then '最大行を超える場合の処理 s = s + 1 '統合シートの番号を加算 Worksheets.Add Before:=Worksheets(s) '新規に統合シートを追加 ActiveSheet.Name = "統合" & s '名前が同じにならないように番号を追加 Set JoinSh = ActiveSheet '統合シートを変数に格納 MaxRow = JoinSh.Cells(Rows.Count, 10).End(xlUp).Row '統合シートの9列目で最終行取得 End If If .Cells(1, 1) = "" Then '最初だけ1行目から貼り付け Range(.Cells(1, 1), .Cells(UBound(MyArray), MaxCol)) = MyArray Else '最初以外は最終行の次に貼り付け Range(.Cells(MaxRow + 1, 1), .Cells(MaxRow + UBound(MyArray), MaxCol)) = MyArray End If End With Next i End Sub

  • エクセル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

  • エクセルVBAでオートフィルター最上行を取得するには

    データのリストからオートフィルターでE列のある特定のデータを表示し、それが複数の場合、最下行は Cells(ActiveSheet.Rows.Count, "E").End(xlUp).Row で取得できますが、見出しのすぐ下に来る一番目のデータがある最上行はどうやって取得したらいいのでしょうか? よろしくお願いします。

  • エクセル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」のように範囲を指定したいのですがどうしたらよいでしょうか、、、。 結構色々調べてはみたのですができなくて、、、

専門家に質問してみよう