• 締切済み

Excel 複数あるシートのデータを1枚にまとめる

matsu_junの回答

  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.4

buri16さん、こんばんは 前回同様の処理を行ってください。 Sub TabMake()  Dim NewSH, TgtSH As Worksheet  Dim RowEP, ColEP, RowWP, ColWP, RowRP As Long  Dim RPhase As Integer '1:System 2:Ver 3:Name,ID  Dim RName(4) As String  Dim RParam(4, 2) As Integer  Dim TempF As Boolean  Set NewSH = Sheets.Add(Before:=Sheets(1))  NewSH.Cells(2, 1).Value = "名前"  NewSH.Cells(2, 2).Value = "ID"  RowEP = 3  ColEP = 3  For Each TgtSH In Worksheets   If TgtSH.Name = NewSH.Name Then GoTo NO_OP   RowRP = 1   RPhase = 1   Do While (TgtSH.Cells(RowRP, 2) <> "")    RName(RPhase) = TgtSH.Cells(RowRP, 2)    RParam(RPhase, 1) = TgtSH.Cells(RowRP, 3)    RParam(RPhase, 2) = RParam(RPhase, 2) + TgtSH.Cells(RowRP, 3)    If RPhase < 4 Then     For i# = RPhase + 1 To 4      RParam(i, 2) = 0     Next i     If RParam(RPhase, 1) <> 0 Then RPhase = RPhase + 1    Else     With NewSH      TempF = False      Set c = Range(.Cells(3, 1), .Cells(RowEP, 1)).Find(RName(3))      If Not c Is Nothing Then       If .Cells(c.Row, 2) = RName(4) Then        TempF = True       Else        i = c.Row        Set c = Range(.Cells(3, 1), .Cells(RowEP, 1)).FindNext        Do Until (i = c.Row)         If .Cells(c.Row, 2) = RName(4) Then          TempF = True          Exit Do         End If         Set c = Range(.Cells(3, 1), .Cells(RowEP, 1)).FindNext        Loop       End If      End If      If TempF = True Then       RowWP = c.Row      Else       RowWP = RowEP       .Cells(RowWP, 1) = RName(3)       .Cells(RowWP, 2) = RName(4)       RowEP = RowEP + 1      End If      Set c = Range(.Cells(1, 3), .Cells(1, ColEP)).Find(RName(1))      If c Is Nothing Then       .Cells(1, ColEP) = RName(1)       .Cells(2, ColEP) = RName(2)       ColWP = ColEP       ColEP = ColEP + 1      ElseIf .Cells(2, c.Column) = RName(2) Then       ColWP = c.Column      Else       i = 1       Do While (1)        ColWP = c.Column + i        If .Cells(1, ColWP) = "" And .Cells(2, ColWP) = RName(2) Then         Exit Do        ElseIf .Cells(2, ColWP) = "" Then         .Cells(2, ColWP) = RName(2)         ColEP = ColEP + 1         Exit Do        ElseIf .Cells(1, ColWP) <> RName(1) Then         .Columns(ColWP).Insert         .Cells(2, ColWP) = RName(2)         ColEP = ColEP + 1         Exit Do        End If        i = i + 1       Loop      End If      .Cells(RowWP, ColWP) = .Cells(RowWP, ColWP) + RParam(4, 1)     End With     RPhase = IIf(RParam(4, 2) = RParam(3, 1), _      IIf(RParam(3, 2) = RParam(2, 1), _      IIf(RParam(2, 2) = RParam(1, 1), 1, 2), 3), 4)    End If    RowRP = RowRP + 1   Loop NO_OP:  Next TgtSH  MsgBox "終了しました" End Sub これで上手くいくかどうか、試してください。データの並べ替えや表の整形はご自身でお願いします。 乗りかかった船ですので、仕様上これ以上不可能と判断されるまでお手伝いするつもりです。ただし、回答の文字数に制限があるため、機能の大幅な追加は受けかねます。 さて、buri16様は新入社員とのこと、お仕事御疲れ様です。 今回の質問でburi16様が社会人として真に学ぶべきは、仕事のお願いのし方です。私の目から見た、今回の大きなミスは下の3点です。 1) 現在に至るまでの経緯の提示が無い(前回の質問のリンクを貼っていない) 今回の質問文中に「何度かこちらで・・・」と記載がありますが、その質問のアドレスを記載しておくことで、それまでの経緯を他の回答者が参照することができたはずです。(私は検索して http://okwave.jp/qa/q7071258.html を見つけ、参照しました) 2) 仕様の提示が曖昧すぎる。 プログラムの経験が無くても、システム名、バージョン名、名前、IDが同じ列に記載されているのなら、どの行が何に相当するのか見分ける基準が無くては処理ができないのは分かるはずです。今回は、「C列に数字が・・・」という表現と添付した画像から推測し、こちら側で基準を見つけましたが、事前に提示があれば良かったです。また、「システム名」と「機材名」と文中に2つの用語が存在し、混乱の原因となっています。 更に、通常「ID」というのは、個体識別(Identification)のことですので、通常個人に対して一つしか付かない物です。そこに関する記述が全く無く、画像からも、IDを複数持つことが想定できないため、私の工数が倍になったのは間違いの無いことです。(ちなみに今回IDが複数ということで、上記プログラムは「同姓同名」の人の判別ができなくなりました。) 3) 後出しの条件が多すぎる上、適切な補足ができていない 今回色々な回答者の方の「○○ですか?」という投げかけは、解決の方法を探るものでした。それに対しbure16様の返信は、「そうとは限りません」の連続でした。すなわち「それは解決の方法にはなりません」と回答したに留まっていたのです。特に惜しかったのが、インデント調整に言及したところです。ここで、それぞれのインデント量まで正確に返答できていればもっと要領の良い解決策があったかもしれません。 丁寧な口調を用いれば気持ちよく仕事を引き受けてもらえるのは学生のうちまでです。これから先、社内・社外関わらず仕事をお願いすることが出てくるはずですが、その時今回と同じようなスタンスで臨めば、必ず貴方にも会社にも損害を与えます(場合によっては二度と貴方の依頼を受けてくれなくなるかもしれません)。 今回回答の文字数制限のため、柔らかい・婉曲な表現を利用できず、厳しい表現となっております。マクロも文字数制限のため、後から見返して非常に分かりにくく、エラー処理さえ省ききっており、非常に不本意なものとなっています。上のマクロがうまく動作すれば回答もこれで最後になりますので、最後に一言。今回の質問を糧に、社会人として成長なさること、期待しております。

