• 締切済み

エクセルで組み合わせの集計方法

またお世話になります。 例えば下記のようなデータがあるとします。  |B|C|D|E| ---------------------- 1|a|b|c|e| ---------------------- 2|b|c|a|e| ---------------------- 3|a|e|f|g| ---------------------- 4|b|f|e|a| ----------------------      :      : (データは下へ追加されていきます) 上記のデータを行毎に調べて、各値と最も多い組み合わせを調べるにはどうしたらよいでしょうか? 例えば「a」と最も多く組み合わせているのは、「e」となります。 あた「b」と多く組み合わせているのは、「e」となります。 このように各入力値ごとに、最も多く組み合わせているものを抽出するにはどのようにしたら良いでしょうか。 実際には文字ではなく数字を入力しています。 私が考えている方法は、すべての文字に対しての組み合わせ表を作成して、そこから最も多いそれぞれの組み合わせを求めるということですが、これではかなりの量の組み合わせデータを作成しなければならないことになります。 もっと簡単にできる方法はないかと思い、こちらに質問させて頂きました。 とても難しいような気がしますが、アドバイスをよろしく御願いします。 (エクセル98を使用しております。)

みんなの回答

  • sakenomo
  • ベストアンサー率52% (35/67)
回答No.4

"組み合わせ"と考えると大変ですが、調べたい値、たとえば1なら、1を含む各行の中で、1の次に多くある値を調べればいいわけです。なんだかNo.545271のご質問の応用編のようですね。 以下のマクロは、各行中に重複する値は無い事が前提です。1-2と2-1の扱いですが、両方表示します。データを新しいシートのA1にかかるようにコピーして使ってください。 ちょっと長いですが、もう眠いのでNo.545271の関数を少し変えて使いました。 Sub test3() Dim c As Range, dc As Range, i As Integer, b As Byte, mc As Byte Dim ip As Integer, nb As Byte, ia As Integer, ei As Integer Dim myR As Range Set dc = Range("A1").CurrentRegion b = dc.Columns.Count Columns(b + 2).Value = "" For Each c In dc If c.Value <> "" Then i = 1 Do With Cells(i, b + 2) If .Value = "" And .Value <> c.Value Then Cells(i, b + 2).Value = c.Value ip = ip + 1 Exit Do Else If .Value = c.Value Then Exit Do End If End With i = i + 1 Loop End If Next c Set myR = dc.Offset(0, b + 4) myR.Value = dc.Value For ia = 1 To ip ei = 0 For i = 1 To myR.Rows.Count With myR.Rows(i) For nb = 1 To b If .Columns(nb).Value = Cells(ia, b + 2).Value Then .Columns(nb).Value = "" ei = ei + 1 mc = 1 Exit For End If Next nb If mc = 0 Then .Value = "" mc = 0 End With Next i If ei = 1 Then Cells(ia, b + 3).Value = "" Else Cells(ia, b + 3).Value = InLarge2(myR, Cells(ia, b + 2).Text) End If myR.Value = dc.Value Next ia myR.Value = "" Cells(1, b + 3).CurrentRegion.Sort Key1:=Cells(1, b + 3), Order1:=xlDescending, Header:=xlNo, _ Orientation:=xlTopToBottom, DataOption1:=xlSortNormal End Sub Function InLarge2(データ As Range, myS As String) As String Dim moji() As String, Cosu() As Integer, i As Integer Dim myRange As Range, Most As String, ip As Integer ReDim moji(データ.Count) ReDim Cosu(データ.Count) For Each myRange In データ If myRange.Text <> "" Then Do If moji(i) = myRange.Text Then Cosu(i) = Cosu(i) + 1 Exit Do Else If moji(i) = "" Then moji(i) = myRange.Text Cosu(i) = 1 Exit Do End If i = i + 1 End If Loop i = 0 End If Next myRange i = 1 Do If Cosu(ip) <= Cosu(i) Then If Cosu(ip) = Cosu(i) Then Most = Most & "," & moji(i) Else ip = i Most = "" End If End If i = i + 1 Loop Until Cosu(i - 1) = 0 InLarge2 = Cosu(ip) & "組 " & myS & "と" & moji(ip) & Most End Function

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

