• ベストアンサー

エクセルの関数・マクロで質問です。

たとえば マグロ サンマ サンマ タイ たまご たまご マグロ しめさば しめさば タイ こういった名詞が並ぶデータにあてると マグロ  2 サンマ  2 タイ    2 しめさば 2 たまご  2 というように、種類を表示して、その数を表示させるといった関数・マクロはありますでしょうか。 得意な方おりましたらご教授下さいませ。よろしくお願い致します。

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

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

たとえばA1セルからそういったデータが並んでいるとすると。 sub macro1() range("A1:A" & range("A65536").end(xlUp).row).advancedfilter _  action:=xlfiltercopy, _  copytorange:=range("C1"), _  unique:=true range("C1:C" & range("C65536").end(xlUp).row).Offset(0, 1).Formula = "=COUNTIF(A:A,C1)" end sub といった具合で,CD列に結果を出します。 手動で,2003まではデータメニューのフィルタからフィルタオプションの設定で(2007ではデータタブの重複の削除)で重複を無視した一意のリストを作成し,横にCOUNTIF関数を並べるのでも簡単に結果を出せます。 #別の良い方法 A1セルに「項目」と1セル記入しておいてから2行目以降にデータを並べ Excel2003まではデータメニュー,2007では挿入タブでピボットテーブルレポートの作成を開始し 行の所とデータの所(行とΣ値欄)に「項目」をそれぞれ配置してOKすると,リストアップから数を数えるのまで一気にやってくれます。 いずれにしてもメンドクサイけど一番肝要なのは「重複のない種類の一覧を書き出す」事で,関数式でも出来ないとは言いません(誰か回答してくれると思います)が実地の応用は難しいので,実際の仕事に使うのはお薦めではありません。 それでもどうしてもどうしても操作はイヤで関数だけでやりたいのなら,少し丁寧に作業列を使い 作成例: B列B2からデータを並べる A2セルに =IF(OR(B2="",COUNTIF($B$1:B1,B2)),"",COUNT($A$1:A1)+1)  以下コピー などのような計算を並べると初出のものに連番が計算できるので, D2: =IF(ROW(D1)>MAX(A:A),"",ROW(D1)) と入れて E2: =IF(D2="","",VLOOKUP(D2,A:B,2)) F2: =IF(D2="","",COUNTIF(B:B,E2)) 以下コピー といった具合に順番に作成してくことで出来ます。

kugutus
質問者

お礼

1つ目は何故か400エラーが出てしまい検証できませんでしたが、後ほどPC変えてやってみます。 ピボットテーブルで簡単にできたのですね。。。ありがとうございました。

その他の回答 (4)

noname#204879
noname#204879
回答No.5

関数も苦手、マクロも出来ない、そういう人にはピボットテーブルがある!

kugutus
質問者

お礼

ピボットテーブルの使い方から勉強した方が良いかもですね。情報ありがとうございました。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.4

> 名詞の並んだ列がB列というのをA列からマクロもしくは関数で抽出する方法はございますでしょうか? メニューのデータ→フィルタ→フィルタオプションの設定で 指定した範囲にチェック リスト範囲でA列のデータを選択 抽出範囲で B1を選択 重複するレコードは無視するにチェック これでA列の重複しないデータがB列に取り出されます。 この操作をマクロの記録でコードを出せば(A1からA10まで元のデータがあったとしたら) Range("A1:A10").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _ "B1"), Unique:=True となります。

kugutus
質問者

お礼

気付いたらたくさんのご返答が、 マクロで一回の操作で結果を出してしまいたかったので、この式は大変助かりす。 ありがとうございました。

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

こんばんは! 一例です。 関数でやる場合ですが、↓の画像のようにB列を作業用の列としています。 作業列B2セルに =IF(COUNTIF($A$2:A2,A2)=1,ROW(),"") という数式を入れオートフィルで下へずぃ~~~!っとしっかりコピーしておきます。 これ以上データがない!というところまでコピーしておいても構いませんん。 そしてD2セルに =IF(COUNT(B:B)<ROW(A1),"",INDEX(A:A,SMALL(B:B,ROW(A1)))) E2セルに =IF(D2="","",COUNTIF(A:A,D2)) という数式を入れ、D2・E2セルを範囲指定しE2セルのフィルハンドルで下へコピーすると 画像のような感じになります。 尚、余計なお世話かもしれませんがVBAで行う場合は当然作業列は必要なく↓のような感じのコードではどうでしょうか? 画面左下にある操作したいSheet見出し上で右クリック → コードの表示 → VBE画面がでますので ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub test() 'この行から Dim i, j As Long For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If WorksheetFunction.CountIf(Range(Cells(2, 1), Cells(i, 1)), Cells(i, 1)) = 1 Then Cells(Rows.Count, 4).End(xlUp).Offset(1) = Cells(i, 1) End If Next i For j = 2 To Cells(Rows.Count, 4).End(xlUp).Row Cells(j, 5) = WorksheetFunction.CountIf(Range("A:A"), Cells(j, 4)) Next j End Sub 'この行まで こんなんではどうでしょうか?m(__)m

kugutus
質問者

お礼

こちらの式もばっちり動きました。 同じ結果を出すにも式がたくさんあるとは驚きでした。こちらも使わせていただきます。 ありがとうございました。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

たとえば 数えたいデータがA列にあって 名詞の並んだ列がB列だとしたら =COUNTIF(A:A,B1) として必要なだけフィルしてください。

kugutus
質問者

補足

早速のご回答ありがとうございます。 名詞の並んだ列がB列というのをA列からマクロもしくは関数で抽出する方法はございますでしょうか?

関連するQ&A