Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


704 / 13645 ツリー ←次へ | 前へ→

【78872】2シートの一致照合と計算、一致項目の削除のマクロが組みたいです。 まるばつ 17/2/17(金) 18:36 質問[未読]
【78873】Re:2シートの一致照合と計算、一致項目の... β 17/2/17(金) 19:31 発言[未読]
【78874】Re:2シートの一致照合と計算、一致項目の... β 17/2/17(金) 19:34 発言[未読]
【78875】Re:2シートの一致照合と計算、一致項目の... β 17/2/17(金) 19:37 発言[未読]
【78876】Re:2シートの一致照合と計算、一致項目の... β 17/2/17(金) 19:47 発言[未読]
【78878】Re:2シートの一致照合と計算、一致項目の... まるばつ 17/2/18(土) 10:25 お礼[未読]

【78872】2シートの一致照合と計算、一致項目の削...
質問  まるばつ  - 17/2/17(金) 18:36 -

引用なし
パスワード
   初めて質問させていただきます。私は関数は少々わかるもののVBAがさっぱりなので
インターネットで検索していたところここを見つけました。


シート1に


   A       B      C    E  F  G〜Z
1 伝票番号 型番 A&B  個数 金額 項目色々
2 123   ABC  123ABC  2  2000
3 123   DEF  123DEF  4  8000
4 456   ABC  456ABC  1  1000
5 456   GHI  456GHI  2  6000
6 456   DEF  456DEF  3  6000

シート2に

   A       B      C    E  F  G〜Z
1 伝票番号 型番 A&B  個数 金額 項目色々
2 123   DEF  123DEF  4  8000
3 456   GHI  456GHI  1  3000
4 456   GHI  456DEF  3  6000

というエクセルの表があります。

シート1の列C(A&B)をシート2の列C(A&B)と照会し、一致するものがあれば
引き算(シート1 ― シート2)をして、新しシートに書き込みをしてシート1と2から削除するマクロを
教えて頂きたいと思っております。
マクロを実行するたびにシート3に追記できる形でお願いします。

結果として

シート1に


   A       B      C    E  F  G〜Z
1 伝票番号 型番 A&B  個数 金額 項目色々
2 123   ABC  123ABC  2  2000
3 
4 456   ABC  456ABC  1  1000
5 
6 456   DEF  456DEF  3  6000

シート2に

   A       B      C    E  F  G〜Z
1 伝票番号 型番 A&B  個数 金額 項目色々
2 
3 
4 456   GHI  456DEF  3  6000

シート3に

   A       B      C    E  F  G〜Z
1 伝票番号 型番 A&B  個数 金額 項目色々
2 123   DEF  123DEF  0  0
3 456   GHI  456GHI  1  3000
4 


となるようなことをマクロでできるのでしょうか?
できるならどんなプログラムになるのか教えて頂きたいと思います。
どうかよろしくお願いします。

【78873】Re:2シートの一致照合と計算、一致項目...
発言  β  - 17/2/17(金) 19:31 -

引用なし
パスワード
   ▼まるばつ さん:

Sheet2 の最終行 456 GHI の C列が 456DEF になっているのは 456GHI の間違いだとして。

効率化を求めれば、もっと複雑なコード記述になりますが、VBAが、あまり得意ではない
ということなので、1行ずつ 2つのシートをシート関数のMATCH で比較して処理しています。

『削除』ということですが、質問内の結果サンプルでは『クリア』ですので
以下のコードでも行削除ではなく、行のクリアにしています。

掲示板上、コードが改行されてみにくいのですが、モジュールにコピペすれば
見やすくなると思います。

