• ベストアンサー

複数項目が同じ値である場合いくつかの条件の下で処理方法を変えたいのですが、どうしたらよいでしょうか。

参照は1行ずつ下に移行します。6行目の列1から列11までが表1となっており、6行目の列13から列30までが表2になっています。列の項目内容は似ていますが、表2のほうが項目数は多くなっています。要は表1の行と表2の行の指定内容が一致した場合に、条件によって処理をするということがしたいのです。 列1(A)  2   3   4...    11(K)  列13(M)  14  15  16...  30(AD) 日付 時刻 コード 委託者名 ...  日付 時刻 コード 委託者名... マクロの内容としては 条件1. 列1と25M、列2と列26、列3と列15、列7と列S19が同じ値である場合    a  列8+列22=列9+列23 である場合・・・列1~列11・列13~列30を上方向に削除    b 列8+列22>列9+列33 であり、かつ列8>列9 である場合        r=列23の値         列8-r        列13~列30のみを上方向に消去     c 列8+列22>列9+列33であり、かつ列8<列9である場合        r=列23の値        列9-r        列13~列30のみを上方向に消去    d 列8+列22<列9+列33であり、かつ列22>列23である場合        r=列8の値        列22-r        列1~列11のみを上方向に消去     e 列8+列22<列9+列33であり、かつ列22<列23である場合        r=列8の値        列9-r        列1~列23のみを上方向に消去 条件2. 条件1以外は、次の行(n)へ移行する。 エラーにはならないのですが、マクロを作動させても、画面に反応がありません。基礎的な事がまだよく分かっていないので、単純なことかもしれませんが、どうしてもわかりません(涙)。 分かる方に教えていただこうと思い投稿させていただきました。よろしくお願いします。下記に、一応自分で作ったマクロを添付しています。 Sub Open_Positions2() Dim n As Long Dim i As Long Dim r As Range With Sheets("未決済") For i = 6 To .Cells(Rows.Count, 1).End(xlUp).Row For n = 6 To .Cells(Rows.Count, 13).End(xlUp).Row If .Cells(i, 1).Value = .Cells(n, 25).Value And .Cells(i, 2).Value = .Cells(n, 26).Value And .Cells(i, 3).Value = .Cells(n, 14).Value And .Cells(i, 7).Value = .Cells(n, 19).Value Then If .Cells(i, 8).Value + .Cells(n, 22).Value = .Cells(i, 9).Value + Cells(n, 23).Value Then     .Cells(i, 1).Resize(11).Delete Shift:=xlUp .Cells(n, 13).Resize(18).Delete Shift:=xlUp GoTo xyz ElseIf .Cells(i, 8).Value + .Cells(n, 22).Value > .Cells(i, 9).Value + .Cells(n, 23).Value And .Cells(i, 8).Value > .Cells(i, 9) Then Set r = .Cells(n, 23).Value .Cells(i, 8).Value -r .Cells(n, 13).Resize(18).Delete Shift:=xlUp GoTo xyz ElseIf .Cells(i, 8).Value + .Cells(n, 22).Value > .Cells(i, 9).Value + .Cells(n, 23).Value And .Cells(i, 8).Value < .Cells(i, 9) Then Set r = .Cells(n, 23).Value .Cells(i, 9).Value -r .Cells(n, 13).Resize(18).Delete Shift:=xlUp GoTo xyz ElseIf .Cells(i, 8).Value + .Cells(n, 22).Value < .Cells(i, 9).Value + Cells(n, 23).Value And .Cells(n, 22).Value > .Cells(n, 23).Value Then Set r = .Cells(i, 8).Value .Cells(n, 22).Value -r .Cells(i, 1).Resize(11).Delete Shift:=xlUp ElseIf .Cells(i, 8).Value + .Cells(n, 22).Value < .Cells(i, 9).Value + Cells(n, 23).Value And .Cells(n, 22).Value < .Cells(n, 23).Value Then Set r = .Cells(i, 8).Value .Cells(n, 23).Value -r .Cells(i, 1).Resize(11).Delete Shift:=xlUp GoTo xyz End If Else Debug.Print "Not Found" End If Next n xyz: Next i End With End Sub

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

  • ベストアンサー
