- ベストアンサー
エクセルの関数で?
Excel2000で表を作っています。 内容は、複数の文字データを色々に組み合わせて、一つのデータを作るものです。 たとえば、項目1が「おひつじ座、おうし座、ふたご座・・・」、項目2が「東京都、千葉県、神奈川県・・・」など、項目3が「10代、20代、30代・・・」、項目4が「男性、女性」で、それらを組み合わせて、『しし座・茨城県・40代・女性』といった一つのデータにして、それを一覧表にしたいのです。 すべての項目をもれなく組み合わせなくてはなりません。 実際のデータはもっと項目がたくさんあって、今は手作業でコピー&ペーストしています。 エクセルの関数?などでもっと効率よく出来るのでしょうが、いろいろ検索しましたが、どう検索したらよいかもわかりません・・・ なにか良い方法があれば、ぜひ教えてください。 宜しくお願い致します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
vs-one様 取り急ぎマクロで作ってみました。こんなんでどうでしょうか?(あまりきれいじゃないかも・・・) これを標準モジュールにコピー&ペーストしてください。 セルA1から複数の文字データを入力して、[組合せ抽出開始]マクロを実行すると、7列目に全組み合わせを並べてくれます。 Private arPosData() As Integer Private arPosRead() As Integer Public Sub 組合せ抽出開始() Dim i As Integer Dim iP As Integer Dim iWrtRow, iWrtCol As Integer Dim strDmy As String 'データ終端列取得 Call getLastCol '各列のデータ終端行取得&読み込み位置配列初期化 For i = LBound(arPosData) To UBound(arPosData) arPosData(i) = getLastRow(i) arPosRead(i) = 1 Next i '書き込み開始位置指定(好きな位置に設定) iWrtRow = 1 iWrtCol = 7 '組み合わせ情報書き込み Do strDmy = "" For i = LBound(arPosRead) To UBound(arPosRead) strDmy = strDmy & Cells(arPosRead(i), i) If i <> UBound(arPosRead) Then strDmy = strDmy & "・" End If Next i If Len(Trim(strDmy)) <> 0 Then Cells(iWrtRow, iWrtCol) = strDmy Else Cells(iWrtRow, iWrtCol).ClearContents End If iWrtRow = iWrtRow + 1 Loop While isDataEnd(i - 1) = False End Sub 'データ終端列番号取得 Private Sub getLastCol() Dim i As Integer i = 1 Do While Len(Trim(Cells(1, i))) <> 0 i = i + 1 Loop ReDim arPosData(1 To i - 1) As Integer ReDim arPosRead(1 To i - 1) As Integer End Sub '指定列のデータ終端行番号取得 Private Function getLastRow(ByVal iCol As Integer) As Integer Dim i As Integer i = 1 Do While Len(Trim(Cells(i, iCol))) <> 0 i = i + 1 Loop getLastRow = i End Function 'データ読み取り行終端チェック Private Function isDataEnd(ByVal i As Integer) As Boolean isDataEnd = False arPosRead(i) = arPosRead(i) + 1 If arPosRead(i) = arPosData(i) Then arPosRead(i) = 1 If i = 1 Then isDataEnd = True Else If isDataEnd(i - 1) = True Then isDataEnd = True End If End If End If End Function
その他の回答 (5)
- matsu_jun
- ベストアンサー率55% (146/265)
=OFFSET($A$1,MOD(INT(ROW(A1)/30),8),0) & OFFSET($B$1,MOD(INT(ROW(A1)/6),5),0) & OFFSET($C$1,MOD(INT(ROW(A1)/2),3),0) & OFFSET($D$1,MOD(ROW(A1),2),0) で求められます。 上式は、見やすいように改行を入れています。実際は改行は不要です。 一番上の行がA列、二行目がB列、三行目がC列、四行目がD列のデータを取得する部分です。 今は試しにA列に8データ、B列に5データ、C列に3データ、D列に2データを入れてみました。 1行目の「30」は、実際は(B列の組合せ)×(C列の組合せ)×(D列の組合せ)を入れてください。 1行目の「8」は、実際はA列の組合せを入れてください。 2行目の「6」は、実際は(C列の組合せ)×(D列の組合せ)を入れてください。 2行目の「5」は、実際はB列の組合せを入れてください。 3行目の「2」は、実際はD列の組合せを入れてください。 3行目の「3」は、実際はC列の組合せを入れてください。 4行目の「2」は、実際はD列の組合せを入れてください。 詳しい説明は省略しますが、桁ごとに繰りあがりが異なる変則的なn進数を解析しています。
お礼
ご回答ありがとうございます。御礼が遅くなってごめんなさい。 早速実際のデータで試してみたところ、なかなかいい感じです!!!ただ、項目数が実際はもっとあるので、教えていただいた数式を自分なりに飲み込んでから工夫したいと思います。 ほんとうにありがとうございました。
- grumpy_the_dwarf
- ベストアンサー率48% (1628/3337)
あ、だめだ。さっきの方法は各項目の種類数が互いに素の場合しか使 えないんでした。2種類*2種類の場合を考えれば一目瞭然。m(__)m 一般人&自信なし落ち~残念!
お礼
ご回答ありがとうございます。お礼が遅くなってごめんなさい。 ↓早速ためしてみようとしたところ、だめだったんですね・・・残念! 本当に素人なもので、色々考えていただいて、とても助かります。ありがとうございます。
- grumpy_the_dwarf
- ベストアンサー率48% (1628/3337)
12種類と47種類と6種類ぐらいと2種類の組み合わせを1行目から全部 出すような場合、mod間数とrow関数をベースに作っていきます。 たとえば、=mod(row(),12)+1を下にドラッグしてみると、1から12ま での数値の繰り返しが出来ます。A列からD列まで、それぞれmod関数 の第2パラメータを12、47、6、2と変えて12*47*6*2行ドラッグすれ ば、それぞれの項目の何番目を使うのかの表が完成です。A1からだ と、2222から始まって1111で終わります。これを、 =indirect("Sheet2!A"&A1)&"・"&indirect("Sheet2!B"&B1)&"・"& indirect("Sheet2!C"&C1)&"・"&indirect("Sheet2!D"&D1) (Sheet2は、項目一覧のあるシート名) のようにしてやると、ほんの数分で漏れのない組み合わせの出来上が り。どこかに「形式を選択してペースト」→「値」して使いましょう。
- katayama19
- ベストアンサー率58% (10/17)
↓なるほどですね。 VBA&マクロに詳しい方が後できっとご教授くださるでしょう。 私は、VBA&マクロを使わずに済むような仕事しかしていませんので、VBA&マクロはわかりません。 今はおっしゃるように、相対・絶対の組合せしか思いつきません。1行目だけ、入力すれば済む作業だとは思うので、いいマクロを教えて下さる方がいらっしゃるまでとりあえず・・・ ご承知のこととは存じますが、式を入力している際、A1、B1等でカーソルを点滅させ、F4キーを押せば、絶対と相対が入れ替わるので、とりあえずそれで作業を・・・。
お礼
ありがとうございます(涙) とりあえず地道~に、娘の邪魔をかわしながらやっていきます。 きっと、なにか方法、あるんでしょうね~・・・
- katayama19
- ベストアンサー率58% (10/17)
1.A1 = おひつじ座、B1 = 東京都、C1 = 10代、D1 = 男性 だとする。 2.組み合わせたいセルに、 =A1&"・"&B1&"・"&C1&"・"&D1 と入力すれば、終わりです。A1・B1等は、目的のセルをクリックすれば、自動で入力されます。 後は、入力したセルを下にドラッグすれば、全データ出来上がり。 一番手っ取り早いのでは?
お礼
早々のご回答、ありがとうございます! 早速試してみたのですが、うまくいきませんでした・・・ A列に星座、B列に都道府県、のように並んで、たてにずらずらと項目毎データがならんでいて、教えていただいた数式で試したところ、2行目は「=A2&"・"&B2&"・"&C2&"・"&D2」となってしまいました。 求めている、「A1&B2&C1&D1」「A1&B2&C1&D1」とどんどん変化していくようにするには、絶対と相対を組み合わせて、やっぱり一つずつ数式を入力するしかないのでしょうか・・・ 説明が不足していて、すみません。 でもすぐにご回答いただけて、涙が出るほどうれしいです。
お礼
ご回答ありがとうございます。お礼が遅くなってごめんなさい。 早速試してみたところ、望んでいたとおりにリストが出来上がりました。ありがとうございました!!! 取り急ぎでマクロって・・・いいなぁすごいなぁ・・・これから少しずつ勉強しようっと。