Sub Sample()
  Dim sh1 As Worksheet
  Dim sh2 As Worksheet
  Dim sh3 As Worksheet
  Dim i As Long
  Dim mx As Long
  Dim k As String
  Dim z As Variant

  
  Application.ScreenUpdating = False
  
  Set sh1 = Sheets("Sheet1")
  Set sh2 = Sheets("Sheet2")
  Set sh3 = Sheets("Sheet3")
  
  mx = sh1.Range("A" & Rows.Count).End(xlUp).Row 'Sheet1 の最終セルの行番号
  
  For i = mx To 2 Step -1 '最終行から2行目までを繰り返し処理
    k = sh1.Cells(i, "C").Value   'その行のC列の値
    z = Application.Match(k, sh2.Range("A1").CurrentRegion.Columns("C"), 0)   'その値がSHeet2のC列にあるかどうか
    If IsNumeric(z) Then  'あった
      sh1.Cells(i, "D").Value = sh1.Cells(i, "D").Value - sh2.Cells(z, "D").Value   'D列のセル Sheet1-Sheet2
      sh1.Cells(i, "E").Value = sh1.Cells(i, "E").Value - sh2.Cells(z, "E").Value   'E列のセル Sheet1-Sheet2
      sh1.Rows(i).Copy sh3.Range("A" & Rows.Count).End(xlUp).Offset(1)        'この時点のSheet3の最終行の次の行に追加
      sh1.Rows(i).ClearContents 'Sheet1の該当行をクリア
      sh2.Rows(z).ClearContents 'SHeet2の該当行をクリア
    End If
  Next
  
End Sub

【78874】Re:2シートの一致照合と計算、一致項目...
発言  β  - 17/2/17(金) 19:34 -

引用なし
パスワード
   ▼まるばつ さん:

↑ 要件がクリアではなく削除になっても対応しやすいようにしましたが
クリアでかわらないということなら

  For i = mx To 2 Step -1 '最終行から2行目までを繰り返し処理

これを

  For i = 2 To mx '2行目から最終行までを繰り返し処理

のほうが素直でいいです。

【78875】Re:2シートの一致照合と計算、一致項目...
発言  β  - 17/2/17(金) 19:37 -

引用なし
パスワード
   ▼まるばつ さん:

あっあっあっ!!

最初行削除でコードを書いて、アップ前にクリアにしたんですが、クリアの場合
アップしたコードでは具合悪くなります。

改訂版、後ほどアップします。

【78876】Re:2シートの一致照合と計算、一致項目...
発言  β  - 17/2/17(金) 19:47 -

引用なし
パスワード
   ▼まるばつ さん:

改訂版です。

Sub Sample()
  Dim sh1 As Worksheet
  Dim sh2 As Worksheet
  Dim sh3 As Worksheet
  Dim i As Long
  Dim mx As Long
  Dim k As String
  Dim z As Variant
  Dim n1 As Long
  Dim n2 As Long
  Dim r As Range
  
  Application.ScreenUpdating = False
  
  Set sh1 = Sheets("Sheet1")
  Set sh2 = Sheets("Sheet2")
  Set sh3 = Sheets("Sheet3")
  
  mx = sh1.Range("A" & Rows.Count).End(xlUp).Row 'Sheet1 の最終セルの行番号
  
  For i = 2 To mx '2行目から最終行までを繰り返し処理
    k = sh1.Cells(i, "C").Value   'その行のC列の値
    If Not IsEmpty(k) Then '空白の値でなければ
      Set r = sh2.Range("C1", sh2.Range("C" & Rows.Count).End(xlUp))
      z = Application.Match(k, r, 0)   'その値がSHeet2のC列にあるかどうか
      If IsNumeric(z) Then  'あった
        sh1.Cells(i, "D").Value = sh1.Cells(i, "D").Value - sh2.Cells(z, "D").Value   'D列のセル Sheet1-Sheet2
        sh1.Cells(i, "E").Value = sh1.Cells(i, "E").Value - sh2.Cells(z, "E").Value   'E列のセル Sheet1-Sheet2
        sh1.Rows(i).Copy sh3.Range("A" & Rows.Count).End(xlUp).Offset(1)        'この時点のSheet3の最終行の次の行に追加
        sh1.Rows(i).ClearContents 'Sheet1の該当行をクリア
        sh2.Rows(z).ClearContents 'SHeet2の該当行をクリア
      End If
    End If
  Next
  
End Sub

【78878】Re:2シートの一致照合と計算、一致項目...
お礼  まるばつ  - 17/2/18(土) 10:25 -

引用なし
パスワード
   ▼β 様:

早速のお返事およびプログラミングありがとうございます。
マクロ実行をしてみたところ、見事私の理想通りの動きをしました!

今まで手でしていた作業の大幅な効率化ができると思うと
とてもうれしく思います。

この度はすべて丸投げをしてしまいましたがまず、このマクロの理解から
VBAを始めてみようと思います。

ありがとうございました!

704 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free