質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

16465閲覧

オートフィル後、件数が0件だった時は0件という結果が返ってくるようにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/07/11 07:04

編集2019/07/11 07:50

現在、ExcelVBAの勉強を独学でやっております。
主にネットでググったりなどして自分で動かしながらやっています。
そこでオートフィルタについて知識のある方からのご教示をいただきたく、相談させていただきました。

現在、オートフィルタした後の結果が何件あるかということを判断するコードを
考えています。
今までは、オートフィルタした後の結果から最終行を取得し、その値が「1」(見出し行)以外だったら
オートフィルタした結果は0だということにしようと考えていました。

ソースはこんな感じです。

ExcelVBA

1'(略) 2 3with outputFile 4 5'オートフィルタ 6.Range("A2").AutoFilter Field:=strfilter_Row, Criteria1:="=AAAA", Operator:=xlAnd, Criteria2:="=VVV" 7 8'オートフィルタ結果の最終行の値を変数に格納 9endcol = .UsedRange.Rows(.UsedRange.Rows.Count).Row 10 11'オートフィルタの結果が0だった場合 12If endcol = 1 Then 13 '~処理~ 14 15end if 16 17End with

でも、これだとよく考えたら、例えばデータが63件(見出し行も含む)だとすると、
オートフィルタした結果が0件だったとしても結果は64行目、という値が返ってきてしまいます。

なので、オートフィルタの件数を取得するコードを探しました。
そしたらこのコードがあったので、これで試してみました。

ExcelVBA

1If Cells(Rows.Count, 1).End(xlUp).Row = 1 Then 2 MsgBox "0件です" 3Else 4 MsgBox Range(Range("A2"), Cells(Rows.Count, 1).End(xlUp)) _ 5 .SpecialCells(xlCellTypeVisible).Count & "件です" 6End If

しかし、これも試してみたのですが、なぜかうまくいかず・・・。

それで、それならば、せっかくなので1つめのコードでうまくいってるのだからそれをうまく使えないか考えました。
そして、例えば1つ目のコードを動かした結果最終行が64行目だという結果が出るなら、
そこからさらに1つ上の行を読んで、その行が1行目だったら0件とみなす、というふうに
しようかなと考えました。

しかし、そういう結果を出すためのコードが思いつきません。
どなたかご教示いただけないでしょうか。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

S_kawa

2019/07/11 07:40

オートフィルとオートフィルタが紛らわしい為、統一してください。 >しかし、これも試してみたのですが、なぜかうまくいかず・・・。 どううまくいかないのでしょうか。
thyda.eiqau

2019/07/11 07:42

オートフィルターとオートフィルは別物です。タイトルと本文の表記をオートフィルターに統一することをおすすめします。 「うまくいかず」は、どういう期待をしていてどういう結果が得られてしまうのか分かりませんので、具体的に記載いただけますか。
dit.

2019/07/11 07:44

S_kawaさんも指摘されていますが、「オートフィル」と「オートフィルタ」は名前は似ていますが全くの別物です。 質問内容からおそらくオートフィルタの方と思われますが、質問を編集し正しい用語に直してください。(オートフィルは、セルの右下の十字っぽいところからドラッグするとコピーとかできるアレです)
guest

回答2

0

解決されたようなので、もう見られないかもですが、
一応書いておきます。
オートフィルターの情報はそれがある、シートが持っていますので、
そちらから情報を取り出します。

日本語で書くと、
例えば、
「アクティブなシートのオートフィルタのセル範囲の1列目の表示されているセルを数える」と命令すれば、よいです。

1個は必ずタイトル行なので、その分を引いてやれば、
何件抽出されたかわかります。
VBAのコードで書くと、

ExcelVBA

1sub test() 2 dim n as long 3 4 n = activesheet.autofilter.range.columns(1).specialcells(xlCellTypeVisible).count - 1 5 6 msgbox n & "件抽出されました。" 7end sub

こんな感じになります。(直接ここに書いたので、タイプミスがあったらごめんなさいです。)


もっともっと勉強したいので、おすすめの参考書など教えてもらえると嬉しいです。

んと、入門書は一応読まれて、ある程度理解されているかなと思いますが、
次の段階の参考になりそうな書籍はほとんどありません。
必要になったテーマでアマゾン等で検索してみてください。
そういった意味では、Webで検索した方がピンポイントで早く情報が得られるかなと思います。

