• 締切済み

EXCELで2列のセルを結合して検索し合計値を表示させたい

EXCELで下記のようなファイルがあります。 【シート1】 A B 45 10 25 27 * 74 48 47 14 95 28 * 21 21 【シート2】 A B 57 20 47 54 * 13 321 71 61 【シート3】 A B Total 25 27 4873  ---シート1 47 54 4740  ---シート2 95 28 541   ---シート1 【シート3】のA列&B列は必ず 【シート1】のA列&B列か 【シート2】のA列&B列にあります。 ※重複はありません。 【シート3】のA列&B列をキーにして 【シート1】のA列&B列と 【シート2】のA列&B列を検索し、 【シート1】の合計をセルF2に 【シート2】の合計をセルG2に 表示させたいのですが。 結果表示: 【シート3】 A B Total 25 27 4873  5414  4740 47 54 4740 95 28 541 説明がわかりづらくてすみません。補足していきますので説明不足なところがありましたらご指摘ください。 セルを結合したりVLOOKUPを使ったりしたのですが、 式を入力する列が増えてしまいました。 もう少しすっきりできないものでしょうか? それとマクロでもできる方法がありましたら 是非教えてください。都合その方が助かります。 よろしくお願いします。

みんなの回答

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.4

#3ですが、ちょっと追加です。 データの中に文字列が入っていても、エラーにならないようにしました。 見出し行が何行あってもいいように、データの先頭行を指定するように しました。 コードの5行目で指定してください。 比較区分するデータが数値だけの場合は、こちらをお使いください。 もし、比較区分するデータが文字列も有効にするのであれば、前のコードを 使って、下記行の "A1" の部分を見出しを除いたデータの先頭行(例えば "A2") に変更してください。 For Each Rng In Range("A1", Range("A65536").End(xlUp)) Sub 区分集計() Const sh1 = "シート1" ' <---- シート名を指定 Const sh2 = "シート2" ' <----   〃 Const sh3 = "シート3" ' <---- 区分合計を記入するシート名 Const TopRow = 2 ' <--------- データの先頭行(見出しを除く) Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim Ws3 As Worksheet Dim Rng As Range Dim R As Range Dim N As Integer Dim First As String Dim Val1 As Double, Val2 As Double For N = 1 To Worksheets.Count   If Worksheets(N).Name = sh1 Then     Set Ws1 = Worksheets(N)   ElseIf Worksheets(N).Name = sh2 Then     Set Ws2 = Worksheets(N)   ElseIf Worksheets(N).Name = sh3 Then     Set Ws3 = Worksheets(N)   End If Next N If Ws1 Is Nothing Or Ws2 Is Nothing Or Ws3 Is Nothing Then   MsgBox "指定したシートが存在しません。"   Exit Sub End If Ws3.Select For Each Rng In Range("A" & TopRow, Range("A65536").End(xlUp))   If IsNumeric(Rng) And IsNumeric(Rng.Offset(, 1)) Then     Set R = Ws1.Range("A:A").Find(Rng.Value, lookat:=xlWhole)     If Not R Is Nothing Then       First = R.Address       Do         If Rng.Offset(, 1).Value = R.Offset(, 1).Value Then           Val1 = Val1 + Rng.Offset(, 2).Value           Exit Do         End If         Set R = Ws1.Range("A:A").FindNext(R)       Loop Until R Is Nothing Or R.Address = First     End If     Set R = Ws2.Range("A:A").Find(Rng.Value, lookat:=xlWhole)     If Not R Is Nothing Then       First = R.Address       Do         If Rng.Offset(, 1).Value = R.Offset(, 1).Value Then           Val2 = Val2 + Rng.Offset(, 2).Value           Exit Do         End If         Set R = Ws2.Range("A:A").FindNext(R)       Loop Until R Is Nothing Or R.Address = First     End If   End If Next Rng Range("F2").Value = Val1 Range("G2").Value = Val2 Set Ws1 = Nothing: Set Ws2 = Nothing Set Ws3 = Nothing: Set R = Nothing Beep: Beep: Beep MsgBox "区分集計完了!!" End Sub

nywork
質問者

お礼

ありがとうございました。 文字列版,数値版ともに試してみましたが希望どおりの結果が得られました。 わかりづらい説明にも関わらず、回答して頂きありがとうございました。 本当に助かりました。

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.3