関連するQ&A

  • Excel 複数あるシートのデータを1枚にまとめる

    複数あるシートのデータを1枚にまとめたいです。 シートの作りが私にとっては複雑で・・・一人でできそうにもありません。 構成は下記のようになっています。 列Aに機材名・その機材のバージョン・名前・その人の個人IDが書かれています。 ○○システム バージョン2.0 山田 ABCDE 佐藤 ACEDF バージョン2.1 永田 DEFCD ・ ・ ・ ▲▲システム バージョン1.0 渋谷 UUIOP バージョン2.0 ・ ・ ・ という感じです。 こんなデータが50数枚のシートにそれぞれあります。 どのように1枚にまとめたいかといいますと、 1行目に名前・ID・機材名とバージョンずらずらずら 2行目から個人名・その人のID・1行目に書いている機材を使用しているか(使用していたら○をつけたい) という感じです。 Excel初心者で、キャパ越えで困っています。 縦列につらつらつら~っと書かれているせいで、どうこれを行に移して名前とIDと機材名を関連つけるか悩んでいます。 どうか力を貸してください・・・ 宜しくお願いいたします。

  • エクセル 複数シートのデータをまとめたい

    他の質問を参照したのですが、できないのでお願いします。 新しいシート(ブックでもいいです)に次のデータを ひとまとめにしたい。 外国語テストのデータです。 (1)ひとつのブックにシートが十枚ある (2)列a2~h2 行2~29までデータがある。 (3)列a番号(a2が1、a29が28)  列b空欄  列c日本語  列d外国語 この構造を倍にしているのでa~hにデータが並んでいる。 これを、 つまり、8×28のデータが各シートにあるわけですが 【ひとつ】 できればシート1のデータの下 29行目からシート2のデータ、58行目からシート3… というように並べたい。 【ふたつ】 更にできるならa~dの下にe~hを持ってきて 4×56の並びにして 57行目からシート2のデータ…というように並べたい。 データの並びは列a列eの番号順を保持できたらうれしいです。 どうぞよろしくお願い致します。

  • Excel複数シートにあるデータを1枚にまとめる

    Excelブックにある50枚ほどのシートのデータを一枚のシートにまとめたいです。 現在シート1には機材Aを使用している人の名前、シート2には機材Bを使用している人の名前、シート3には機材Cを・・・ というような感じで50枚ほどあります。 これを一枚にまとめます。 列Aに名前、列Bからを機材名としたいんです。 たとえば山田さんが機材Aと機材Cを使用していたとしたら、「山田 ○  ○」という感じで、機材A、Cの列に○が付くようにしたいです。 各シートに記載されている名前は、重複しています。(佐藤さんはシート1にも2にも40にも名前があるというようなかんじです) 列の中に何回も同じ名前が出ることを避けたいです。 出来る限り短時間で終わらせたいのですが、なんせExcelの知識が乏しく困っています。 なるべく早くするよう言われていますので、初心者でも出来るような方法をご存じでしたら教えてください。 ちなみにしようするのはExcel2010です。 大雑把な質問で申し訳ございません、よろしくお願いいたします。

  • エクセルVBA データを別シートに書き込む

    エクセルの、あるシートのデータを、別シートの項目条件の一致するセルに 書き出す方法を教えていただけますでしょうか?  元のシートには  A列     B列    C列 ID番号 年月日番号  金額 ID番号 年月日番号  金額 ID番号 年月日番号  金額  ・      ・       ・  ・      ・       ・ という形で、データが入っています。各列でデータには重複はありますが、   A列とB列の内容が共に同じという行は、ありません。 これを列項目がID番号、行項目が年月日番号の、金額を参照する表にしたいのです。 新しいシートのA列に降順に全ID番号を、1行目に同じく全ての年月日番号をいれ、 元のシートのC列データ(金額)を新しいシートの該当セルに書き込むには どのようにすればいいでしょうか?このような感じで‥。    月日1 月日2 月日3‥‥ ID1 金額  金額  金額 ID2 金額  金額  金額 ID3 金額  金額  金額  ・  ・  ・ 実は元のシートは10枚ほどあり(期間で区切っています)、おまけに各シートには 登場しないID番号もあります。 そこで、すべてのID番号と年月日番号をまとめ、ひとつのシートにしたいと考えた次第です。 1枚のシートならばピボットテーブルで何とかなるのですが、それをまとめようとすると、 データの量が膨大で、PCがとまってしまう(のか計算が終わらない気が‥) VBAを使えば何とかなるのかもと思いまして、質問いたしました。 エクセルは2007です。 どうぞよろしくお願いいたします。

  • VBAを使わずに複数シートの列データを縦に並べたい

    フォーマットの異なる表が4種類あり、集計用シートと合わせて5シートを1つのブックにまとめています。各表はカテゴリーが異なるWebサイトのURLリストの列を持っていて、そのURLを集計用シートにまとめたい(縦に並べたい)のですが、Web検索で調べながらOFFSET、ROW、MATCH関数などで挑戦するも、関数の整理がつかず、セル位置の指定と入れ子の式が複雑でうまくいきません。 シート1のURL列の2行目(タイトル行があるので)から最終行までを参照した後、シート2の頭から順番に最終行まで参照し、それをシート4まで繰り返し行うというものです。 VBAは使わずに関数だけで完結させたいです。 どうかご教示ください。 よろしくお願いいたします。 ◆環境:Excel 2016/Windows10 ◆ブックの構成(添付画像ご参照)  ・シート1:参照元シート(1)  ・シート2:参照元シート(2)  ・シート3:参照元シート(3)  ・シート4:参照元シート(4)  ・シート5:参照先集計シート  ※シート1~4はフォーマット及び行数がバラバラの表。  ※各表にはWebサイトのURL一覧の列がそれぞれ含まれている。  ※各表のURL列の1行目のタイトルは「URL」で共通。(列番号はバラバラ) ◆やりたいこと  ・シート1~4のURLの列をまるごとシート5に縦に並べてまとめて参照したい。  ・マクロではなく関数で完結させたい。  ・シート1~4をそれぞれ更新(新データをペースト)すれば、シート5も最新に更新される運用としたい。

  • excel 別シートから複数項目を取得

    こんばんは。エクセルについて質問があります。 今、エクセルで同じ構造で中身の違うデータベースの様なシートを数枚作り、 そこから参照して、別の入力シートにそのデータを引っ張って来るということをしたいです。 調べてみた感じVLOOKUP関数などを使うのかなと思うのですが、 どうもうまいこといきません。 DBのような扱いをしているデータシートの構造は 【データシート】 A1(クラス名)列| B1(番号) 列 | C1(名前:漢字) 列 | D1(名前:かな) 列 | ------------------------------------------------------------------- A2   1-1 |  B2 1番 | C2 鈴木 太郎   | D2 すずき たろう   | のようなデータの入れ方をしており、クラスは1-7まである感じで、 B1の列はA1列のクラスの人数分が連番になっています。 なので、番号は重複してる部分が多いです。 これが複数枚シートあるといった具合です。 データを反映させたいシートも前4列は同じ様な構造をしています。 これにあと複数列足した感じになってます。 【反映させたいシート】 A1(クラス名)列| B1(番号) 列 | C1(名前:漢字) 列 | D1(名前:かな) 列 | E1 別項目 |… -------------------------------------------------------------------------------- A2  3-7  |  B2 2 | C2 田中 次郎   | D2 たなか じろう   | ×× |… ここで名前列に名前(漢字、もしくはかな)を入れるか、 もしくはクラス名+番号ですぐさま該当シートの特定し、 合致するE列以前の残りのデータを全て取得してくる。 反映させたシートのE列などに入れたデータを 今度はデータシートへとリンクさせるという風な プログラムを組みたいです。 こういった具合のエクセルシートを作成したいのですが、 どのようにしたら良いでしょうか? プログラムの様にIF文などを使用する感じになるのでしょうか? それともデータのシートに別でIDなどユニークな値を各々の データに割り振らないとダメでしょうか? また参考として知りたいのですが、 1行に引っ張りたくないデータが多数あっても行単位で3列の分だけ取得して、 1行にある3列分のデータを同じ1行3列に反映させることは可能でしょうか? 説明が下手で意味が解り辛い所もあるかもしれませんが、 回答よろしくお願いします。

  • excelの複数シートを検索対象にして重複行を抽出する方法

    ある値が重複する行を抽出したいのですが 抽出元データが600,000行近くあり、1sheetに入らず9シート程に分けました。 countifを使おうとしたのですが検索範囲に複数シート指定が出来ず(3D-参照の対象関数ではないようです)、 =COUNTIF('sheet1:sheet9'!$C:$C,C1)としてみたのですが、重複行があっても全て#VALUE!となってしまうので機能できていないようです。 具体的には sheet1~8に下記のようなデータがあり、C列が重複する行を抽出したい。 A列:id、B列:名前、C列:メアド、D列:xx 宜しくお願い致します。

  • エクセル 複数シートのデータを1シートにまとめるマクロ

    エクセルの複数シートにデータがあります。同じ条件の人のデータだけをひとつのシートにまとめたいのですが、マクロを教えていただけますでしょうか。それとも、マクロ以外に良い方法がありますか? エクセル初心者なので、あたりまえのことも知らないかもしれません。。。  【データ】 ●シート1からシート20まで、同じ配列でデータがあります。 ●1行目は見出しです。2行目から1人づつのデータです。(多くても65行までと思っています。) ●A列に到達度、B列に出欠をいれました。 ●C列からM列が氏名、課題、その他のデータです。 ●リストはシート21にあります。  【こんな作業でしょうか?】 ●シート1から20で A列が「C」または「D」ならば その行のA列からM列をコピーして シート21のA列からM列に形式を値にして張り付ける ●シート1から20で B列が「欠」ならば その行のA列からM列をコピーしてシート21のA列からM列に形式を値にして張り付ける (っというのが私の乏しい知識で考えた方法なのですが、これでは不具合がでますか? もちろん、この方法じゃなくもっといいのがあれば、それをやってみたいです。)

  • エクセルシートについて

    添付の画像を参照願います。 シートAの表-1のデータをシートBの表-2に貼りつけたいのですが、 列と行が逆の為、一個一個のセルを選んでコピーしています。 表-2は次の行に表―1のB、となりに5という数字を、表―1のB列のデータを飛ばせたいのです。 何か簡単に出来る方法が有れば教えて頂けないでしょうか。 よろしくお願い申し上げます。

  • エクセル 複数シートのデータを別ブックにまとめる

    月毎の実績表を作ろうとしています。 構成は、7~6月の12枚シートでひとつのブック【実績表.xlsx】(上画像)。 これとは別に、各営業が入力できるブックを12か月分【7月営業.xlsx ~ 6月営業.xlsx】(下画像)。 下画像にあるデータを上画像の表にまとめたいのです。 セルの対応 上画像      下画像  B列23行以下   シート名 C列〃       A列orE列35行~49行 E列〃       B列orF列〃 H列〃       C列〃 I列〃        D列〃 K列〃       G列〃 L列〃       H列〃 これを鈴木さんデータから順にまとめれるようお願いします。 VBAをネット検索し、同ジャンルのQ&Aを複数見つけたのですが、なにぶん素人なものでよくわかりませんでした。 非常に困っていますので、どなたかお助けください。