• ベストアンサー

VBAで出来ますか?

EXCELで困ってます。 複数の列にあるデータをカウントしたいのです。 例えば↓の様なデータがあります。 名前 値  値  値  値 あか 1-1  1-2  2-5  7-3 あお 7-3  8-3  1-1 かい 2-5  7-3  8-3  1-2   うみ 1-2  2-5  7-3 どんな値が何個あるのか? その値はどの名前にあるのか? オートフィルタを使ったり、 ピボットテーブルを利用したりしましたが、 なかなかうまく出来ません。 例だと、 値 個数 名前 1-1 2  あか あお 1-2 3  あか かい うみ  2-5 3  あか かい うみ 7-3 4  あか あお かい うみ 8-3 2  あお かい 以上のような感じのものが欲しいのです。 別のシートに出来ると嬉しいです。 実際は、値の列が10個あります。 名前は、1000個ぐらいあります。 どうか、よろしくお願いします。

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

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.3

データのあるシートをアクティブにした状態で次のマクロを実行すると、 そのシートの右側に集計されたシートが出来ます。 シート名は、現在の名前+(集計)です。 実行時、すでにこの名前が、存在している場合は、削除後に新しく作成 されます。何回実行してもOKです。 Sub Macro1() Dim NewSh As Worksheet Dim Rng As Range Dim Rw As Long Dim Col As Integer Dim SName As String Dim Dt As String Dim N As Integer SName = ActiveSheet.Name Application.DisplayAlerts = False For N = 1 To Sheets.Count   If Sheets(N).Name = SName & "(集計)" Then     Sheets(N).Delete     Exit For   End If Next N Sheets.Add After:=Sheets(SName) Set NewSh = ActiveSheet NewSh.Name = SName & "(集計)" For N = 1 To 3   Cells(1, N).Value = Choose(N, "値", "個数", "名前") Next N Rows(1).HorizontalAlignment = xlCenter Columns(1).NumberFormatLocal = "@" Sheets(SName).Select Rw = Range("A1").CurrentRegion.Rows.Count Col = Range("A1").CurrentRegion.Columns.Count On Error GoTo nai For Each Rng In Range("B2").Resize(Rw - 1, Col - 1)   Dt = Rng.Value   If Dt <> vbNullString Then     N = Application.WorksheetFunction. _       Match(Dt, NewSh.Range("A:A"), 0)     If N = 0 Then       With NewSh.Range("A65536").End(xlUp)         .Offset(1).Value = Dt         .Offset(1, 1).Value = .Offset(1, 1).Value + 1         .Offset(1).End(xlToRight).Offset(, 1) = _           Cells(Rng.Row, 1).Value       End With     Else       With NewSh.Range("A" & N)         .Value = Dt         .Offset(, 1).Value = .Offset(, 1).Value + 1         .End(xlToRight).Offset(, 1) = Cells(Rng.Row, 1).Value       End With     End If   End If Next Rng nai: N = 0 Resume Next Application.DisplayAlerts = True Set NewSh = Nothing End Sub

2003tenn
質問者

お礼

回答ありがとうございます。 早速やってみました。 今までの作業が一瞬で出来ているので感動です。 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

#1です。コーディング例を挙げます。 (1) Sub test01() d = Range("a1").CurrentRegion.Rows.Count MsgBox d k = 1 For i = 2 To d For j = 2 To 10 If Worksheets("sheet1").Cells(i, j) = "" Then Exit For Worksheets("sheet2").Cells(k, 1) = "'" & Worksheets("sheet1").Cells(i, j) Worksheets("sheet2").Cells(k, 2) = Worksheets("sheet1").Cells(i, 1) k = k + 1 Next j Next i End Sub (2)手操作でA列をキーとしてソートしてください。 VBAでも出来ますが、今回は略。 (3)Sub test02() d = Worksheets("sheet2").Range("a1").CurrentRegion.Rows.Count MsgBox d k = 1 j = 2 m = Worksheets("sheet2").Cells(1, 1) Worksheets("sheet3").Cells(1, 1) = Worksheets("sheet2").Cells(1, 1) For i = 1 To d If Worksheets("sheet2").Cells(i, 1) = m Then Worksheets("sheet3").Cells(k, j) = Worksheets("sheet2").Cells(i, 2) j = j + 1 Else k = k + 1 Worksheets("sheet3").Cells(k, 1) = Worksheets("sheet2").Cells(i, 1) Worksheets("sheet3").Cells(k, 2) = Worksheets("sheet2").Cells(i, 2) j = 2 + 1 m = Worksheets("sheet2").Cells(i, 1) End If Next i End Sub 件数を出し忘れていますがよろしく。