回答No.3

多分岐条件式はIf~ElseIf~End If を連ねるよりも下記のように Select Case True Case 条件1 条件1に一致 Case 条件2 条件2に一致 End Select と書くと見た目がすっきりします。 また、同じ項を使った比較計算を何度も行っているので、そのようなものはまとめられます。 A=B, A>B, A<B これらは、Math.Sgnを使えばそれぞれ 0, 1, -1 という3つの数値に置き換えることが出来ます。 For~Nextからの脱出もGotoを使わずにExit Forで解決できます。(Gotoはコーディングミスを招きやすいので極力使わないほうが良いです) ミスっぽいところ Dim r As Range としているのに Set r = .Cells(#, #).Value となっているのはまずいです。 #2さんの指摘があった、条件とコードの違いもありますし、コードを整頓してもういちど見直す必要があると思います。 以上を踏まえ、気づいたところを修正しコメントを付加したコードです。合ってるかどうかは分かりません。 投稿するとインデントがつぶれてしまうので、てきとーに段下げしてください。 Sub Open_Positions2() Dim n As Long Dim i As Long Dim R As Range Dim s As Integer With Sheets("未決済") For i = 6 To .Cells(Rows.Count, 1).End(xlUp).Row For n = 6 To .Cells(Rows.Count, 13).End(xlUp).Row ' 条件1. 列1と25M、列2と列26、列3と列15、列7と列19が同じ値である場合 If .Cells(i, 1).Value = .Cells(n, 25).Value And _ .Cells(i, 2).Value = .Cells(n, 26).Value And _ .Cells(i, 3).Value = .Cells(n, 15).Value And _ .Cells(i, 7).Value = .Cells(n, 19).Value Then ' 列8+列22 と 列9+列23 を比較 ' sの値 ' 列8+列22 = 列9+列23 のときは 0 ' 列8+列22 > 列9+列23 のときは 1 ' 列8+列22 < 列9+列23 のときは -1 s = Math.Sgn((.Cells(i, 8).Value + .Cells(n, 22).Value) - (.Cells(i, 9).Value + Cells(n, 23).Value)) Select Case True ' a. 列8+列22=列9+列23(s=0) Case s = 0 ' 列1~列11・列13~列30を上方向に削除 .Cells(i, 1).Resize(11).Delete Shift:=xlUp .Cells(n, 13).Resize(18).Delete Shift:=xlUp ' b. 列8+列22>列9+列33(s=1) And 列8>列9 Case (s = 1) And (.Cells(i, 8).Value > .Cells(i, 9).Value) ' r=列23の値, 列8 -r, 列13~列30のみを上方向に消去 Set R = .Cells(n, 23) .Cells(i, 8).Value -R.Value .Cells(n, 13).Resize(18).Delete Shift:=xlUp ' c. 列8+列22>列9+列33(s=1) And 列8<列9 Case (s = 1) And (.Cells(i, 8).Value < .Cells(i, 9).Value) ' r=列23の値, 列9 -r, 列13~列30のみを上方向に消去 Set R = .Cells(n, 23) .Cells(i, 9).Value -R.Value .Cells(n, 13).Resize(18).Delete Shift:=xlUp ' d. 列8+列22<列9+列33(s=-1) And 列22>列23 Case (s = -1) And (.Cells(n, 22).Value > .Cells(n, 23).Value) ' r=列8の値, 列22 -r, 列1~列11のみを上方向に消去 Set R = .Cells(i, 8) .Cells(n, 22).Value -R.Value .Cells(i, 1).Resize(11).Delete Shift:=xlUp ' e. 列8+列22<列9+列33(s=-1) And 列22<列23 Case (s = -1) And (.Cells(n, 22).Value < .Cells(n, 23).Value) ' r=列8の値, 列9 -r, 列1~列23のみを上方向に消去 Set R = .Cells(i, 8) .Cells(n, 23).Value -R.Value ' 9? 23? .Cells(i, 1).Resize(11).Delete Shift:=xlUp '11? 23? End Select Exit For ' For~Next n を脱出 Else Debug.Print "Not Found" End If Next n Next i End With End Sub

milktea06
質問者

補足

本当にご丁寧ありがとうございます。 大変あつかましいとは思いますが、補足させていただきました。 条件bの部分で、 .Cells(i,8).Value-R.Value が”オブジェクトはこのプロパティーまたはメソッドをサポートしていません。”というエラーが発生してしまいます。 また Case(s=1)というのは、sが1以上でも対応するのでしょうか。それとも">"に置き換えたほうがいいのでしょうか。 またCells(i,8) Cells(i,9) Cells(i,22) Cells(i,23)のいずれかが空白である場合があります。それがマクロが動作しない理由であるのかどうか、自分で作ってみたものも、心配でした。 無知で、質問ばかり本当に申し訳ありません。 よろしければ、教えてください。

その他の回答 (5)

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

これほど複雑なことになると、文章を、図式化に近づけるとか表現方法を工夫してもらわないと、読者にわからない。 CASE文的に整理するとか(箇条書き的に整理するとか)。 またこんな長いコードをコピー貼り付けして、質問者のデバッグのために読者を動員するのは問題あると思う。 デバッグは基本的に自分でやるべきです。エラー箇所が煮詰まったら、それで原因がわからないときに投稿すべきです。 やっていることは、比較と加減算しかないようですし。 行全体削除は出来れば他のシートに書き出さないという方式の方が 思考的に安定性が在る、ForNextが使いづらくなるから。 行の1部列削除も実用上行って意味あるのかな。 テスト的にケース(条件合致類型)コードを1列設け、シート印刷して、そのプログラムによる、コード立てが正しいか、机上デバッグをしてみたら。それぐらい質問者は、工夫と努力をすべきだ。(大昔はエラーが起こると、何百ページもあるダンプシート(文字と16進表示)をにらめっこした時代もある。) 既回答者は良く善意で、付き合ってくれているなと思います。感謝しなければ。

milktea06
質問者

お礼

確かにわかりにくく申し訳なかったと思っております。初心者ですので、デバッグひとつでも、解決方法がなかなかわからなく、ついこちらに頼ってしまいました。 今回親切にご回答してくださった方々に大変感謝し、またこれからの自分勉強にも生かしていくつもりです。ご指摘ありがとうございます。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.5

まとめられるものはまとめて、不具合個所の修正してみました Sub Open_Positions2() Dim n As Long Dim i As Long With Sheets("未決済") For i = 6 To .Cells(Rows.Count, 1).End(xlUp).Row For n = 6 To .Cells(Rows.Count, 13).End(xlUp).Row If .Cells(i, 1).Value = .Cells(n, 25).Value And .Cells(i, 2).Value = .Cells(n, 26).Value _ And .Cells(i, 3).Value = .Cells(n, 15).Value And .Cells(i, 7).Value = .Cells(n, 19).Value Then Select Case .Cells(i, 8).Value + .Cells(n, 22).Value Case Is = .Cells(i, 9).Value + Cells(n, 23).Value .Cells(i, 1).Resize(11).Delete Shift:=xlUp .Cells(n, 13).Resize(18).Delete Shift:=xlUp Case Is > .Cells(i, 9).Value + .Cells(n, 23).Value If .Cells(i, 8).Value > .Cells(i, 9) Then .Cells(i, 8).Value = .Cells(i, 8).Value - .Cells(n, 23).Value ElseIf .Cells(i, 8).Value < .Cells(i, 9) Then .Cells(i, 9).Value = .Cells(i, 9).Value - .Cells(n, 23).Value End If If .Cells(i, 8).Value <> .Cells(i, 9) Then .Cells(n, 13).Resize(18).Delete Shift:=xlUp Case Is < .Cells(i, 9).Value + Cells(n, 23).Value If .Cells(n, 22).Value > .Cells(n, 23).Value Then .Cells(n, 22).Value = .Cells(n, 22).Value - .Cells(i, 8).Value ElseIf .Cells(n, 22).Value < .Cells(n, 23).Value Then .Cells(n, 23).Value = .Cells(n, 23).Value - .Cells(i, 8).Value End If If .Cells(n, 22).Value <> .Cells(n, 23).Value Then .Cells(i, 1).Resize(11).Delete Shift:=xlUp End Select Exit For Else Debug.Print "Not Found" End If Next n Next i End With End Sub サンプルで表を作成するのが面倒なので、テストしていません 参考程度に

milktea06
質問者

お礼

ありがとうございます。こういう書き方もあるのですね。とても勉強になり、またおおいに参考にもなりました。分かりにくい説明と、初心者の質問に丁寧にお付き合いいただき、本当に感謝しています。今後の勉強にも生かしていきたいおもいます。ありがとうございました。

回答No.4

> .Cells(i,8).Value -R.Value 見落としてました。Valueはプロパティなので代入式にする必要がありますね・・・。 .Cells(i,8).Value = -R.Value > Case(s=1)というのは、sが1以上でも対応するのでしょうか。それとも">"に置き換えたほうがいいのでしょうか。 値sは、Sgn関数を使って求めたものです。Sgn関数は値の符号を0, 1, -1の3つの値で返します。よって、1を超える値が入ることは有り得ません。詳しくはヘルプでSgnを調べてみてください。 > またCells(i,8) Cells(i,9) Cells(i,22) Cells(i,23)のいずれかが空白である場合 空白のセルを計算式の中で参照すると「0」として計算されます。スペースなどの空白文字が入っているとエラーになりますが、完全な空白(ブランク状態)であれば計算自体に支障はありません。

milktea06
質問者

お礼

ご丁寧に、かつ親切にご回答いただきとても感謝しております。 とても勉強になると同時に、思っていたとおりのものができました。 かなり説明もわかりにくく申し訳なかったのですが、お付き合いいただきありがとうございます。

  • goo39
  • ベストアンサー率36% (13/36)
回答No.2

全部は見てませんが・・・ > 列3と列15 > .Cells(i, 3).Value = .Cells(n, 14).Value →条件では15、関数では14になってますよ。 > 列1~列11を上方向に削除 > .Cells(i, 1).Resize(11).Delete Shift:=xlUp →.Range(.Cells(i, 1), .Cells(i, 11)).Delete Shift:=xlUp  ではないでしょうか?

milktea06
質問者

お礼

ご指摘ありがとうございます。ちゃんと確認してから投稿するべきですよね。すいませんでした。

回答No.1

めんどくさ。 一行ずつ実行して確認したらいいでしょう。 てか俺、今エクセルもってないし。くれたら見てあげる。

milktea06
質問者

お礼

わざわざありがとうございます。 残念ながらエクセルがないなら結構ですので、わざわざコメントまでしてくださらなくていいですよ。

関連するQ&A

  • Excel VBAについて

    早速ですがExcelVBAについて質問です。 年齢がN列にあるとき、M列に年代を入れたいと思います。(例:19才なら10代、30才なら30代) 以下のように作成しましたが、すべてに20と入ったり正常に動作しないときがあります。 Excelは2003で作成していますが、いずれ2007でも使いたいです。 もっと正確に実行できるコードを教えてください。 ワークシート関数での解決は望んでいません。データ数も多く他の作業もマクロで処理するのでマクロを希望しています。よろしくお願いします。 -------------------------- Sub ByAge() Range("N1").Value = "年代別" Dim i As Long, N As Integer For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 13).Value >= 60 And Cells(i, 13).Value < 70 Then Cells(i, 14).Value = 60 ElseIf Cells(i, 13).Value >= 50 And Cells(i, 13).Value < 60 Then Cells(i, 14).Value = 50 ElseIf Cells(i, 13).Value >= 50 And Cells(i, 13).Value < 60 Then Cells(i, 14).Value = 40 ElseIf Cells(i, 13).Value >= 30 And Cells(i, 13).Value < 40 Then Cells(i, 14).Value = 30 ElseIf Cells(i, 13).Value >= 20 And Cells(i, 13).Value < 30 Then Cells(i, 14).Value = 20 End If Next i MsgBox "完了!" End Sub --------------------------

  • 重複行を完全削除するエクセルのマクロ

    Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 13).Value = Cells(ii, 13).Value Then Delete Shift:=xlUp End If Next ii Next i End Sub マクロに関しては、素人でございます。 こちらのマクロを作ってみたのですがうまくいきません。 4列目と13列目の列が重複したときのみ重複した行をすべて削除させたいと思っております。どうぞお教えください。

  • 二つの条件を満たす行を削除の方法教えて下さい(><)

    エクセルは基本的な事しか分からないのですが、 どうしても仕事で必要で、土日に持ち帰ってきたのですが うまくできません。どなたか教えて下さい。 A B C D 1 3 2 1 4 2 2 2 3 2 2 1 5 4 4 1 3 4 5 2 2 1 2 ちょっと見づらいですが、上記のような表があるとして A列が2 かつ C列が2の行を削除したいです。 条件がひとつだと For R = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1 If Cells(R, "A").Value <> "" ThenIf Cells(R, "A").Value = 2 Then 'Rows(R).Delete xlShiftUp End IfEnd IfNext R で消せたのですが、二つだとうまくいきません。 どなたか教えて下さい。よろしくお願いいたします。

  • 複数のセルでの方法

    現在下記のようなマクロを組んであるのですが、これだと5列目が「0」のときの実行マクロです。 '5列目(工数)が「0」のとき該当する行の高さを「0」にする。 For i = ActiveSheet.UsedRange.Rows.Count To 1 Step -1 If Cells(i, 5).Value = "0" Then Rows(i).RowHeight = 0 End If Next 私はこれではなくて、5列目と7列目の同じ行にあるセルに「0」がはいっていたら行の高さを「0」にしたいのです。 そこで私は If Cells(i, 5).Value = "0" Then これを If Cells(i, 5).Value = "0" And Cells(i, 7).Value = "0" Then にしたところエラーが発生しました。 良い方法があればお教えください。 よろしくお願いします。

  • 重複行を完全削除するエクセルのマクロ

    Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 2).Value = Cells(ii, 2).Value _ And Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 5).Value = Cells(ii, 5).Value Then Dim iii As Byte iii = 1 Rows(ii).Delete Shift:=xlUp End If Next ii If iii = 1 Then Rows(i).Delete Shift:=xlUp iii = 0 Next i End Sub データーが下の表のように入っております。     A    B    C    E    F 1  1/26  a1234  fdsa  5000  C1 2  1/27  a4567  sdfa  4000  T2 3  1/28  a1234  dfsa  5000  C1 4  1/30  b4567  asdf  6600  A2 5  2/10  b4567  fsda  6600  A2 6  2/10  a1234  afds  5000  C1 B列、E列、F列が完全一致(重複1行目と3行目と6行目・4行目と5行目)で削除し結果的に2行目だけ残る方法がしたいのですが、このマクロですと少ないデータですとうまく動くのですが、『大量のデータを一気に削除出来ない』、『同じ重複が3つ以上のデータが多数ある場合データが削除されずに残ってしまう』エラーが出てしまいます。どうかお教えください。

  • マクロ:データの抽出(複数条件)

    エクセルで以下のようなマクロを作成しました。 シート1のG列がシート2のF4と合致する時、シート2のC列にシート1のB列を貼り付けるのですが、条件を増やし 「シート1G列がシート2のF4と一致」かつ「シート1H列がシート2のG5と一致」かつ「シート1I列がシート2のH5と一致」かつ・・・としたいのですが、If Thenをどのように記述したらよろしいでしょうか。(AND関数の機能です) 宜しくお願いいたします。 Sub data01() With Sheets("Sheet1") x = .UsedRange.Cells(.UsedRange.Count).Row For i = 5 To x If .Cells(i, "G").Value = Worksheets("Sheet2").Range("F4").Value Then n = n + 1 Sheets("Sheet2").Cells(n + 5, "C").Value = .Cells(i, "B").Value End If Next End With End Sub

  • インデックスが有効範囲に出ないと出る

    下記のようなVBAを書きました。しかしインデックスが有効範囲にないとメッセージがでるのですが、どこがまちがっているでしょうか?? Sub macro1() Dim i As Long Dim r As Long Worksheets("フェアリスト ").Select Worksheets("csv").Range("A:C").ClearContents For i = 2 To 50 Step 5 If Worksheets("フェアリスト").Cells(11, i + 1) <> "" Then r = Worksheets("フェアリスト").Cells(65536, i + 1).End(xlUp).Row Worksheets("フェアリスト").Range(Cells(11, i), Cells(r, i + 3)).Copy _ Destination:=Worksheets("csv").Range("B65536").End(xlUp).Offset(1) Worksheets("csv").Range("A65536").End(xlUp).Offset(1).Resize(r - 3, 1).Value = Worksheets("フェアリスト").Cells(8, i).Value End If Next i Worksheets("csv").Range("A1:C1").Delete shift:=xlShiftUp End Sub

  • 重複データーの集計、削除

    どなたかご教授下さい。 下記のようにD列に重複する行があればI列に集計し、行削除するマクロを作成しました。 さらに、重複する基準となる列を複数(D列,F列,G列)に増やしたいのですが、上手く出来ません。 宜しくお願い致します。 Sub test() Dim i, j For i = 19 To Cells(Rows.Count, 2).End(xlUp).row - 1 For j = Cells(Rows.Count, 2).End(xlUp).row To i + 1 Step -1 If Cells(i, 4).value = "" Then Exit Sub If Cells(i, 4).value = Cells(j, 4).value Then Cells(i, 9).value = Cells(i, 9).value + Cells(j, 9).value Rows(j).Delete End If Next Next End Sub

  • 条件付で20行目おきにComboBoxの値を入れる

    ユーザーフォームのComboBox1の値をシートのR列31行目から20行毎に入れる 但し、選んだ20行毎の6行上が空白なら値を入れない と、したいのですが、下の構文で実行すると一瞬表示されて消えてしまいます。 結果は空白になります。 これでも必死の思いでしましたので笑わないで下さいね。 宜しくご指導をお願いします。 Dim t Dim i For t = 25 To 994 Step 20 For i = 31 To 1000 Step 20 If Cells(t, 18) <> "" Then Cells(i, 18) = ComboBox1.Value ElseIf Cells(t, 18) = "" Then Cells(i, 18) = "" End If Next i Next t

  • VBA 請求データ一覧からの複数の処理

    先週 kkkkkmさんに質問をさせて頂きまして、 いろいろご指導を頂いたものです。 続編の様な形になってしまいますが、 抽出するデータの環境設定を変更致しました。 ご質問させて頂く内容は前回とほとんど変更がないのですが、 あらためて下記に記載させて頂きます。 <Worksheet1のデータ> J列~AM列までが課税金額 「J,K,L」「M,N,O」・・・「AK,AL,AM」と3列1組(コード・費目・金額) 1組の行もあれば、複数組の行もあり。 AN列~BB列までが非課税金額 課税金額と同じく3列1組 1組の行もあれば、複数組の行もあり。 「BC」=消費税、「BD」=合計金額 ※AN列の前に不規則な空白セルあり   BC列の前に不規則な空白セルあり 文章で上手く説明出来ているか自信がありませんので、 エクスポートした元データ Worksheet1と、 vbaを用いて作成した Worksheet3 をご参考に添付致します。 Worksheet1の2行目がWorksheet3の2行目に対応しています。 3行目、4行目も同様です。 不規則な空白が原因でしょうか・・・。 M列、O列は問題ないのですが、 金額が合わなかったり、N列に金額を引いてこないのです。 実行しているコードは下記になります。 Dim i As Long, j As Long, k As Long Dim Ws1 As Worksheet, Ws2 As Worksheet, Ws3 As Worksheet Dim mTotal(4) As Long Dim LastRow As Long Dim List(4) As Variant Set Ws1 = Sheets("Sheet1") Set Ws2 = Sheets("Sheet2") Set Ws3 = Sheets("請求書ひな形") List(1) = Ws2.Range(Ws2.Cells(1, "A"), Ws2.Cells(Rows.Count, "A").End(xlUp)).Value List(2) = Ws2.Range(Ws2.Cells(1, "B"), Ws2.Cells(Rows.Count, "B").End(xlUp)).Value List(3) = Ws2.Range(Ws2.Cells(1, "C"), Ws2.Cells(Rows.Count, "C").End(xlUp)).Value List(4) = Ws2.Range(Ws2.Cells(1, "D"), Ws2.Cells(Rows.Count, "D").End(xlUp)).Value LastRow = UBound(List(1)) For i = 2 To 4 If LastRow < UBound(List(i)) Then LastRow = UBound(List(i)) End If Next For i = 2 To Ws1.Cells(Rows.Count, "J").End(xlUp).Row mTotal(1) = 0 mTotal(2) = 0 mTotal(3) = 0 mTotal(4) = 0 For j = Columns("J").Column To Columns("BB").Column Step 3 For k = 2 To LastRow If UBound(List(1)) >= k Then If Ws1.Cells(i, j).Value = List(1)(k, 1) Then mTotal(1) = mTotal(1) + Ws1.Cells(i, j).Offset(0, 2).Value Exit For End If End If If UBound(List(2)) >= k Then If Ws1.Cells(i, j).Value = List(2)(k, 1) Then mTotal(2) = mTotal(2) + Ws1.Cells(i, j).Offset(0, 2).Value Exit For End If End If If UBound(List(3)) >= k Then If Ws1.Cells(i, j).Value = List(3)(k, 1) Then mTotal(3) = mTotal(3) + Ws1.Cells(i, j).Offset(0, 2).Value Exit For End If End If If UBound(List(4)) >= k Then If Ws1.Cells(i, j).Value = List(4)(k, 1) Then mTotal(4) = mTotal(4) + Ws1.Cells(i, j).Offset(0, 2).Value Exit For End If End If Next Next Ws3.Cells(i, "J").Value = mTotal(1) Ws3.Cells(i, "K").Value = mTotal(2) Ws3.Cells(i, "L").Value = mTotal(3) Ws3.Cells(i, "N").Value = mTotal(4) Ws3.Cells(i, "M").Value = Ws1.Cells(i, "BC").Value Ws3.Cells(i, "O").Value = Ws1.Cells(i, "BD").Value Next Set Ws1 = Nothing Set Ws2 = Nothing Set Ws3 = Nothing End Sub 本当に何度も申し訳ございません。 お時間がある時に見て頂けると有り難いです。 どうぞ宜しくお願い致します。

専門家に質問してみよう