• ベストアンサー

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あります

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

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。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)
回答No.4

こういうのはどうでしょうか? [概要] 集計をして、合計行のみを他のシートなどにコピーする。 [手順] 1.〇のままでは集計がとれないので、〇を数字の1に置き換えます。   範囲を指定し、編集-置換 2.集計をとります。   表の中にカーソルを置き、データ - 集計   「集計するフィールド」は、〇のある列全てにチェックをいれます。 3.小計以外の明細を閉じます。   行番号の左側の1番上(列名の位置)に、レベル番号がありますから、   人ごとの計だけがでるように、明細を閉じてください。 4.表示されている部分だけをコピーします。   範囲を指定し、編集 - ジャンプ - セル選択 として、   「可視セル」を選びOKをクリック。    ツールバーのコピーをクリック。 5.必要な場所で貼り付け。 6.数字を〇に置き換える お試しを。

g00g00
質問者

お礼

有難うございました。 他3名の方々からも親切に教えていただいたのですが わたくしのような初心者にはうまくいきませんでした。 ngsvxさんからのアドバイスどおりやったらうまくでき ました。これからもよろしくお願いいたします。

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

初めに、これは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)
回答No.1

オリジナルのシートでA列のみ選択して 「データ」「フィルタ」「フィルタオプションの設定」で 「重複する値を無視する」にしてOK 表示されたA列を別シートに「形式を選択して貼り付け」「値」でコピーする。 別シートで B1=IF(SUMPRODUCT((Sheet1!$A$1:$A$4000=$A1)*(Sheet1!B$1:B$4000="○")),"○","") この式を全体にコピーする。 できたシートをコピーして別シートにもう一度値として貼り付けて結果を固定する。 不要なシートは削除する。

関連するQ&A