こんにちは。 難しいですね。 実際は数字でサンプルが文字と言うのもちょっと質問のされかたとしてはどうかと。。 直接回答とはいきませんが、参考になればと思います。 下記はタイトルを含まないデータがA列からD列に入っている想定で書いてます。 F列~G列にデータを出します。 テストではA1~D4に下記データだけを入れたシートを用意して行ないました。 A列 B列 C列 D列 a   b   c   e b   c   a   e a   e   f   g b   f   e   a 必ずテスト環境で試して下さい。 Sub aa() Const dRow = 6 Dim LRow As Long, pRow As Long, stCol As Integer Dim mgCol As Integer, maxCol As Integer LRow = Range("A65536").End(xlUp).Row For i = 1 To LRow   Rows(i).Sort key1:=Range("A" & i), Order1:=xlAscending, _   Header:=xlNo, Orientation:=xlLeftToRight Next i Cells(1, dRow) = "データ" pRow = 2: maxCol = 4 For i = 1 To LRow  stCol = 1: mgCol = 2  Do While stCol <= maxCol - 1   Do While mgCol <= maxCol    Cells(pRow, 6) = Cells(i, stCol) & Cells(i, mgCol)     mgCol = mgCol + 1: pRow = pRow + 1   Loop   stCol = stCol + 1: mgCol = stCol + 1  Loop Next i Columns(dRow).Sort key1:=Cells(1, dRow), Order1:=xlAscending, _           Header:=xlYes, Orientation:=xlTopToBottom Application.DisplayAlerts = False Cells(1, dRow).CurrentRegion.Subtotal GroupBy:=1, _      Function:=xlCount, TotalList:=Array(1), Replace:=True Application.DisplayAlerts = True Columns(dRow).EntireColumn.AutoFit ActiveSheet.Outline.ShowLevels RowLevels:=2 End Sub

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

#1の者です。 >(1)実際に試してみましたが、結果がセルに表示されませんでした。 ん~、難しいかな。。。 誤解されたようです。セルに本問の結果をセットする積もりでコーディングしてませんから。A1:D4にA,B,C,Dが入っているとして、画面にA-B,A-C,A-D,B-C,B-D,C-Dを表示するもので、1行の組み合わせはこれで良いですねと言う小手調べの、テスト的な部分的コーディグです。お望みのセルに結果を出すコーディングはもっとずっと行数が多くなります。 >(2)COUNTIF関数を使用していろいとと試しているのですが 全ての組み合わせを人間が拾い上げ、その組み合わせが 表中に何件あるかは関数で出せるでしょう。しかし七面倒 で私ならやる気がしません。 (3)本件はVBAでないと出来ないと思います。しかしVBAのコーディングを入れても、簡単でなくて、(1)のことからして、判っていただけるか心配です。

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

データ入力列がB,C,D,Eの4列で終わりですか。 これは例示であって、実際ではもっと沢山列があるのですか。ご存知のように組み合わせの数は、要素が増えると直ぐ大きくなります。それで難しくなりそうです。 多分操作や関数では不可能でVBAが必要になるでしょう。コーディグを希望しますか。ロジックは (1)各行について「各列の文(数)字の組み合わせ表(T)を作成して」 (2)既存の表(T)の中にその組み合わせがあるか探して (3)あればその組み合わせの件数を+1し、 (4)最終行まで繰り返して (5)件数列で降順にソートします。一番多い組み合わせは第1行目に出ます。 (6)うるさいのは(2)で、A-BもB-Aも同じと見なす必要があります。 各行の組み合わせは、第1行にA,B,C.Dが入っていてこの1行だけ組み合わせを見る例として Sub test04() i = 1 For k = 1 To 3 For j = k + 1 To 4 MsgBox Cells(i, k) & "-" & Cells(i, j) '確認用 Next j Next k End Sub で良いと思います。これを全行について行い、同じ組み合わせが既にないかチェックすれば良いでしょう。上記(6)に注意して。

cuty_girl
質問者

お礼