2003tenn
質問者

お礼

回答ありがとうございます。 早速、やってみます。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

ロジックの1例を述べます。 (1)ある列について、B列から空白列まで右に進んで、「各列の値-A列の名前値」のペアのデータレコードを作ります。 それを最下行までに亘ってレコードを作ります。テキスト形式で作ります。 (2)「各列の値」の方で全レコードをソートします。 (3)「各列の値」のレコードは固まりますから、名前のバラエティをC列以下に展開しその数をB列にセットします。全ての「各列の値」のバラエティについて、下の行に展開します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルでフィルタ後の条件付き個数のカウント

    いつもお世話になっております。 エクセル(2007)で作成した表をフィルタ後に条件に合致する個数をカウントする方法を教えてください。 (例) A列:名前 B列:出身県のデータがあったとします。 名前でフィルタをかけた後、出身県ごとのカウントを行いたいのですが、条件が無い場合のデータ個数はSUBTOTAL関数を使えばOKなのはわかります。 COUNTIFS関数を使うと、フィルタで隠れた行のデータまでカウントしていまいます。 ピボットを使う(使い方がイマイチわかりませんが・・・)という方法もあると思いますが、今回は同一シート無いに関数でカウントしたいのです。 どなたかよろしくお願いいたします。

  • ピボットテーブルの操作

    Excel2010でピボットテーブルを勉強しています いま 添付図のようなデータで 男女別に”1”の個数 ”2”の個数 ”3”の個数・・・・・・・というようにデータの個数をカウントしたいのですが 何か良い方法はないものでしょうか ちなみに私はA・B・C各列別々にデータの個数をカウントし あとでSUM関数で合計するという原始的な方法でしのいでいます(各列のデータ数は特に必要ありません) COUNTIF関数なら苦労しませんが あくまでピボットテーブルで処理をしたいのです どうぞよいお知恵をよろしくお願いします

  • VBA 複数のセルの値をテキストボックスに表示する

    いつもお世話になっております。 初歩的質問かも知れませんが、宜しくお願いします。 EXCEL2007使用。 Sheet2に下記のような値があります。    A    B    C    D    E 1 あか  きいろ みどり みどり  しろ 2 しろ        しろ   しろ   くろ 3 しろ        あか   しろ   あお 4 きいろ       あお   しろ   あお 5 くろ                   あか 6 くろ                   あお 7                      しろ A1:E7までの範囲の値を、 Sheet1にあるテキストボックス(またはコンボボックス)に縦に表示したいのです。 A~Eの複数の列の値には空白も含まれていて、 縦一列に値を表示するにも、空白を省く処理ですでに躓いております。 何か良い方法がありましたら、 ぜひご教授お願いいたします。

  • エクセル オートフィルタで摘出したデータだけをカウントしたい vba

    エクセルでオートフィルタして摘出したデータをカウントしたいのですその結果をVBAのメッセージボックスで表示させてたいです。 オートフィルタについては、シート上で自ら条件を出しますので、ただカウントだけしたいです。 カウントさせるセルはA列の10番から110番です。 データは数値です お忙しいところどなたかご教授ください

  • VBA 期間を指定してデータを別シートに抽出

    sheet1に下記のような(例)データベースがありA~N列までデータが入力されています。 A  B  C  D  E  F  G  H I J K L M  N 1 りんご ○○ BA 2526  ○  あお *** *** *** *** *** *** 2015/7/1 2 みかん ××  BC  2526 ○  あお 2015/8/1 3 すいか ●●  BB  2429  ●  あか 2015/8/12 4 メロン □□  DC  2355 □  あか 2015/7/13 5 バナナ ○×  FE  2526  ○  あお 2015/6/1 6 いちご ●□  LA  2429  ●  あお 2015/8/21 7 ぶどう □○  HK  2526  □  あか 2015/8/7 「sheet1」N列の日付を元にして、別シート(sheet2)のA2列に「開始日付(yyyy/mm/dd」、B2列に「終了日付(yyyy/mm/dd」(例:2015/8/1~2015/8/31)を入力し、フォームボタン(例:抽出)で検索を開始し、抽出された結果のsheet1のA列~G列、N列のみ(H列~M列は不要)をSheet2のA7以下へ表示したいと考えています。 A  B   C  D  E  F  G   N 2 みかん ××  BC  2526 ○   あお 2015/8/1 3 すいか ●●  BB  2429  ●  あか 2015/8/12 6 いちご ●□  LA  2429  ●  あお 2015/8/21 7 ぶどう □○  HK  2526  □  あか 2015/8/7 期間を指定し検索した結果を別のシートへ表示するにはどのようなVBAのコードを使用すれば良いでしょうか。 宜しくお願いします。

  • 関数で可視セルのデータ個数カウント

    Excel2002を使用しています。 オートフィルタで抽出したデータの個数を関数で カウントしたいのですが、可視セルのみをカウント 出来る関数はあるのでしょうか? 例えば   A 1 件数 2  2 3  1 4  3 5  1 6 関数 A6セルに何らかの関数を入れておき、 A列のオートフィルタを使って、1を抽出した時は A6に”2” 3を抽出した時はA6に”1”を表示させたいの です。 このように、可視セルのデータ個数のみを カウントする関数はありますでしょうか? フィルタを使わずにCOUNTIF関数でカウントする 方法、また、可視セルをコピー貼り付け後 カウントする方法は避け、あくまでフィルタで 抽出したデータの個数を瞬時にカウントしたいの です。 ご教授宜しくお願いします。

  • Excel2007のピボットデーブルについて

    1シートに複数のピボットテーブルがあります。 それぞれ、列ラベル・行ラベル・値のフィールドはバラバラですが、レポートフィルタはどのピボットも同じです。 レポートフィルタには3つのフィールドがあり、内容はすべて同じです。 どこかのセルに値を入力すれば、すべてのピボットテーブルのレポートフィルタを変更する方法はありますでしょうか? または、まとめてすべてのレポートフィルタを一度に変更する方法はありますでしょうか? 変更するレポートフィルタは、3つのうちの1つです。

  • Excel2007のピボットデーブルについて

    Excel2007のピボットデーブルについて教えて下さい。 1シートに複数のピボットテーブルがあります。 それぞれ、列ラベル・行ラベル・値のフィールドはバラバラですが、レポートフィルタはどのピボットも同じです。 レポートフィルタには3つのフィールドがあり、内容はすべて同じです。 どこかのセルに値を入力すれば、すべてのピボットテーブルのレポートフィルタを変更する方法はありますでしょうか? または、まとめてすべてのレポートフィルタを一度に変更する方法はありますでしょうか? 変更するレポートフィルタは、3つのうちの1つです。

  • Excel VBA ピボットテーブル作成

    <元データ>Sheet1 A列 B列 C列 D列 E列 F列 商品名 種類 担当者 売上日 備考 本数 りんご 国産 新人 2010/4/1 売れ筋 5 なし 外国産 ベテラン 2010/4/5 通常 6 いちご 国産 新人 2010/3/23 通常 2 元データをもとにピボットテーブルを作成。添付図をご確認ください。 ピボットテーブルの下記条件を別シートにコピーしたいと考えています。※ピボットテーブルのシートはSheet2です。 C列の担当者で新人を選択、F列の本数で3本以上を抽出して Sheet3に貼り付けるマクロを考えています。 また、元データの行や列の増減に対応できるようにしたいです。 元データからピボットテーブルを作成して、希望条件のみを抽出して 別シートにコピーするマクロのサンプルをお教え頂けますでしょうか。

  • Excelピボットテーブルについて

    ピボットテーブルを使ってデータ集計をしています。 とある文字列Aの個数と文字列Bの個数を値として表に出しているのですが、 文字列Aの個数/文字列Bの個数を表示させる新たな列を作ることは可能でしょうか? 集計フィールドの挿入で「文字列A/文字列B」と入れてみたのですが、#DIV/0!になってしまいました。 もう少し具体的にやりたいことを書くと、 品物列に「きゅうり、りんご、トマト」の文字列 〇×列に「〇、×」の文字列 が、データベースに入っていて ピボットテーブルのほうできゅうりと入力されてる個数、〇と入力されてる個数が値としてあります。 きゅうりが3、〇が1だとして、1/3をパーセント表示した列を作りたいです。 (きゅうりの合計数のうち〇が何パーセントあるか) 分かりにくくてすみません。。 可能であればその方法も教えていただきたいです。

専門家に質問してみよう