- ベストアンサー
二つのデータの関係表に名前をいれたい
「Excelで二つのデータの関係表を作成したい(http://okwave.jp/qa/q8103995.html)」で質問した者ですが、表に人数ではなくA列(個人名)のA、B、C…を入れたいのですが、どうしたら良いでしょうか、ご教示のほど宜しくお願いいたします。 データの範囲は(1)は5刻み、(2)は50刻みですが、変更する場合もあります。 表が間違っていたら申し訳ありません。Excel2007です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.2です! たびたびごめんなさい。 アップされている画像を拝見すると、セル内に複数表示の場合は改行されているのですね? 前回のコード内の >wS2.Cells(k, j) = wS2.Cells(k, j) & "," & wS1.Cells(i, "A") の行を wS2.Cells(k, j) = wS2.Cells(k, j) & vbCrLf & str に変更してください。 確認せずに失礼しました。m(_ _)m
その他の回答 (2)
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 前回の回答をみると単に個数の表示だけですので 関数で対応できたと思います。 今回の質問内容では状況によっては同じセルに複数名を表示しなくてはならない状況もあるかと思います。 そうなると関数では難しいように思われます。 そこでVBAになってしまいますが、一例です。 今回もSheet1のデータをSheet2に表示するようにしてみましたが、 Sheet2のレイアウトを↓の画像のように変更してみてください。 ※←必須です※ (小さくて見にくいかもしれませんが、拡大してください) 行項目に関しては2行目・列項目に関してはA列は不要ですが、判りやすくするために 敢えて画像のような表にしています。 尚、黄色のB3セルは「これ以上の数値はない!」という値を入力しておきます。 以上の下準備ができた上で Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub Sample1() 'この行から Dim i As Long, j As Long, k As Long, endRow As Long, endCol As Long Dim str As String, wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") endRow = wS2.Cells(Rows.Count, "A").End(xlUp).Row endCol = wS2.Cells(1, Columns.Count).End(xlToLeft).Column Range(wS2.Cells(3, 3), wS2.Cells(endRow, endCol)).ClearContents On Error Resume Next '←おまじない For i = 2 To wS1.Cells(Rows.Count, "A").End(xlUp).Row k = WorksheetFunction.Match(wS1.Cells(i, "B"), wS2.Range("B:B"), -1) j = WorksheetFunction.Match(wS1.Cells(i, "C"), wS2.Rows(1), True) str = wS1.Cells(i, "A") If wS2.Cells(k, j) = "" Then wS2.Cells(k, j) = str Else wS2.Cells(k, j) = wS2.Cells(k, j) & "," & wS1.Cells(i, "A") End If Next i End Sub 'この行まで ※ 同一セル内に複数名表示が必要な場合はカンマで区切ってみました。m(_ _)m
- MackyNo1
- ベストアンサー率53% (1521/2850)
計算負荷の高い配列数式を複数組合わせる必要があるので、例示のレイアウトならG2セルだけに数式を以下の式を入力してCtrl+Shift+Enterで確定しておき、全体を表示したいときだけオートフィルコピーする(あるいは計算方法を手動にしておいて再計算が必要な時だけF9キーで再計算する)などの対応が必要かもしれません。 =INDEX($A:$A,SMALL(IF((CEILING($B$2:$B$100,5)=$E2)*(FLOOR($C$2:$C$100,50)+1=F$1),ROW($A$2:$A$100),1000),1))&INDEX($A:$A,SMALL(IF((CEILING($B$2:$B$100,5)=$E2)*(FLOOR($C$2:$C$100,50)+1=F$1),ROW($A$2:$A$100),1000),2)) なお、上記の数式は同じセルに2つまでの結果を横並びで表示させる式になっています。 最大重複数が3つなら、SMALL関数の第二引数を「3」にした数式をもうひとつつなげてください。
お礼
大変返事が遅くなっても申し訳ありません。参考にしてみたいと思います。有り難うございました。