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

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

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

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

Q&A

解決済

3回答

4837閲覧

VBAのフィルタ後の複数列を使った値の種類をカウントしたい

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

0グッド

0クリップ

投稿2018/07/13 01:57

編集2018/07/13 02:58

前提・実現したいこと

エクセルのVBAについて質問なのですが、フィルターをかけたあとに複数列の値の組み合わせが何種類あるかを数えるにはどのように記述したらよいのでしょうか

試したこと

フィルターを下記のようにかけたあとにSUMPRODUCTを使って種類を数えたのですが、
フィルターがかかっていない状態での値の組み合わせの数を数えてしまいます。

lang

1Selection.AutoFilter Field:=5, Criteria1:="0001" 2Dim 種類 As Integer 3種類 = Application.Evaluate("=SUMPRODUCT(1/COUNTIF(f287:I7114,f287:I7114))")

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

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

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

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

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

guest

回答3

0

ベストアンサー

自己解決しました。
ありがとうございました。

投稿2018/07/13 23:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hatena19

2018/07/14 01:58

自己解決したのなら、どのような方法で解決したのか、報告するのが礼儀だと思います。 回答者としてもそれなりに時間を割いているのですから、どのように解決したのかは有用な情報なので提供してほしいです。
hatena19

2018/07/14 06:30

あら、退会しちゃったのね。
guest

0

どのように記述したらよいのでしょうか

う~ん。
小賢しいコードだけのテクニックを求めるというより、
「どのような方法論で問題を解決できるか」という風にまずは考えるべきです。

>フィルターがかかっていない状態での値の組み合わせの数を数えてしまいます。

そうですね。ほとんどの関数は表示非表示に関わらず、指定した範囲を、
指定された通り計算します。(SUBTOTAL関数は表示されたセル範囲しか対象にしないかな?)
ただ、ユニークなデータの数を数えるオプションはSUBTOTAL関数にはないとおもいますが、
(関数は苦手なので関数で出来るかも知れませんが^^;)
こういった場合は作業用のシートを用意し、そちらに抽出されたものを転記したら、
今の数式が使えますよね?
フィルターモード中の操作は非表示セルは操作対象から外されますので、
単に表の範囲をコピペしたら、抽出されたデータのみを転記できます。
あとは数式で数えるなり、重複データの削除機能で重複を取り除いたあと、
行数を数えるなりしたら出来ると思います。
マクロで自動で行うのですから、多少の手順の多さより、
自分が思いつく解法を実現するマクロをまずは作ってみてください。
手動より速く正確に結果が出るはずですよね?
そのうえで、「実行に10分かかるので、もっと速くしたい」とか追及してみてはいかがでしょうか?

投稿2018/07/13 23:24

mattuwan

総合スコア2136

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

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

0

自分は関数は得意でないので、Dictionary で重複を排除してカウントするかな。

vba

1 Dim dic As Object 2 Dim c As Range 3 Set dic = CreateObject("Scripting.Dictionary") 4 For Each c In Range("F287:I7114").SpecialCells(xlCellTypeVisible) 5 dic(c.Value) = 0 6 Next 7 8 Dim 種類 As Integer 9 種類 = dic.Count

SUMPRODUCT(1/COUNTIF( ))は件数が多いと重くなるらしいので、速度的にもこちらの方が有利なような気がします。

投稿2018/07/13 11:40

編集2018/07/13 11:54
hatena19

総合スコア33620

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問