- ベストアンサー
Excelシート内の行の統合(圧縮)について
以下のようなExcelシートデータがあります。 (1)A列には社員番号が記録されていてB列以降にはそ の社員の得意分野が、ひとつ○印ついています。 (2)一人の社員が複数の得意分野を持つ場合は複数 の行にわかれて記録されています。(1~n) それを1社員=1行に統合(圧縮)したいのですが どのようなやり方が良いでしょうか? 【オリジナルのシート】 A列 B列 C列 D列 E列 F列 G列 1 AAAAA ○ 2 AAAAA ○ 3 AAAAA ○ 4 BBBBB ○ 5 BBBBB ○ 6 CCCCC ○ 7 CCCCC ○ 8 CCCCC ○ : : 【統合(圧縮)後のシート】 A列 B列 C列 D列 E列 F列 G列 1 AAAAA ○ ○ ○ 2 BBBBB ○ ○ 3 CCCCC ○ ○ ○ : : 横の列数は約300あります。 縦の行数(圧縮前)は約4000あります
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。maruru01です。 >横の列数は約300あります。 Excelの1シートの列数は最大256列で、社員番号の列があるので、最大でも255列しか使えないはずですが。 さて、1列作業列を使用すると楽です。 仮に、オリジナルシートのZ列を作業列とします。 Z1に、 =A1&"_"&MATCH("○",1:1,0) と入力して、下の行へコピーします。 そうしたら、統合シートのA列に社員番号一覧があるとして、B1に、 =LEFT("○",COUNTIF(オリジナルシート!$Z:$Z,$A1&"_"&COLUMN())) と入力して、右へ下へとコピーします。 ちなみに、オリジナルシートから社員番号一覧を統合シートに取り出す方法は以下の通りです。 まず、オリジナルシートの1行目に行を挿入して、A1に適当な名前(「社員番号」など)を入力しておきます。 そうしたら、統合シートのA1を選択して、メニューの[データ]→[フィルタ]→[フィルタオプションの設定]で、 [抽出先]:[指定した範囲]にチェック [リスト範囲]:「オリジナルシート!$A:$A」 [検索条件範囲]:「」(何も入力しない) [抽出範囲]:「統合シート!$A$1」 [重複したレコードは無視する]にチェック で、[OK]します。 これで、オリジナルシートのA列の社員番号が重複なしで抽出出来ます。 あとは、両シートとも1行目を削除します。 これで、最初に戻って、関数を入力します。
その他の回答 (3)
- ngsvx
- ベストアンサー率49% (157/315)
こういうのはどうでしょうか? [概要] 集計をして、合計行のみを他のシートなどにコピーする。 [手順] 1.〇のままでは集計がとれないので、〇を数字の1に置き換えます。 範囲を指定し、編集-置換 2.集計をとります。 表の中にカーソルを置き、データ - 集計 「集計するフィールド」は、〇のある列全てにチェックをいれます。 3.小計以外の明細を閉じます。 行番号の左側の1番上(列名の位置)に、レベル番号がありますから、 人ごとの計だけがでるように、明細を閉じてください。 4.表示されている部分だけをコピーします。 範囲を指定し、編集 - ジャンプ - セル選択 として、 「可視セル」を選びOKをクリック。 ツールバーのコピーをクリック。 5.必要な場所で貼り付け。 6.数字を〇に置き換える お試しを。
- imogasi
- ベストアンサー率27% (4737/17069)
初めに、これはVBA向きの問題と断っておきます まあしかし、関数愛好者が多いのでやって見ました。 まず大きく分けて2段階になります。 (1)社員番号の重複なしリスト(射影と言う)をSheet2のA列に出す (2)同じ社員番号の中で、○がある列をSheet2のその行にまとめる (1)Sheet1の空きの作業列(仮にG列とする)に =IF(COUNTIF($A$2:A2,A2)=1,MAX($G$1:G1)+1,"") と入れて、下へ最下行まで複写する。 社員番号初出の行に順次1、2、3、・・・と出る。 Sheet2のA列A2に式 =INDEX(Sheet1!$A$2:$A$100,MATCH(ROW(Sheet2!A2)-1,Sheet1!$G$2:$G$100,0),0) と入れて、下方向にSheet1のG列の最大数の数字の行数まで 複写する。 これでSheet2のA列に AAAAA BBBBB CCCCC ができる。 (2)Sheet2のB2に =IF(SUM((Sheet1!$A$2:A$100=Sheet2!$A2)*(Sheet1!B$2:B$100="○"))>=1,"○","")と入れて左手指でSHIFTキーとCTRLキーを押しながら、右手でENTERキーを押す。 配列数式と言うもの。 次にB列でB2で+ハンドルを出して、最下行まで引っ張る。 次にB1:BX(xは最下行)範囲指定して最下行で+ハンドルを出し、横方向にスキル列の右端列まで引っ張る。 (例データ) A列 B列 C列 D列 E列 初出番号 AAAAA - ○ - - - 1 AAAAA ○ - - - - AAAAA ○ - - ○ BBBBB ○ - - - - 2 BBBBB - - ○ - - CCCCC - ○ - - - 3 CCCCC - - ○ ○ - CCCCC - - - - ○ (結果)Sheet2 社員番号 A B C D E AAAAA ○ ○ - - ○ BBBBB ○ - ○ - - CCCCC - ○ ○ ○ ○ -は空白を示す。 少数ではテストでOK。行数3000、列数200以上で動くか、保証の限りではない。
- mshr1962
- ベストアンサー率39% (7417/18945)
オリジナルのシートでA列のみ選択して 「データ」「フィルタ」「フィルタオプションの設定」で 「重複する値を無視する」にしてOK 表示されたA列を別シートに「形式を選択して貼り付け」「値」でコピーする。 別シートで B1=IF(SUMPRODUCT((Sheet1!$A$1:$A$4000=$A1)*(Sheet1!B$1:B$4000="○")),"○","") この式を全体にコピーする。 できたシートをコピーして別シートにもう一度値として貼り付けて結果を固定する。 不要なシートは削除する。
お礼
有難うございました。 他3名の方々からも親切に教えていただいたのですが わたくしのような初心者にはうまくいきませんでした。 ngsvxさんからのアドバイスどおりやったらうまくでき ました。これからもよろしくお願いいたします。