ただし、次の段階に行く前に、
「オブジェクト」という概念や、「オブジェクト変数」をしっかりWebで検索して、
理解されることをお勧めします。
それができたら、
次は必要な情報を自分で探れるようになってください。
そのために、「ヘルプ」が用意されています。
初心者にヘルプは難解な文書ですのが、これを読みながら、コードが書けるようになれば、
脱初心者かなと思います。
ヘルプは「初心者」を助けるものではなく、「開発者」を助ける文書ですので。
そして、ヘルプを読んでも意味が分からなければ、
Webで検索してみてください。
ExcelVBAの情報は幸いなことにたくさんありますので、
大抵のことは解決できるはずです。
それでも、わからない、あるいは、上手く行かないことも最初はあると思いますが、
そのときは納得するまで掲示板で聞きまくりましょう。
僕は、掲示板で聞きまくって勉強しました。

これからは実践あるのみです。
沢山コードを書いて、
沢山人の書いたコードを読みましょう。
そのためには、色々な掲示板を巡回してみるといいと思います。
ExcelVBAがテーマの掲示板も数件あります。

今回の件について、も少し言いますと、
1行で纏めることにあまり意味はありません。
後で読んで読みやすいように書きましょう。
これも経験を重ねてみないと実感が得られないとは思いますので、
いくつかのマクロを運用し、メンテナンスしていく中で覚えてください。
あと、もう一つアドバイスすると、
最初にした「オブジェクト変数」とつながるのですが、
「同じ文言が、2つ以上出てくるときは、変数を利用する」ようにしましょう。
処理速度にも影響が出る場合がありますが(普通は体感できないかも)、
メンテナンス性が向上します。
とはいえ、メンテナンスのことを考えてコードを書くこともなかなか難しいので、
力量にあわせて、ちょいちょいメンテナンスできたらいいのかなと思います。

最後に参考になりそうなサイトを紹介しておきます。

http://www.asahi-net.or.jp/~ef2o-inue/menu/menu04.html
http://officetanaka.net/excel/vba/
https://www.relief.jp/Excel-VBA/
http://home.att.ne.jp/zeta/gen/excel/

この辺を一通り読めば、中級に近づけるかも?

あ、あと書籍でいうと
https://www.amazon.co.jp/%E4%BB%95%E4%BA%8B%E3%81%AB%E5%BD%B9%E7%AB%8B%E3%81%A4ExcelVBA%E5%AE%9F%E7%94%A8%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB-%E7%AC%AC3%E7%89%88-Excel%E5%BE%B9%E5%BA%95%E6%B4%BB%E7%94%A8-%E6%B8%A1%E8%BE%BA-%E3%81%B2%E3%81%8B%E3%82%8B/dp/479736761X

個人的にお勧めです。

僕が一番初めに買った本ですが、
初心者にはちょっとわかりづらい面があるかも知れません。
ですが、理解できてないので、他の入門書を買い漁りました^^;
ある程度理解できたところで読み直すと、
一番いい本だなという感想です。
理解できてない用語をすっとばして読んでたから、理解できなかったんだと思います。
内容的には、よくありそうな実例のサンプルコードが掲載されています。
大抵の事柄は網羅されているのではないでしょうか
なかでも、サンプルコードに、オブジェクト変数を多用してて好感が、持てます。
古めの中古でも、現在でも十分使用可能だと思います。
が、出来れば最新の情報も欲しいですね。

投稿2019/07/12 03:02

編集2019/07/13 00:12
mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/12 03:27

すごいです、ありがとうございます! 実は、回答を締め切った後にまたエラーが出てしまったのでどうしようと思って困っていたところでした。 なのでタイミング良く教えていただけて取っても助かりました。 しかもコードが1行でシンプルにできるんですね・・・ 当たり前ですが、勉強不足を感じました。 もっともっと勉強したいので、おすすめの参考書など教えてもらえると嬉しいです。 それではまたteratailのどこかでご縁があればまたよろしくお願いいたします。
guest

0

ベストアンサー

色々と申し訳ございません。自己解決したので報告させていただきます。
色々と触っていたらいつの間にか解決していた感じになってしまいましたが、
おそらくオートフィルタのコードがその後の判断処理と合わなかった?のかな?と思っております。

念のため、ソースを貼っておきます。

ExcelVBA

1Selection.AutoFilter 2 .Range("A1").AutoFilter Field:=30, Criteria1:="=AAAA", Operator:=xlAnd, Criteria2:="=VVV" 3 4 5If .Cells(Rows.Count, 1).End(xlUp).Row = 1 Then 6 7 'オートフィルタの結果が0だった場合の処理 8 9End If 10

なんだかよく分からないうちに解決してしまったのでちょっとモヤっとしていますが・・・
でも解決できたのは良かったです。

また説明文についてのご指摘などありがとうございました。
今後テラテイルに質問を投稿するときは、Excelの専門用語を間違えないよう気を付けたいと思います。

それとうまくいってない現状の説明も足りていませんでした。
そのあたりも反省して次に生かしたいと思っています。

今後もよろしくお願いいたします。

投稿2019/07/11 08:08

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問