[[20080808234849]] 『オートフィルタで集計後にVBAマクロでデータを』(kokit) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『オートフィルタで集計後にVBAマクロでデータを取得したい』(kokit)
 オートフィルタで集計した後に、その集計されたデータのみを
 VBAマクロで1件ずつデータ取得したいのですが
 出来ますでしょうか?

 [エクセルのバージョン]
 Excel2003

 [OSのバージョン]
 WindowsXP

 最終的にはどの様な事がなさりたいのですかね?
 或いは、kokitさんが作ったコードでは
 どの様な問題点が有っての御質問なのですかね?

 オートフィルタで絞り込みを行った後
 有る一行が表示されている行か、されていない行かは
 行の状態を見ないと分かりません。

 場合によっては、オートフィルタを使用せずに
 条件に一致する行かそうでない行か を
 確認するのと同じ様なコードに成ると思います。

 ダミーシートでも作成し
 オートフィルタで絞り込んだ後のデータを
 コピーし、貼り付けたデータを使用し
 処理を行っていくのが速いかもしれません。

 こちらの過去ログはご参考に成りそうでしょうか?
[[20080330111413]]『3行おきに30行ずつの転記』(aki)

 (HANA)

 >その集計されたデータのみをVBAマクロで1件ずつデータ取得したいのですが出来ますでしょうか? 

 集計表(データ)だけの表にしてしまいたいということでしょうか。
そうであれば、表示されていない行(非表示行)を下から順に行削除するマクロを
作ればいいようですが。(元データは保管しておいてくださいね。) (夏雲)

こんにちは
表示されていない行を削除するようなマクロのサンプルはありますでしょうか?
もしも表示されていない行を削除する事が出来るようでしたら、表示されている
データも取得できそうな気がするのですが・・・。
サンプルをいただけたら幸いです。


 HANAさんのおっしゃるように別シートに書き出せば良いのでは。
 オートフィルタで抽出した後で実行します。
Sub Test鮎()
    'Selection.AutoFilter Field:=1, Criteria1:="=*1*", Operator:=xlAnd  'オートフィルタで抽出
    Sheets("Sheet1").Cells.Copy Destination:=Sheets("Sheet2").Cells(1, 1)
    Sheets("Sheet1").ShowAllData
    'Sheets("Sheet1").Cells.Delete 'Shift:=xlUp '元のSheet1を消すとき
    'Sheets("Sheet2").Cells.Copy Destination:=Sheets("Sheet1").Cells(1, 1)
End Sub

 (川野鮎太郎)

 >表示されていない行を削除するようなマクロのサンプルはありますでしょうか

  完璧ではありませんが,オートフィルタ後に下記マクロを実行して
 末尾データの下の行(空白行)の番号を訊いてきますので数値を入れると,見える行だけになります。
    (夏雲)(コピーデータで試してください。)

  Sub test()
 Dim lr As Integer
 Dim i As Integer
 lr = InputBox("末尾データ行の下の行番号入力 例   32")
 For i = lr To 1 Step -1
 If Rows(i).Hidden = True Then
 Rows(i).Delete

 End If
 Next

 End Sub


 皆さんに知恵を拝借して,直しました。
  A列にデータがある仮定です。(夏雲)

   Sub test()
 Dim lr As Integer
 Dim i As Integer
 lr = Range("A1").CurrentRegion.Rows.Count

 For i = lr To 1 Step -1
 If Rows(i).Hidden = True Then
 Rows(i).Delete

 End If
 Next

 End Sub


 皆さんに知恵を拝借して下記のようにも直して
みました。こちらはデータのある場所には影響されないと思います。(夏雲)

      Sub test3()
 Dim lr As Integer
 Dim i As Integer
   With ActiveSheet.AutoFilter.Range
  lr = .Row + .Rows.Count - 1
  End With

 For i = lr To 1 Step -1
 If Rows(i).Hidden = True Then
 Rows(i).Delete

 End If
 Next

 End Sub


 場合によっては、
 オートフィルタで要らない行を表示させ
 表示されている行を削除した方が
 処理時間が短くて済むかもしれませんね。
 
 
 To,夏雲さん
 test3のコードですが、iは「1」まで
 行かない方が良いのでは?

 (HANA)

 >To,夏雲さん
 >test3のコードですが、iは「1」まで
 > 行かない方が良いのでは?

 test3に限りませんが,正確には(正しくは)その通りですね。
  一行目は必ず△マーク用に必ず表示されますので削除されないので
 2まででOKですが,結果は同じですね。(夏雲)


 To,夏雲さん

 私がtest3に限って書いたのは
 >データのある場所には影響されないと思います。
 と書いて居られるからです。

 オートフィルタの見出し行より上に
 非表示行が設定されている場合は
 削除されてしまいます。

 オートフィルタの範囲より下に
 非表示行が設定されている場合は
 削除されません。

 オートフィルタがどの範囲にあるか分からないけど
 その範囲で非表示の行は削除する ので有れば
 iは、オートフィルタの見出し行まで と
 しておくのが良いと思います。

 testの二つのコードに付いては
 そもそも「1行目から範囲の最終行までの間で」
 と言うコードになっているので、1行目まで走査すれば良いと思います。
 オートフィルタによる非表示行作成の場合は
 書いて居られるように、2まででOKですが結果は同じですから。

 (HANA)

 >データのある場所には影響されないと思います。
 この私の意味は, lr = Range("A1").CurrentRegion.Rows.Count
を使ったコードではA列を使って,範囲を判断していますので必ず
A列にデータがなければ使えません。
  そういう意味で,最後のコードはA列などの特定列のデータ有無に
 影響されず利用できるという意味です。
   ( 見出しについては一般的な1行目を想定していました。)

  (夏雲)

 あっっ、
 「もしかして、列方向の事かも?」
 と思って戻ってきたのですが・・・・
 既に
 >A列などの特定列のデータ
 と言う書き込みが・・・。

 ただ、せっかくですので
 行方向も影響されない物をにしておいた方が
 汎用性が高まるように思います。

 Sub オートフィルタ範囲の非表示行削除()
 Dim i As Integer
    With ActiveSheet
        If .AutoFilterMode = False Then
            MsgBox "オートフィルタが設定されていません。"
            Exit Sub
        End If
        With .AutoFilter.Range
            For i = .Row + .Rows.Count - 1 To .Row Step -1
                If Rows(i).Hidden = True Then
                    Rows(i).Delete
                End If
            Next
        End With
    End With
 End Sub

 ただ、当初のご質問からすると こちらの過去ログ
(このスレから見ると、未来のログですが・・・)
 も参考になると思いますので、リンクしておきます。
[[20080812102739]]『オートフィルタで抽出された各行をマクロで選択』(うめ) 

 (HANA)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.