• ベストアンサー

Excelマクロ質問

下記のようなデータがあるとき、同じ文字列がいくつ存在するか、 結果を出すマクロを教えていただけないでしょうか。 ある列データ a a b b b これを、 1列目 2列目 a    2 b    3 という風に、1列目をユニークにして、2列目に数を表示させたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.2

シート1のA列にデータが並んでいる。 タイトル行などは無くて,1行目からいきなりデータが列記されている。 作成例:エクセルに出来ることはエクセルにやらせる sub macro1()  dim target as range  worksheets("Sheet1").select  range("1:1").insert  range("A1") = "head" ’一意のリストをエクセルに作成させる  set target = range("A1:A" & range("A65536").end(xlup).row)  target.advancedfilter _   action:=xlfiltercopy, _   criteriarange:=target, _   copytorange:=range("C1"), _   unique:=true ’集計させる  range("D2:D" & range("C65536").end(xlup).row).formula _   = "=COUNTIF(A:A,C2)"  range("1:1").delete shift:=xlshiftup end sub

その他の回答 (3)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんにちは! 関数でもできますが、VBAがご希望だということなので。 すでに回答は出ていますので、参考程度で・・・ Sheet1のA列1行目からデータがあるとして、Sheet2に表示するようにしてみました。 画面左下のSheet1のSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub test() 'この行から Dim i, k As Long Dim ws As Worksheet Set ws = Worksheets("Sheet2") For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If WorksheetFunction.CountIf(ws.Columns(1), Cells(i, 1)) = 0 Then k = k + 1 With ws.Cells(k, 1) .Value = Cells(i, 1) .Offset(, 1) = WorksheetFunction.CountIf(Columns(1), ws.Cells(k, 1)) End With End If Next i End Sub 'この行まで こんな感じではどうでしょうか?m(_ _)m

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

一例です。 データはSheet1、集計はSheet2で行っています。 Sub sample() Set Db = CreateObject("Scripting.Dictionary") Set st1 = Worksheets("sheet1") Set st2 = Worksheets("sheet2") For a = 1 To st1.Cells(Rows.Count, 1).End(xlUp).Row Db(st1.Cells(a, 1).Value) = 1 Next wk = Db.keys For i = 0 To UBound(wk) st2.Cells(i + 1, 1) = wk(i) st2.Cells(i + 1, 2).Formula = "=COUNTIF(Sheet1!A:A,A" & i + 1 & ")" Next Set Db = Nothing End Sub

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.1

このような集計をしたい場合は、マクロではなく、ピボットテーブルを利用することをお勧めします。 集計対象の項目名を行フィールドとデータフィールドにドラッグしてみて下さい。 ちなみに関数で表示したい場合は、以下の関数を入力し下方向にオートフィルします(添付画像参照)。 ただし、データ範囲や表示データ数が多くなると、シートの動きが重くなるのであまりお勧めできません。 =INDEX(A:A,SMALL(INDEX((MATCH($A$2:$A$20&"",$A$2:$A$20&"",)<>ROW($A$2:$A$20)-1)*1000+ROW($A$2:$A$20),),ROW(A1)))&"" 数値の集計はCOUNTIF関数を利用します。 =IF(D2="","",COUNTIF(A:A,D2))

専門家に質問してみよう