- ベストアンサー
VBAで複数の文言をカウントする方法
- VBAを使用して複数の文言をカウントする方法について悩んでいます。集計シートにある50種類の文言をカウントしたい場合、どのようにすればいいのでしょうか。
- 現在、VBAのマクロを使用して一つの文言のカウントを行っていますが、複数のカウントを取得する方法が分かりません。
- 具体的には、Cell(3,3) = WorksheetFunction.CountIF(Sheets("Sheet1").Range("A2:A100"), Cells(2,2))のように一つのカウント方法があるのですが、50種類の文言に対してそれぞれのカウントを取得したいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>現在、Cell(3, 3) = WorksheetFunction.CountIf(Sheets("Sheet1").Range("A2:A100"), Cells(2, 2)) これを生かし、複数シート、複数単語を対象に マクロを実行することで実現するのであれば 添付画像を例に 以下のコードはいかがでしょうか? Sub Sample() Dim RowCnt As Long Dim ColCnt As Long Dim PutWs As Worksheet Dim GetWs As Worksheet Set PutWs = ThisWorkbook.Sheets("集計") RowCnt = 2 Do ColCnt = 2 If PutWs.Cells(RowCnt, 1).Value = "" Then Exit Do Set GetWs = ThisWorkbook.Sheets(PutWs.Cells(RowCnt, 1).Value) Do If PutWs.Cells(1, ColCnt).Value = "" Then Exit Do PutWs.Cells(RowCnt, ColCnt).Value = _ WorksheetFunction.CountIf(GetWs.Range("A2:A100"), PutWs.Cells(1, ColCnt).Value) ColCnt = ColCnt + 1 Loop RowCnt = RowCnt + 1 Loop End Sub
その他の回答 (4)
- HohoPapa
- ベストアンサー率65% (455/693)
VBAで専用の関数を用意し、その関数で数える対応はいかがでしょうか。 よりシンプルですので、レイアウトや仕様の変更にも対応しやすいと思います。 添付画像のような配置を前提に 以下のコードです。 このコードを標準モジュールに配置します。 Function KeyCount(SHName As String, word As String) As Long Dim RowCnt As Long Dim LastRow As Long Dim HitCnt As Long HitCnt = 0 With ThisWorkbook.Sheets(SHName) LastRow = .Cells(Rows.Count, 1).End(xlUp).Row For RowCnt = 1 To LastRow If .Cells(RowCnt, 1).Value = word Then HitCnt = HitCnt + 1 End If Next RowCnt End With KeyCount = HitCnt End Function 続いて、 集計シートのB2セルに =KeyCount($A2,B$1) と埋め、必要数、右、下方向に複写します。
- ken-nosuke
- ベストアンサー率36% (56/154)
No1.の方は、文言が不定の前提なのですごく複雑になります。 貴質問は、文言が50種類とあるので固定していると考えれば関数で対応できます。 集計シート(Sheet51)に B1=りんご、A2=Sheet1 とすると Sheet1のりんごの数は次のようになります。 B2 =COUNTIF(Sheet1!$A$1:$A$100,Sheet51!B$1) B2のセルをC2,D2,・・・にコピーするとそれぞれC1,D1・・の文言の個数を表示します。 ここで $A$1:$A$100 や B$1 の$は絶対参照にするという記号でコピーしても変化しません。$が無いとコピーで移動した分参照先も移動します。(相対参照) 次にB2のセルをB3のセルにコピーし式の中の ”Sheet1” を ”Sheet2” に変えます。 B3のセルをC3,D3,・・・にコピーします。 以下同様にSheet3以降にコピーしていきます。 残念ながら、関数で、Sheet1,2,3を自動変更する手法は知りません。 VBAでFor Next の知識があれば手間は省けます。 Sub Macro1() For j = 2 To 5 A = Sheets("Sheet51").Cells(j, 1) For i = 2 To 5 Sheets("Sheet51").Cells(j, i) = WorksheetFunction.CountIf(Sheets(A).Range("A1:A50"), Sheets("Sheet51").Cells(1, i)) Next i Next j End Sub
- chayamati
- ベストアンサー率41% (260/624)
VBAがなくともCOUNTA関数で間に合いますが 敢えてVBAなら ――――――――----------------------------------- Sub 集計() Sheets("集計").Select Range("A3").Select Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "=COUNTA(Sheet1!C)" Range("B3").Select Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "=COUNTA(Sheet2!C[-1])" Range("C3").Select Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "=COUNTA(Sheet3!C[-2])" Range("D3").Select Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "=COUNTA(Sheet4!C[-3])" End Sub ―――――――------------------------------------------------------------------------ 以上ですが, 上記は列全体の件数です。見出し行の引算も 50Sheetともなると命令文が膨大になります Doループ,Forループ等での工夫も必要でしょう
- imogasi
- ベストアンサー率27% (4737/17069)
質問が載って以来相当時間が経っているが、回答が載らない。 いつもすぐVBA回答を出す」常連さんも数人いるのにね。 ーー 質問の表現や説明が、エクセルの普通の通り行われていない。 >Sheet1~50までのA列にある文言 とは、文章がおかしい。 例えばSheet1、Sheet2、・・Sheet50のシートがあり その各々のA列に文字列の語句があり、そ語句ごとに、出現数をカウントして、その数を 問題にしたいのか。 それとSheet1、Sheet2‥別に、文字列語句ごとに分けて数を出したいらしいな。 こういうクロス表は、システムで用意してくれてないと、難しいのだ。 色々なロジックがあるが、Sheet1-Sheet1のA列の文字列語句の バリエーションを算出するのがまず難しい。 1シートなら、データーフィルター重複するデータは無視する、で出せる。 しかし、50シートの範囲でそれを確定するのは、難しい で、 Sheet1 語句 aa ss dd ff ee aa ss dd Sheet2 語句 aa sss dd fff ee2 aa ss2 Sheet3 語句 ssd dfg vvv ff ee2 aa ssss ddx Sheet5は aa ss dd ff ee aa ss dd aa sss dd fff ee2 aa ss2 ssd dfg vvv ff ee2 aa ssss ddx ここで、データーフィルター重複するデータは無視するで aa ss dd ff ee aa sss fff ee2 ss2 ssd dfg vvv ssss ddx これ等の語句を、A列そして、第1行B列以下をSheet1,Sheet2,ーーーにして クロスしたセルにCOUNTIF関数を入れて、出現語句数を算出してはどうだろう。 >データーフィルター重複するデータは無視する や >クロスしたセルにCOUNTIF関数を入れて、出現語句数を算出 はVBAでもできるが、初心者はできる部分は市道でやるのが鉄則 その後VBあに進めばよい。
お礼
無事にカウントすることが出来ました! 本当に本当にありがとうございます!!!!