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

このQ&Aのポイント
  • エクセルでVBAでオートフィルタをする場合、最終行を指定する必要はあるのでしょうか?
  • VBAを使用してエクセルでオートフィルタを行う際、最終行を取得・指定する必要があるかどうかについて教えてください。
  • オートフィルタを設定する際、どちらの方法がより適切か、最終行の取得・指定が必要なのか教えてください。
回答を見る
  • ベストアンサー

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

エクセルで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のように最終行を取得・指定する必要はあるのでしょうか?

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

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.3

ご提示のサンプル・・と言うかオートフィルタの処理であれば、必要はあまりないと思います。 ただし、途中でまったくの空白行・空白列が挟まってしまう可能性があるなら必要な場合もあります。 (表の範囲は100行あるが、51行目には何も入力されていない、など) 任意のセル(下記はA1セル)を含む「連続する」表範囲を指定するのであれば、   Cells(1, 1).CurrentRegion.Select などのやり方もアリですね。

iwateryokou26
質問者

お礼

Cells(1, 1).CurrentRegion.Select は初めて知りました。ありがとうございました。

その他の回答 (2)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

実際には、そのサンプルであれば sub macro1()  range("A1").autofilter end sub とするだけで、勝手に右端列・最終行まで自動検知して適切にオートフィルタを取り付けてくれます。 ただし、何らかの理由で「全く空白の空行」「全く空白セルのみの空列」が範囲の中に含まれていた場合を想定して、右端列・最下行をキチンと調べて明示的に指定した方が、より「安全」とは言えます。 またご相談では列範囲も可変を想定していますが、通常は列範囲は既知で、下向け何行目までデータが記入されているかは不定というシチュエーションが大半です。 そういう場合 sub macro2()  range("A:B").autofilter end sub などのようにして、取りこぼしを防ぐ方法もあります。

iwateryokou26
質問者

お礼

A1さえ選択すればいいのですか。 「全く空白の空行」は想定してません。ありがとうございました。

回答No.1

オートフィルタは、列で1つのセルを選択すれば機能するものなので、最終行を考える必要はないと思う。 それとは別に、データの最終行、最終列の割り出し方にギモンあり! A列、行1を基準にする、それはとっても実用的でイイが、未だに、 最終行:Range("a65536").End(xlUp).Row 最終列:Range("IV1").End(xlToLeft).Column を使う人がいる。これでは2007以降の仕様拡張についていけない!! そもそもマジック難波は御法度の筈。 故意に使っているような気もするが、正しくは、 最終行:Cells(Rows.Count, "A").End(xlUp).Row 最終列:Cells(1, Columns.Count).End(xlToLeft).Column 最終行、最終列の検出方法にはさまざまあるようだが、下のリンクの考察は参考になる。 No.8 ワークシートの最終行、最終列を取得する 2007/03/05 http://www.niji.or.jp/home/toru/notes/8.html ワークシートの最終セル(最終行、最終列)を取得する… VBAをはじめた人は誰しも最初に引っかかる問題ではありますが、幸いにもインターネットで検索するといくつもの解決法が見つかります。 ところが…動いたり動かなかったり、想定外の動作をすることがあります。そもそもいくつもの解決法があること自体おかしい、いったい本当の答えはどれ?この際、白黒はっきりさせようじゃないかというのがこのページの趣旨です。

iwateryokou26
質問者

お礼

最終行:Cells(Rows.Count, "A").End(xlUp).Row 最終列:Cells(1, Columns.Count).End(xlToLeft).Column を使うようにします。 オートフィルタは最終行を気にする必要はなさそうですね。ありがとうございました。