次のマクロを実行するとご希望どおりの合計値が所定のセルに表示されます。 一応、詳しい手順を書いておきますが、ご存知でしたら、読み飛ばしてください。 [操作手順] 1.Alt + F11 で VBE(Visual Basic Editor)を開きます。 2.VBE のメニューから[挿入] -->[標準モジュール] を指定します。 3.モジュールウィンドウに下記コードをコピーして貼り付けます。   必要により1~3行目のシート名を変更します。 4.Alt + Q (または、右上隅の×)でウィンドウを閉じ、シートに戻ります。 5.メニューから[ツール]-->[マクロ]-->[セキュリティ]で「セキュリティレベル」を  「中」にして[OK]します。 6.実行するときは、Alt + F8 (メニューから[ツール]-->[マクロ]-->[マクロ])で  「区分集計」を指定し、[実行]ボタンを押します。 Sub 区分集計() Const sh1 = "シート1" ' <---- シート名を指定(全/半角 注意!!) Const sh2 = "シート2" ' <----   〃 Const sh3 = "シート3" ' <---- 区分合計を記入するシート名 Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim Ws3 As Worksheet Dim Rng As Range Dim R As Range Dim N As Integer Dim First As String Dim Val1 As Double, Val2 As Double For N = 1 To Worksheets.Count   If Worksheets(N).Name = sh1 Then     Set Ws1 = Worksheets(N)   ElseIf Worksheets(N).Name = sh2 Then     Set Ws2 = Worksheets(N)   ElseIf Worksheets(N).Name = sh3 Then     Set Ws3 = Worksheets(N)   End If Next N If Ws1 Is Nothing Or Ws2 Is Nothing Or Ws3 Is Nothing Then   MsgBox "指定したシートが存在しません。"   Exit Sub End If Ws3.Select For Each Rng In Range("A1", Range("A65536").End(xlUp))   Set R = Ws1.Range("A:A").Find(Rng.Value, lookat:=xlWhole)   If Not R Is Nothing Then     First = R.Address     Do       If Rng.Offset(, 1).Value = R.Offset(, 1).Value Then         Val1 = Val1 + Rng.Offset(, 2).Value         Exit Do       End If       Set R = Ws1.Range("A:A").FindNext(R)     Loop Until R Is Nothing Or R.Address = First   End If   Set R = Ws2.Range("A:A").Find(Rng.Value, lookat:=xlWhole)   If Not R Is Nothing Then     First = R.Address     Do       If Rng.Offset(, 1).Value = R.Offset(, 1).Value Then         Val2 = Val2 + Rng.Offset(, 2).Value         Exit Do       End If       Set R = Ws2.Range("A:A").FindNext(R)     Loop Until R Is Nothing Or R.Address = First   End If Next Rng Range("F2").Value = Val1 Range("G2").Value = Val2 Set Ws1 = Nothing: Set Ws2 = Nothing: Set Ws3 = Nothing End Sub

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

?A列B列は数字が入っているのですか。 ?A列、B列の数字の最高桁数は3桁と考えて良いでしょうか。 ?シート1とシート2のC列には「Total」と称する 数字が予め入っているのでしょうね。(#1のご質問とも関連) ---- A列、B列のデータを=A1&B1なんてやってませんか。桁数をそろえて=TEXT(A1,"000")&TEXT(B1,"000")のようにC1等に作ります。シート1、シート2とも。 さらにシート3にも同様の文字列をC列等に作ります。 Sheet1 (A) (B)  (C)  (D) 1 2 001002 34 001002は34より左列に来ること。 Sheet3で (A) (B)  (C) 1 2 001002 でD1に=VLOOKUP(C1,Sheet1!$C$1:$D$10,2,FALSE) を入れて34を取ってきました。 Sheet1に見つからない時のことも考え、F1列にも Sheet2を対象としたVLOOKUP関数を入れる。 見つからない時のために本当は、D、F列の関数式ともISERROR等の手当てをする。

  • comv
  • ベストアンサー率52% (322/612)
回答No.1

こんばんは 複数条件で検索するのはわかるのですが >【シート1】の合計をセルF2に >【シート2】の合計をセルG2に 合計とは? どの部分を合計するのでしょうか?

nywork
質問者

補足

>>合計とは? どの部分を合計するのでしょうか? 合計はシート3の「Total」のことです。

関連するQ&A