• 締切済み

EXCELのマクロで照合して計算する

現在シート1に以下のデータがあります。 これをシート2、シート3に次のようにしたいです。 sheet1     A     B    C   D   E  1  日付   名前  製品 作業 時間  2 2011/1/1  鈴木 りんご  1  1  3 2011/1/1  荒木 いちご  1  1  4 2011/1/1  佐藤 くり    1  1  5 2011/1/5  鈴木 りんご  2  2  6 2011/1/5  渡辺 りんご  1  1  7 2011/1/6  金子 くり    4  2  8  2011/1/7  荒木 いちご  2  2  9  2011/1/8   荒木 りんご  1  3  10 2011/1/9  小杉 めろん  1  1  11 2011/1/10 鈴木 りんご  3  1  12 2011/1/11 荒木 いちご  4  1  13 2011/1/11 佐藤 くり    4  2  14 2011/1/11 鈴木 りんご  4  1  15 2011/1/11 渡辺 りんご  2  2 sheet2     A     B    C   D   E  1  日付   名前  製品 作業 時間  2 2011/1/6  金子 くり    4  2  3 2011/1/11 荒木 いちご  4  4  4 2011/1/11 佐藤 くり    4  3  5 2011/1/11 鈴木 りんご  4  5 sheet3     A     B    C   D   E  1   日付  名前  製品 作業 時間  2 2011/1/5  渡辺 りんご  1  1  3 2011/1/8  荒木 りんご  1  3  4 2011/1/9  小杉 めろん  1  1  5 2011/1/11 渡辺 りんご   2  2 以上のようにしたいです。 条件としては、作業「4」があり「名前」と「製品」が一致しているやつはシート2にコピーして作業時間を足したいです。 このとき日付は作業「4」の日付で「名前」と「製品」が一致している時間だけ合計だしたいです。 また、シート1で作業「4」がないデータはシート3にコピーしたいです。 また、作業「4」は完了を意味しております。よって、必ず「名前」と「製品」が一致するのは1個しかありません。 他に作業「1」「2」「3」とありますがこれは多数でてきます。 例で言いますと、シート1で「鈴木」と「りんご」で作業「4」が14行目にあります。 よって、これはシート2にコピーし合計値をだします。 2、5、11、14行目にあり合計すると5時間になります。 またシート1の6行目の「渡辺」と「りんご」は作業「4」がありませんのでシート3にコピーします。 以上をマクロでやりたいのですがいまいちやり方がわかりません。 よろしくお願いします。

みんなの回答

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんばんは! すでに回答は出ていますので、参考程度で・・・ 個人的に For~Next を使うのが好きなので、一例です。 Sub test() Dim i, j As Long Dim ws1, ws2, ws3 As Worksheet Set ws1 = Worksheets("sheet1") Set ws2 = Worksheets("sheet2") Set ws3 = Worksheets("sheet3") For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row For j = 1 To 5 If ws1.Cells(i, 4) = 4 Then ws2.Cells(Rows.Count, j).End(xlUp).Offset(1) = ws1.Cells(i, j) Else ws3.Cells(Rows.Count, j).End(xlUp).Offset(1) = ws1.Cells(i, j) End If Next j Next i ws2.Columns(1).NumberFormatLocal = "yyyy/m/d" ws3.Columns(1).NumberFormatLocal = "yyyy/m/d" For i = 2 To ws2.Cells(Rows.Count, 1).End(xlUp).Row For j = ws3.Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 If ws2.Cells(i, 2) & ws2.Cells(i, 3) = ws3.Cells(j, 2) & ws3.Cells(j, 3) Then ws2.Cells(i, 5) = ws2.Cells(i, 5) + ws3.Cells(j, 5) ws3.Rows(j).Delete (xlUp) End If Next j Next i End Sub こんな感じではどうでしょうか?m(__)m

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