関連するQ&A

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

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

  • vba エクセル

    2行目から、最終行までEmptyにしたいのにならないです。 1行目はフィールド行なのに、そのままにしたいのですが 2行目から最終行は空白にしたいです。 なので Sub TEST() With Sheets("log") lastRow = .Cells(.Rows.Count, "b").End(xlUp).Row LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column .Range(.Cells(2, LastCol), .Cells(lastRow, LastCol)) = Empty End With End Sub としたのですが、何も起こりません。 lastRowは100、LastColは5なのですが、 このマクロを実行しても何も起こらないです。 なぜでしょうか?

  • シートの全てを半角にする

    A列からT列、 行は10000行ほどあるのですが 全てを半角にしたいのですがマクロでないと無理でしょうか? Sub 全てを半角にする() Dim row行 As Long Dim col列 As Long For col列 = 1 To Range("IV1").End(xlToLeft).Column For row行 = 2 To Cells(65536, 2).End(xlUp).Row Cells(row行, col列) = StrConv(Cells(row行, col列), vbNarrow) Next row行 Next col列 End Sub でやるしかないですか? もっと効率のいい方法があったら教えてください!

  • オートフィルタを使わずに行削除

    こんにちは。 簡易記録のマクロで実行したものが、以下となります。 オートフィルタで選択した0以下の行を削除するために選択した物になります。 Sub 0以下を削除() ' Macro test ' ActiveSheet.Range("$A$1:$G$165").AutoFilter Field:=7, Criteria1:="<=0", _ Operator:=xlAnd Rows("3:56").Select ActiveWindow.SmallScroll Down:=66 Rows("3:165").Select Selection.Delete Shift:=xlUp ActiveSheet.Range("$A$1:$G$123").AutoFilter Field:=7 End Sub 行数は、日によって、様々で何千行となる場合もあります。 そこで、オートフィルタを使用せず、G列目の0以下の数値を行削除を行いたいです。 どのように設定したらいいか教えて頂けると幸いです。 不備がありましたら、補足を入れますので、 お手数ではございますが、宜しくお願い致します。

  • 【VBA】"オブジェクトが必要です"メッセージ出力

    VBAを使用し、A列に日付、B列に数量、C列に単価、D列に金額を入力し、 数量*単価にて、金額を求めるVBAを作成しています。 そこまでは上手くいくのですが、D列で求めた金額を最終行で合計する事で 躓いてしまっています。 行は常に追加され可変の為、最終行を「Cells(Row.Count, 1).End(xlUp).Row」 にて引っ張ってこようと思っております。以下のようなVBAを記載しましたが、 「オブジェクトが必要です」とのメッセージがでて、処理が上手くいきません。 どのような問題があるのか、お分かりの方、ご回答頂けますと幸いです。 ■環境  Windows7  Excel2010 ■VBA Sub test() Dim i As Long Dim j As Long Dim k As Long For i = 2 To Cells(Row.Count, 1).End(xlUp).Row Cells(i, 4) = Cells(i, 2) * Cells(i, 3) Next j = Cells(Row.Count, 1).End(xlUp).Row + 1 k = Cells(j, 1).End(xlUp).Row Cells(j, 4) = WorksheetFunction.Sum(Cells(2, 4), Cells(k, 4)) End Sub

  • 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 フィルターがかかっていても実際のデータのある最終行を取得する方法あるのでしょうか?

  • UsedRangeを使ってソートすることは可能?

    UsedRangeを使ってソートすることは可能ですか? エクセルですが 学年  組  出席番号 2    A    1 1    B    2 と言うデータがあり、 これにフィルタをかけつつ、A列で昇順に並び替えるVBAを作ってるのですが Sub さんぷる() オートフィルタをかける Range(Cells(1, 1), Cells(1, Cells(1, Columns.Count).End(xlToLeft).Column)).AutoFilter UsedRange.Sort Key1:=Cells(1, 1), order1:=xlAscending End Sub とすると、 UsedRangeでコンパイルエラーになるのですが どうすればよろしいでしょうか?

  • 最終列に入力されている文字を表示する

    エクセルVBAで最終列に入力されている値の表示方法について教えてください。 最終行については表示できるのですが、最終列に入力されているものの表示がうまくいきません。 A列の最終行の値をセル”D1”に表示するについては Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Long r = Cells(Rows.Count, 1).End(xlUp).Row Range("D1").Value = Cells(r, 1).Value End Sub でうまくいきました。 最終行、例えば3列目の10行目に”111”と入力されているときにセル”D1”に”111”と表示するようにはどうしたらよいのでしょうか。 どなたがご指南ください宜しくお願いします。

  • VBA 最終列に入力された値の表示について

    VBAで最終列に入力された値の表示について教えてください。 例えば10行目の10列目(J列)に”123”と入力された値をセル”D1”に表示させたいのですがどのようにすればよいのでしょうか。 A列の最終行については Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Long r = Cells(Rows.Count, 1).End(xlUp).Row Range("D1").Value = Cells(r, 1).Value End Sub でうまく表示できたのですが、最終列についてなかなかうまくいきません。 どなたかご指南ください宜しくお願いします。

  • 最終行に罫線を挿入

    A列からU列までの表があり、B列の最終行を基準にしてA列からU列までラインを引きたいのですが、 下記のように作成してみましたが、うまく作動しません。 REnd = Range("B65536").End(xlUp).Row + 1 Range(Cells(REnd.Row, "A"), Cells(REnd.Row, "U")).Select With Selection.Borders(xlEdgeTop) .LineStyle = xlDouble .Weight = xlThick .ColorIndex = xlAutomatic End With

専門家に質問してみよう