[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『オートフィルターで抽出した行数を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.