dポイントプレゼントキャンペーン実施中!

初めて質問します。
エクセルでA列に入力されている、昨日までの日付データ行を非表示にする、VBAはどのように作成すればいいのか教えていただけないでしょうか?
他のホームページにあったVBAを使ってみましたがこのVBAですと空白部分も非表示になってしまいます。
お手数ですがよろしくお願いします。

A 回答 (4件)

質問は始めてらしいが、質問には簡単なシートの模擬実例を挙げること。

あなたしかシートは見えてないのだ。
関係ない事項と、コードを決定する事項と切り分けられる訓練をしないと。
さらっと読むとコードは単純で出来るように見えるが、
>空白部分も非表示になってしまいます
とはどういうデータ状態か。
それが判らないと、見当ハズレの回答をしてしまう。
プログラムの適否にばかり気を取られないで、あくまでプログラムは
データの有様+プログラムの組み方、なんだ。
    • good
    • 0

詳細がやや曖昧なので、コードは書きませんが、


まず、おおまかな考え方として・・・

1)作業対象を把握する
 A列のデータのある最終行を取得する
 (対象は1行目からその最終行まででOKか不明ですが)
2)対象のセルに対してループさせ、値が今日より以前ならその行を
 非表示にする。

基本的には↑で可能です。(多分現状のコードがこんな感じ?)

データが全て日付なのかどうか不明ですが、(あるいは文字列の日付か?)目的とする日付データかどうかをチェックして、関係ない場合は処理をスキップするなども必要となります。
(スキップなのか他の処理が必要なのかは、ご質問文からはわかりま
 せんが、空白セルもこれで省くことが可能になります)

例えば、vをバリアント型にしておいて、セルの値を代入し
 If TypeName(v) = "Date" Then
などで判別が可能です。(データが日付型の場合の例です)
そのセルの書式を判定したり、あるいはデータを日付に変換できるかから判断しても良いでしょう。

また、非表示にする処理を1行ずつ処理するとやたらと時間がかかるので、ループ内では選択だけしておいて、最後にまとめて非表示にする方が処理速度が速く効率的です。

さらに、既に非表示の行がある場合は、それを対象から省いてしまった方が効率的だと考えられます。
例えば、rngがRange型の変数として、
 Set rng = Cells(1, 1).Resize(Cells(Rows.Count, 1).End(xlUp).Row, 1)
 Set rng = Intersect(Cells.SpecialCells(xlCellTypeVisible), rng)
とすることで、A列の最終行までのセルのうち可視セルのみを選択できますので、この後は、この範囲内だけを処理対象として
 For Each c In rng
などとすることで、対象のセルだけを捜査することが可能になります。

もっとも、対象行数が少ない場合は、あまり効率などを気にする必要はないと思いますが…
    • good
    • 0

 ワークシートのレイアウトと、用途にもよろうかと存じますが、オートフィルタのオプションを利用するというのはいかがでしょうか?



Sub Test()
 Range("A1").AutoFilter 1, ">=" & Date
End Sub
    • good
    • 0

Sub test()


Dim i As Integer

For i = 1 To Range("A65536").End(xlUp).Row
If Range("A" & i).Value < Date Then
Rows(i & ":" & i).EntireRow.Hidden = True
End If

Next i

End Sub

でいかがでしょう
    • good
    • 0
この回答へのお礼

kmetuさんありがとうございます。
助かりました。

お礼日時:2009/08/18 20:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A