[[20060210100410]] 『オートフィルターで抽出した行数をMSGBOXで表示さ』(けい) ページの最後に飛ぶ

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

 

『オートフィルターで抽出した行数をMSGBOXで表示させたい』(けい)
 いつもお世話になります。さて、表題の件で悩んでいます。現在↓のマクロを組んでいますが、
 抽出した結果0行の場合も1行と2行の場合も1行と表示されてしまいます。どこが悪いのかお教えください。

 Sub データ修正()

   '転記用変数の宣言

    Dim hd As Date
    Dim hy As Variant
    Dim hn As Variant

    'シートを選択し変数へ値を代入
    Sheets("修正").Select
    hd = Range("M5") '何月何日分か
    hy = Range("M8") '費目は
    hn = Range("M11") '名前は

   '修正データでフィルター
    Sheets("データ").Select
    Application.ScreenUpdating = False
    Range("A2").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=6, Criteria1:=hd '月日で
    Selection.AutoFilter Field:=27, Criteria1:=hy '費目で
    Selection.AutoFilter Field:=2, Criteria1:=hn '名前で

   'データ修正確認
    Dim MSG, STYLE, TITLE, 更新, 取消
 'この部分です→ MSG = "修正データは" & Range("A65536").EndxlUp).Rows.Count  & "行です。" + Chr(10) + Chr(10) + "データを修正しますか?"
    STYLE = vbYesNo + vbQuestion
    TITLE = "データ修正"
    Beep
    更新 = MsgBox(MSG, STYLE, TITLE)
    'NOの場合、メイン画面へ
    If 更新 = vbNo Then
       Sheets("メイン").Select
       Range("A4").Select
       Exit Sub
    'YESの場合、手入力確認
    Else
       MsgBox " データを修正してください。" , vbInformation

    End If

        Application.ScreenUpdating = True
        Application.MoveAfterReturnDirection = xlToRight

 End Sub

 たぶんRange("A65536").EndxlUp).Rows.Count の部分を変更すればうまくいくのではと考えていますが、
 どうすればよいのか判りません。どうすれば、抽出した結果が0の場合は0、1行の場合は1というように表示できるのでしょうか?
 ちなみに、過去ログもみましたが、検索方法が悪いのか探しきれませんでした。(^^ゞ

 カッコワルイような気が(kohe)

 >たぶんRange("A65536").EndxlUp).Rows.Count の部分を変更すれば・・
                           ↓
                       End(xlup).

 >Range("A65536").EndxlUp).Rows.Count
 Range("A2", Range("A65536").End(xlUp)).SpecialCells(xlCellTypeVisible).Count
 (やっちん)

 衝突しましたがそのままアップ。
 
Range("A65536").End(xlUp).Rows.Count
Range("A65536")からCtrl+↑で選択されるRangeオブジェクトの「行数」をカウント
だから、何万行抽出されても「1」にしかなりません。
MSG = "修正データは" & _
      Range("A1:A" & Range("A65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible).Count - 1 & _
      "行です。" + Chr(10) + Chr(10) + "データを修正しますか?"
(みやほりん)(-_∂)b

 私のは抽出が0行でも1になっちゃいますね。
 (やっちん)


 ありがとうございました。
 Range("A1:A" & Range("A65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible).Count - 1を
 -2にすれば、0行の場合0になり、2行の場合は2になりました。
 本当にこの学校はありがたいです。(^。^)

 >    Range("A2").Select
2行目がオートフィルタ見出しなら、

 Range("A2:A" & Range("A65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible).Count - 1
のほうが論理にかないます。
(みやほりん)(-_∂)b

 私の方では0行がうまくいきません。
 セル1つに対してxlCellTypeVisibleを指定するとおかしな範囲が返ってきます。
 どうもシート全体の可視セル全てが返って来ているようです。
 みなさんはうまくいっているのでしょうか?
 >Range("A1:A" & Range("A65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible).Count - 1を
 >-2にすれば、0行の場合0になり、2行の場合は2になりました。
 2行目がオートフィルタの見出しの場合、抽出行が0行の場合でもA1,A2が必ず可視セルになるので
 セル1つにならずにうまくいきます。
 汎用性を考えると、オートフィルタの前に表の一番下のセルまたは行を取得して
 それをオートフィルタ後の可視セルの範囲指定に使う方法になるのかなと思います。
 もしくはB列も範囲に入れるとか。
 (やっちん) 

 私の所では2行目がオートフィルタの見出しですが、みやほりんさんに教えていただいたRange("A2:A" & Range("A65536").End(xlUp).Row).SpecialCellsxlCellTypeVisible).Count - 1
 でもうまくいきます。
 >Range("A65536")からCtrl+↑で選択されるRangeオブジェクトの「行数」をカウント
だから、何万行抽出されても「1」にしかなりません。
 を、教えていただいて、すごく勉強になりましたが、私のスキルではやっちんさんの問題は分かりません。(^_^;
 (けい)

 >Range("A2:A" & Range("A65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible).Count - 1

 抽出行が0行の場合に0行と表示されますか?
 (やっちん)

 やっちんさん、確認しました。たしかに0行のときはうまくいきません。
 分岐処理したほうがよさそうです。
 
If Range("A65536").End(xlUp).Row = 2 Then
'抽出が無いときの処理
Else
'抽出されたときの処理
End If
 
(みやほりん)(-_∂)b

 すいません。私も0行の時はうまくいきませんでした。
単純に1行以上の時しか確認していませんでした。\(__ ) ハンセィ
みやほりんさんの様に分岐処理を入れてみます。
いろいろ、ありがとうございました。
(けい)

 SpecialCellsは他にも予想外の動きをすることがあるようです。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=34024;id=excel
 (やっちん)


 おまけ
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=87;id=FAQ
 (Jaka)

 Jakaさんありがとうございます。
 いつも参考にさせていただいてます。
 (やっちん)

 jakaさん、おまけリンク、参考になります。
確か自分でSpecialCellsを使ったコードを作った記憶があって探してました。
分岐なんかしてなかったし、ちゃんと動いてたなぁ・・・って。
ごみコードの中からやっと発掘。
C列から始まるリストをA1の入力値でフィルタするものです。
(Currentregionを使っているので、B列は非表示、ダミー列にしてある)
 
 Private Sub Worksheet_Change(ByVal Target As Range)
     If Target.Address(0, 0) <> "A1" Then Exit Sub
     Dim MyRng As Range
     Set MyRng = Range("C1").CurrentRegion
     MyRng.AutoFilter field:=1, Criteria1:=Range("A1").Value
     MsgBox MyRng.SpecialCells(xlCellTypeVisible).Count / MyRng.Columns.Count - 1 & "件"
 End Sub
 
範囲を後から取得しようとするからダメなのね。
(みやほりん)(-_∂)b

コメント返信:

[ 一覧(最新更新順) ]


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