御回答ありがとうございます。 実際に試してみましたが、結果がセルに表示されませんでした。 ん~、難しいかな。。。 考えてみたのですが、例のデータを参考にすると、 B列とC列を検索対象にして、その中で「B=C」の条件を満たすものだけをカウントしていくというのはどうでしょう? COUNTIF関数を使用していろいとと試しているのですが、なぜか上手くいきません(ー_ー; でもかなりの労力を要するには変わりませんが。。。 もうちょっと、試行錯誤してみます。

関連するQ&A

  • エクセルで集計

    エクセルでの合計について教えていただきたいのです。 A1~A10000まで日付が、B1~B10000まで数値が入力されています。 B列の数値を50行ごとに合計し、C列に表示する方法。 現在は、sum関数で手作業です。 簡単に表示できる方法を教えてください。 また、C列に合計のある行をD列(D1・D2・D3・・・)、E列(E1・E2・E3・・・)、F列(F1・F2・F3・・・)に並べたいのです。(50行ごとに間引いて表示するような感じです) 現在は、=C50・=C100・=C150のように手作業です。 もっと多量のデータが入力されたシートもあります。また、100行ごと150行ごとなど合計行が違う場合もあります。 エクセル初心者です。 よろしくお願いいたします。

  • エクセルVBA 全ての組み合わせを作る

    エクセルVBAで、全ての組み合わせを表現する方法を教えてください 既にA列に色、B列に数字、C列にサイズが入力済みだとします   A  B  C 1  色  数字 サイズ ←タイトルの行 2  赤   1  S 3  青   2  M 4  緑   3  L (完成例)   D  E  F 1  色  数字 サイズ ←タイトルの行 2  赤   1  S 3  赤   1  M 4  赤   1  L 5  赤  2  S 6  赤  2  M 7  赤  2  L 8  赤  3  S 9  赤  3  M 10 赤  3  L 11 青   1  S 12 青   1  M 13 青   1  L 14 青  2  S 15 青  2  M 16 青  2  L 17 青  3  S 18 青  3  M 19 青  3  L 20 緑   1  S 21 緑   1  M 22 緑   1  L 23 緑  2  S 24 緑  2  M 25 緑  2  L 26 緑  3  S 27 緑  3  M 28 緑  3  L ・全ての組み合わせが表現できていれば、2~28行目は上の完成例の順番でなくてもいいです ・完成はD~F列の上から(2行目から)結果を反映させ、空白行を作らないようにする ・今回はA~C列の4行まで入力されている例をあげましたが、実際はA~C列の何行まで入力されているか随時変更します ・A~C列のデータ入力は、必ず上から(2行目から)されています ・A~C列のデータ入力は、5行目以降に続くこともあります ・A~C列のデータ入力は、データがない場合もあります (データ入力がない場合)   A  B  C 1  色  数字 サイズ ←タイトルの行 2      1  S 3      2  M 4         L (この場合の完成例)   D  E  F 1  色  数字 サイズ ←タイトルの行 2      1  S 3      1  M 4      1  L 5     2  S 6     2  M 7     2  L 空白行が出来てしまってはいけないので、『まずデータ入力されている列を認識し、認識した列の情報で全ての組み合わせを作成する』という考え方なのかな?と思ったのですが、そのようなことをエクセルVBAでできるのでしょうか もし分かる方がいたら教えてください よろしくお願いします

  • エクセル2000 同じ文字が入力されている個数を集計する

    A列には1~47の数字が200行まで入力されているものとします。 1 a c f e d 2 b a e d c 2 c d d f b 2 a f c a c ・ ・ ・ 47 d e d a b これときa~fが入力されている個数を次のように表にしたいと思いますが、関数でできますでしょうか。    a b c d e f 1   1 0 1 1 1 1 2   3 2 4 3 1 2

  • Excelで集計する方法

    Excelをほぼ使ったことがない初心者です。 1列目にa~zの文字がランダムに並んでいて、 2列目に0か1の数字が入力されているとします。 このときに、それぞれの文字ごとに1が何個あるか数えたいのですが、 どうすればいいのでしょうか? a  0 c  1 f  0 a  1 b  0 a  1 のように並んでいるものを aの合計  2 bの合計  0 cの合計  1 のように集計したいです。

  • エクセルで組み合せ一覧表を作成したいです

    エクセルでシート1のA1~O1の各セルには、アルファベットや数字(1~50)が入っています。 A1~O1までの15個のセルから、6つを選択した時の組み合せ一覧を作成したいと思っています。 組み合わせは計算すると、15C6となるので全5005通りになります。 組み合せの一覧は、シート2に表示させたいです。 (a,b,c,d,e,f)と(b,a,c,d,e,f)は同じものとします。 またA1~O1のセルに入るのは、アルファベットと数字の組み合せが複雑であれば、数字のみとしたいと思います。 関数だけで何とかしようと思いましたが、どうしても無理のような気がしてしまいましたので、こちらにご質問をさせて頂きました。 VBAの知識もないため、自分でプログラムを組む事もできません。 シートにVBAを組み込む方法は、これまでに経験があるので理解しております。 アドバイスを頂けると嬉しく思います。 何卒、よろしくお願い致します。

  • エクセルで組みあわせについて教えて下さい。

    エクセル2000です。エクセルで組合せの合計をだしたいのですが、 A1 58 B1 13.5 C1 44.5 D1 51.5 E1 31 F1 49.4 G1 19.6 H1 41.5 J1 41 となっていて、その中から「292」に一番近い組合せを知りたいんですが、方法がありましたら教えて下さい。 上記の場合だったら 58、51.5、31、49.4、19.6、41.5、41 が292になるといった感じです。 292になるなら上記では7つ数字を使いましたが、5つでも6つでもいいです。ぴったりにならなくても近似値でもOKです。 宜しくお願いします。

  • エクセル、任意の「行」だけを抽出したい。

    こんなことできますか? A1:F100のセル内にランダムに数字が入っています。 質問1) この中から 1行目→3行目→5行目と一つ飛ばしで入っているデータを抽出してH1:M100の範囲内に表示させるにはどのような操作をすればいいのでしょうか?関数とかで簡単に抽出表示させる技とかあればいいのですが・・・。 A1-B1-C1-D1-E1-F1 A2-B2-C2-D2-E2-F2 A3-B3-C3-D3-E3-F3 A4-B4-C4-D4-E4-F4 A5-B5-C5-D5-E5-F5 A6-B6-C6-D6-E6-F6 A7-B7-C7-D7-E7-F7 ・・・ A100-B100-C100-D100-E100-F100 の中から A1-B1-C1-D1-E1-F1 A3-B3-C3-D3-E3-F3 A5-B5-C5-D5-E5-F5 ・・・ を抽出して H1-I1-J1-K1-L1-M1 ・・・ H100-I100-J100-K100-L100-M100 の範囲内に表示させたいです。 質問2) 同様に、 1行目→4行目→7行目と二つ飛ばしで入っているデータを抽出してO1:T100の範囲内に表示させるにはどのような操作をすればいいのでしょうか?関数とかで簡単に抽出表示させる技とかあればいいのですが・・・。 ※ 説明がわかりにくいかもしれませんが、よろしくお願いします。

  • エクセルで組合せを求めたい

    A列B列にa~Zまでの任意一文字が5000行まで入力されているとします。 たとえば A1=a、B1=b A2=y、B2=z などと入力されていると仮定してください。5000行もあるので、A列B列が同じ組合せが出現します。 この組合せが同じ行を検索したいのですが、厄介な条件があって(a、b)の組合せと(b、a)は同じ組合せと見なしたいのです。 どなたかご教示下さい。

  • エクセルVBA 条件付整数組合わせ表示方法

    整数の組み合わせを表示する方法をおしえてください。 1~6の整数をつかって A<B<C かつ D<E<F となるような数字の組み合わせを A列 B列 C列 D列 E列 F列 1 2 3 4 5 6 1 2 4 3 5 6 ・ ・ ・ となるように順番に表示していくには どうすればよいのでしょうか?

  • Excelでの集計その2

    以前、似た質問をしたものです。下記のケース を、Excel(Excel2000)で作れるでしょうか 次のようなデータが10000件ほどあります。 ------------- (A)--------------------------- 行 商品コード 品名 品番  数量   金額 1 10010005   A商品 A-005  5   1000 2 10010006   B商品 B-006  5   1050 3 10010006  B商品 B-006  6   1100 4 10010007   C商品 C-007  10   100 5 10010008   D商品 D-008   6   60 6 10010009   E商品 E-009   3   300 7 10010010   F商品 F-010  7   700 8 10010010   F商品 F-010   3   300 ------------- (B)--------------------------- 行 商品コード 品名 品番  数量   金額 1 10010005   A商品 A-005  5   1000 2 10010006   B商品 B-006  11   2150 3 10010007   C商品 C-007  10   100 4 10010008   D商品 D-008   6   60 5 10010009   E商品 E-009   3   300 6 10010010   F商品 F-010  10   1000 ------------------------------------------------- (A)のような商品コードが一部同じデータを商品コードをキーにして、数量、金額を集計して(B)のようにしたいのですが、Excelでどのようにしたら出来るでしょうか? よろしくお願いします。

専門家に質問してみよう