質問: excel vbaのカウントについて excel2003で表を作成しています。 画像のような表を作成しているのですが、 左のデータから右の表に数を入力するのに、vbaで出来ないでしょうか? countifを使おうと思ったのですが、countの条件が3つありますし、 左のabcの列は500行くらいデータが入っているので出来ればvbaで出来たらと思いました。
回答: こんばんは。 vbaを使わなくても、作業列で、3列を、= a2&b2&c2 というように合わせて、 countif で数えてもよいと思います。ただ、それはどなたかにおまかせします。私は、vba中心ですから、コードで回答しておきます。とは言っても、純粋に、vbaのコードで書くと、手間が多いので、数式を使います。 ただし、数式にエラーが発生すると、マクロ自体は止まりませんが、表の中にエラー値が出てきてしまいます。表の項目から、検索値を取り出しますから、表の項目が間違っていたり、スペースが入っていたり、ダブっていたりしたら、間違った答えが出てきてしまいます。 マクロを実行する前に、データや項目にスペースがないように、置換などを加えると確実だと思います。 標準モジュール '------------------------------------------- sub macrotest1() dim rng as range dim srch1 as variant dim srch2 as variant dim i as variant dim v as variant, w as variant dim x as long, y as long dim startr as range with activesheet '------------------------------------------- 'データ: a1から下,右3列 set rng = .range("a1", .cells(rows.count, 1).end(xlup).resize(, 3)) '列の項目 srch1 = .range("e2", .cells(rows.count, 5).end(xlup)).value '行の項目 srch2 = .range("f1", .cells(1, columns.count).end(xltoleft)).value '表のスタート set startr = range("f2") '------------------------------------------- y = 1 application.screenupdating = false for each v in srch1 x = 1 for each w in srch2 i = evaluate("sum((" _ & rng.columns(1).address & "= """ & v & """)*(" _ & rng.columns(2).address & "= """ & left(w, len(w) - 1) & """)*(" _ & rng.columns(3).address & "= """ & right(w, 1) & """))") .range("f2").cells(y, x).value = i x = x + 1 next w y = y + 1 next v application.screenupdating = true end with set rng = nothing end sub