手抜きのマクロです。何が手抜きかはご想像にお任せします。セル幅は、予め整えておくか、終了後に手動で整えてください。 '// Sub TestMacro1()  Dim j As Long, i As Long  Dim rng As Range  Dim sh As Variant  For Each sh In Array(Worksheets("Sheet2"), Worksheets("Sheet3"))   sh.Range("A1").CurrentRegion.ClearContents   With Worksheets("Sheet1")    If i = 0 Then     .Range("J1:J2").Value = Application.Transpose(Array("作業", 4))    Else     .Range("J1:J2").Value = Application.Transpose(Array("作業", "<>4"))    End If    .Range("A1").CurrentRegion.AdvancedFilter _    action:=xlFilterCopy, _    criteriarange:=.Range("J1:J2"), _    copytorange:=sh.Range("A1"), _    Unique:=False    i = i + 1   End With  Next  With Worksheets("Sheet2")   With Worksheets("Sheet1").Range("A1").CurrentRegion    Set rng = .Offset(1).Resize(.Rows.Count - 1)   End With   j = .Cells(Rows.Count, 5).End(xlUp).Row   Application.ScreenUpdating = False   If j > 2 Then    .Cells(2, 5).Resize(j - 1).Formula = _    "=SUMPRODUCT((" & rng.Columns(2).Address(1, 1, xlR1C1, True) & "=RC[-3])*(" _    & rng.Columns(3).Address(1, 1, xlR1C1, True) & "=RC[-2])*" _    & rng.Columns(5).Address(1, 1, xlR1C1, True) & ")"    .Cells(2, 5).Resize(j - 1).Value = .Cells(2, 5).Resize(j - 1).Value   End If   Worksheets("Sheet1").Range("J1:J2").ClearContents   Application.ScreenUpdating = True  End With End Sub

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.2

一例です。 Sub test() Dim r As Long Dim Sh1 As Worksheet, Sh2 As Worksheet, Sh3 As Worksheet Dim Fnd As Range Set Sh1 = Sheets("Sheet1") Set Sh2 = Sheets("Sheet2") Set Sh3 = Sheets("Sheet3") Sh1.Rows(1).Copy Sh2.Rows(1) Sh1.Rows(1).Copy Sh3.Rows(1) Sh1.Columns("F").Insert Sh2.Columns("F").Insert Sh3.Columns("F").Insert With Sh1 For r = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row .Cells(r, "F").Value = .Cells(r, "B").Value & "+" & .Cells(r, "C").Value & "+" & .Cells(r, "D").Value Next r For r = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row Set Fnd = .Columns("F").Find(.Cells(r, "B").Value & "+" & .Cells(r, "C").Value & "+" & 4) If Fnd Is Nothing Then .Rows(r).Copy Sh3.Cells(Sh3.Rows.Count, "A").End(xlUp).Offset(1).EntireRow Else Set Fnd = Sh2.Columns("F").Find(.Cells(r, "B").Value & "+" & .Cells(r, "C").Value & "+*") If Fnd Is Nothing Then .Rows(r).Copy Sh2.Cells(Sh2.Rows.Count, "F").End(xlUp).Offset(1).EntireRow Else Fnd.Offset(, -5).Value = .Cells(r, "A").Value Fnd.Offset(, -2).Value = .Cells(r, "D").Value With Fnd.Offset(, -1) .Value = .Value + Sh1.Cells(r, "E").Value End With End If End If Next r End With Sh1.Columns("F").Delete Sh2.Columns("F").Delete Sh3.Columns("F").Delete Sh2.Range("A1").CurrentRegion.Sort Key1:=Sh2.Range("A2"), Order1:=xlAscending, Header:=xlYes End Sub

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

たとえば。 Sub macro1()  Dim w1 As Worksheet  Dim w2 As Worksheet  Dim w3 As Worksheet  Set w1 = Worksheets("Sheet1")  Set w2 = Worksheets("Sheet2")  Set w3 = Worksheets("Sheet3")  'シート2を書き出す  w2.Cells.ClearContents  w2.Range("D1") = w1.Range("D1")  w2.Range("D2") = 4  w1.Range("A1").CurrentRegion.AdvancedFilter _   action:=xlFilterCopy, _   criteriarange:=w2.Range("D1:D2"), _   copytorange:=w2.Range("A3")  ’シート3を書き出す  w3.Cells.ClearContents  w1.Range("A1").CurrentRegion.Copy Destination:=w3.Range("A1")  w3.Range("A1").CurrentRegion.AdvancedFilter _   action:=xlFilterInPlace, _   criteriarange:=w2.Range("B3:C" & w2.Range("C65536").End(xlUp).Row)  w3.Range("A1").CurrentRegion.Offset(1).Delete shift:=xlShiftUp  w3.ShowAllData  ’シート2を集計する  Application.ScreenUpdating = False  w1.Range("A:A").Insert  w1.Range("A2:A" & w1.Range("C65536").End(xlUp).Row).Formula = "=C2&D2"  w2.Range("A:A").Insert  w2.Range("A4:A" & w2.Range("C65536").End(xlUp).Row).Formula = "=C4&D4"  With w2.Range("F4:F" & w2.Range("C65536").End(xlUp).Row)   .Formula = "=SUMIF(Sheet1!A:A,A4,Sheet1!F:F)"   .Value = .Value  End With  w2.Range("A:A").Delete shift:=xlShiftToLeft  w2.Range("1:2").Delete shift:=xlShiftUp  w1.Range("A:A").Delete shift:=xlShiftToLeft  w2.Range("A:E").EntireColumn.AutoFit  w3.Range("A:E").EntireColumn.AutoFit  Application.ScreenUpdating = True End Sub ループとかしてないんで,多少高速を期待できます。

関連するQ&A

  • EXCELでデータを条件わけして抽出する方法はありますか?

    EXCELでデータを条件分けして抽出する方法はありますか? EXCELでsheet1の元データから、条件を検索して、 sheet2とsheet3に移動させたいです。 sheet 1(元データ)   A  B  C  D 2 日付 名前 作業 時間 3 8/1  鈴木 1 1.0 4 8/1  佐藤 1  1.5 5 8/1  藤原 1  2.0 6 8/2 鈴木 2 1.0 7 8/4 佐藤 2 1.0 8 8/4 鈴木 3 2.5 9 8/5 鈴木 4 1.0 10 8/5 藤原 4 4.0 sheet2 (新規データ)  A   B  C  D 2 日付 名前 作業 時間 3 8/1 鈴木 1 1.0 4 8/1 藤原 1 2.0 5 8/2 鈴木 2 1.0 6 8/4 鈴木 3 2.5 7 8/5 鈴木 4  1.0 8 8/1 藤原 4  4.0 sheet3   A  B  C  D 2 日付 名前 作業 時間 3 8/1 佐藤 1  1.5 4 8/4 佐藤 2  1.0 ・ sheet1での検索条件は、・作業4があるときは、『名前』が同じ人のデータ(作業1.2.3.4)を sheet2に移動させる(例でいくと鈴木さんは、作業1.2.3.4それぞれある) ・この時、作業1,4の人も移動させる(例でいくと藤原さんは1,4のみ) ・sheet3は、sheet2で移動しなかった人→つまり、『作業4』がない人のみ移動 ・人は必ず1度しかでてこないです。結果、『作業4』は必ず同じ人には1回のみです。 私が考えたところ、 1.『作業4』がある人を先にsheet2に移動させて、sheet2で同じ人をsheet2に抽出する 2.sheet3に『作業4』がない人を抽出する のやり方でできるとおもうのですが、やり方がわかりません。 できれば簡単なマクロがいいです。説明が不十分でわかりにくいこともあるとおもいますが、よろしくお願いします

  • EXCELのマクロで条件2つでの合計

    現在シート1に以下のようにあります。 sheet1   A    B    C   D   E 1 品名  日付  担当 個数 チェック 2 いちご 1/10  伊藤 10   ○ 3 りんご 1/15  山田  2   ○ 4 ばなな 1/10  伊藤  5   × 5 いちご 1/20  伊藤  10  △ 6 いちご 1/7   山田  5   ○ 7 ばなな 1/8   江口  5   △ 8 りんご  1/4  江口  4   ○ 9 りんご  1/18 伊藤  5   ○ 10 ばなな  1/8  伊藤  6   × 11 いちご  1/20 江口  4   ○ これを以下のようにシート2にしたいです。 sheet2   A    B    C   D   E 1 品名  日付  担当 個数 チェック 2 いちご 1/10  伊藤  20  ○ 3 りんご 1/15  山田  2   ○ 4 ばなな 1/10  伊藤  11  × 6 いちご 1/7   山田  5   ○ 7 ばなな 1/8   江口  5   △ 8 りんご  1/4  江口  4   ○ 9 りんご  1/18 伊藤  5   ○ 11 いちご  1/20 江口  4   ○ 条件は、「品名」と「担当」が同じならば個数を合計してシート2にコ記すということです。 また、「日付」と「チェック」は照合した一番上の行の「日付」と「チェック」になります。 例えば、2行目と5行目は「いちご」と「伊藤」で同じなので合計を10+10で20にします。 「日付」と「チェック」は2行目の方が上なので「1/10」と「○」になります。 以上をマクロでやりたいです。 マクロの勉強中なので色々なやり方を知りたいです。 よろしくお願いします。

  • Accessで縦と横を入れ替えたい

    りんご みかん ぶどう バナナ いちご 佐藤 2   1    1   1  1 鈴木 1      1   1 田中 1   2       1 上記のようなテーブルがあるのですが、これを下記のようにしたいです。 担当者 種別 田中 りんご 鈴木 りんご 佐藤 りんご 田中 みかん 佐藤 みかん 佐藤 ぶどう 鈴木 バナナ 佐藤 バナナ 田中 いちご 鈴木 いちご 佐藤 いちご 佐藤 りんご 田中 みかん 種別の隣に数量がきてもOKです。 ご教授お願い致します。

  • Excelで関数かマクロを教えてください

    シフト表のようなものをつくりたく、 縦に名前、横に日付、日付の下に出勤や休みという感じの見た目にしたいです。    6/1  6/2  6/3 山田 出勤 休み 出勤 鈴木 休み 出勤 休み 佐藤 出勤 出勤 欠勤 のような感じです。 元データがあり、 山田 6/1 出勤 山田 6/2 休み 山田 6/3 出勤 鈴木 6/1 休み 鈴木 6/2 出勤 鈴木 6/3 休み 佐藤 6/1 出勤 佐藤 6/2 出勤 佐藤 6/3 欠勤 のように並んでいるCSVファイルがあります。 けっこうな人数がいて、何か月分も作成するのでなにかいい方法はありませんでしょうか。

  • Excelの2つのシートのデータ-を。。。。。

    1つのシートには 鈴木さん  住所・・・・ 山田さん  住所・・・・ 田中さん  住所・・・・ というリストが3000人分ほど入っています 別のシートには 鈴木さん  りんご 鈴木さん  とまと 鈴木さん  みかん 山田さん  りんご 田中さん  いちご 田中さん  とまと 田中さん  りんご 田中さん  みかん と、言った感じで同じ人物が縦書きで複数回登場します 実際はフルネームなので別人が重なることはありません で、です。 別のシートでも1枚目のシートにでもいいのですが 鈴木さん  住所・・・   3 山田さん  住所・・・   1 田中さん  住所・・・   4 と、列に2枚目のシートでの登場回数を反映させたいのです。 なにせ3000件あまり、手作業ではなく、関数を使ってする方法はないでしょうか、、、 もう少し欲張ると             りんご とまと みかん いちご  鈴木さん 住所 3    1  1   1 山田さん 住所 1       1 田中さん 住所 4    1  1   1   1 ってな事は、できませんか。    

  • エクセルの関数(IF関数?)について教えてください

    excelの関数についてわからず、困っています。 どのような関数を入れればよいのか、ご教授お願いいたします。   sheet1に下記のような表があり、 No 項目名 日付 1 りんご 11/1 2 バナナ  3 いちご  sheet2に No 項目名 日付 7 バナナ  8 りんご  9 パイン  という表があるとします。 sheet1に日付を入力した時に(りんごの右の11/1) sheet1の項目名と一致するsheet2の項目名の右のセルに同じ日付が入るようにさせたいです。 どのような関数を入れたらよいでしょうか。   よろしくお願いいたします。  

  • Excel シート間のデータの照合

    Excelで、シート間のお客様データ(だいたい各1万件)を照合します。下記は現在の照合方法ですが、これでは時間がかかるうえ手作業が多く発生しミスにつながります。頻繁に行う作業なので、関数でも、マクロでも、とにかくもう少し簡単にできる方法がありましたら、どうぞご教授ください。よろしくお願いします!! 【目的】 シート「sheet2008」には2008年度のデータ。シート「sheet2007」には「sheet2008」と同じ形式の2007年度のデータが入っています。シート「sheet2008」に、そのお客様の2007年度の担当営業マンを表示させたいのです。 【例】 列A(電話番号): 011-231-1112 列B(名前):佐藤 一郎 列C(住所):北海道札幌市中央区北1-1-1 列D(担当営業マン):鈴木 新規の列(2007年度の担当営業マン):鈴木  ・「sheet2008」「sheet2007」はほぼ同じデータですが、一部のお客様は名前が変わっていたり、住所が変わっていたりします。  ・「sheet2007」にないお客様が「sheet2008」にあったり、その逆があったりして、各シートのデータ件数は一致しません。  ・名前が同じでも住所が違うデータ、電話番号が同じでも担当営業マンが違うデータは別者として扱います。  ・「顧客ID」のような“必ずユニークな情報”は存在しません。 【現在の照合方法】 (1)「sheet2008」の各列の前に空白列を挿入する。  (データの1行目はタイトル行…B1:電話番号/D1:名前/F:住所/H:担当営業マン)  (データの2行目以降はデータ)     列A(空白行):     列B(空白行): 011-231-1112     列C(空白行):     列D(名前):佐藤 一郎     列E(空白行):     列F(住所):北海道札幌市中央区北1-1-1     列G(空白行):     列H(担当営業マン):鈴木 (2)「sheet2007」を列Aの電話番号で昇順に並べ替える。 (3)「sheet2008」の電話番号が「sheet2007」にあるかを調べる。     A2:「=IF(B2=(VLOOKUP(Sheet2008!$B2,Sheet2007!$A:$D,1,0)),"○","▲")」 (4)(3)で調べた「sheet2008」の電話番号と同じ行にある名前/住所が「sheet2007」にあるかを調べる。     C2:「=IF(D2=(VLOOKUP(Sheet2008!$B2,Sheet2007!$A:$D,2,0)),"○","▲")」     E2:「=IF(F2=(VLOOKUP(Sheet2008!$B2,Sheet2007!$A:$D,3,0)),"○","▲")」 (5)電話番号/名前/住所がすべて一致するデータについて、「sheet2007」にある担当営業マンの値を列Gに表示させる。     G2:「=IF((AND(A2="○",C2="○",E2="○"))=TRUE,(VLOOKUP($B2,Sheet2007!$A:$D,4,0)),"▲") (6)"▲"やエラー値で表示される計算結果について、目視で確認する。 (終了)

  • エクセルの表の集計について

    エクセルの『集計』や『ピボットテーブル』を使わずに、関数でやる方法があれば教えてください。 1 名前  住所  りんご  みかん 2 山田 東京   1    3 3 鈴木 神奈川  3   8 4 佐藤 埼玉   4    10 5 山田 東京   5    5 6 佐藤 埼玉   6    5 とエクセルに表があるとします。 (7行目以降はデータが追加されるとします。) 別シートに下記のように名前ごとにりんご・みかんの数の合計を表に反映するようにしたいのです。 1 名前 住所  りんご  みかん 2 山田 東京   6   8 3 鈴木 神奈川  3  8 4 佐藤 埼玉   10  15 説明不足のところがありましたら補足いたしますので、お願いいたします。

  • エクセルについて

    こんばんは。 いつも質問ばかりでごめんなさい。 ちょっとお聞きしたいのですが下記のような表があるとします。 カードの方のみの名前と金額を別のセル(または別シート)に表示させたいのですがどのようにしたらよろしいのでしょうか? 日付 名前  現金  カード 2/5  田中  12000 2/5  佐藤  18000 2/5  鈴木       32000 2/5  木村  25000 2/5  山田       22000 ↓このようにしたいのですが。 カード決済 日付 名前  金額 2/5  鈴木  32000 2/5  山田  22000 お手数おかけしますがよろしくお願いいたします。

  • EXCEL(マクロ)2つのデータ比較について

    いつも活用させていただいているものです。 今回は、以下の内容を行いたいと思います Sheet1とSheet2のA列(NO)を比較して、Sheet2にない項目(NO、名前、年齢、性別)をSheet2の4行目に追加したいと考えております。 どのようなプログラムを組めばよろしいでしょうか。 【Sheet1】 |A  |B | C | D | --------------------------- 1|NO  |名前 |年齢 |性別| 2|001 |鈴木 |11  |男 | 3|002 |佐藤 |15  |女 | 4|003 |長島 |29  |女 | 【Sheet2】  |A  |B | C | D | --------------------------- 1|NO  |名前 |年齢 |性別| 2|001 |鈴木 |11  |男 | 3|002 |佐藤 |15  |女 |               ←追加をしたい お願いします。

専門家に質問してみよう