シートAとシートBの得意先コードを一致させて、該当行をシートCにコピーするVBAプログラム

このQ&Aのポイント
  • シートAとシートBの得意先コードが一致したら、該当行をシートCにコピーするVBAを組みたい
  • シートAとシートBの得意先コードが一致したら、該当行をシートCにコピーし、シートAの該当行を削除したい
  • Excel2003でVBAを使用して、シートAとシートBの得意先コードを比較し、一致した行をシートCにコピーするプログラムを作りたい
回答を見る
  • ベストアンサー

シートAとシートBの得意先コードが一致したら、該当行をシートCにコピー

シートAとシートBの得意先コードが一致したら、該当行をシートCにコピーするVBAを組みたいのですが、上手く行きません。加えてシートAの該当行は削除しておきたいです。 XPでExcel2003を使用しています。 Const strMasSheet = "A" Const strMasSheet2 = "B" Const strSrhSheet = "C" Dim strSrhCode As Long 'シートAの得意先コード Dim strSrhCode2 As Long 'シートBの得意先コード Dim intRow As Long Dim intRow2 As Long Dim intCnt As Long Dim maxgyo As Long 'シートAの最終行 Dim maxgyo2 As Long 'シートBの最終行 Sub データを分ける() maxgyo = Sheets(strMasSheet).Cells(Rows.Count, 1).End(xlUp).Row 'シートAの最終行を取得 For intRow = 2 To maxgyo '2行から始めて最終行まで(1upで) strSrhCode = Sheets(strMasSheet).Cells(intRow, 2) '検索値 B列= 得意先CDを取得 maxgyo2 = Sheets(strMasSheet2).Cells(Rows.Count, 1).End(xlUp).Row 'シートBの最終行を取得 For intRow2 = 2 To maxgyo '2行から始めて最終行まで(1upで) strSrhCode2 = Sheets(strMasSheet).Cells(intRow, 8) '検索値 H列 = 得意先CDを取得 intCnt = 2 '2行から If strSrhCode = strSrhCode2 Then 'もし検索値と検索対象シートの得意先CDが一致したら intCnt = intCnt + 1 With Sheets(strSrhSheet) .Cells(intCnt, 1) = Cells(intRow, 1) .Cells(intCnt, 2) = Cells(intRow, 2) .Cells(intCnt, 3) = Cells(intRow, 3) .Cells(intCnt, 4) = Cells(intRow, 4) .Cells(intCnt, 5) = Cells(intRow, 5) .Cells(intCnt, 6) = Cells(intRow, 6) .Cells(intCnt, 7) = Cells(intRow, 7) .Cells(intCnt, 8) = Cells(intRow, 8) .Cells(intCnt, 9) = Cells(intRow, 9) .Cells(intCnt, 10) = Cells(intRow, 10) .Cells(intCnt, 11) = Cells(intRow, 11) End With End If Next intRow2 Next intRow MsgBox "処理終了" End Sub 言葉足らずの所があればごめんなさい。 追記いたしますので、教えて下さい。 よろしくお願い致します。

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

  • ベストアンサー
  • mimeu
  • ベストアンサー率49% (39/79)
回答No.3

同じ事をしているだけですが、こういうプログラム表記も 読みやすいかと思いますので、ご参考になさって下さい。 Option Explicit ' 話の前提として、シートA, シートB はそれぞれ列Aで昇順に並べ替えてあるものとします Sub 転記と削除()   Dim 行A As Long, 行B As Long, 行C As Long   Dim 最下行A As Long, 最下行B As Long   Dim シートA As Worksheet, シートB As Worksheet, シートC As Worksheet   ' 以下3行のシート名は適宜修正して下さいネ   Set シートA = Worksheets("A")   Set シートB = Worksheets("B")   Set シートC = Worksheets("C")   ' 以下3行はこのように仮定していますが、違ってたら修正して下さいネ   Const 開始行A = 2   Const 開始行B = 2   Const 開始行C = 2   ' 以下2行もこのように仮定していますが、違ってたら修正して下さいネ   最下行A = シートA.Range("A1").End(xlDown).Row   最下行B = シートB.Range("A1").End(xlDown).Row   行A = 最下行A   行B = 最下行B   行C = 開始行C   Do     If シートA.Cells(行A, 1) > シートB.Cells(行B, 1) Then       行A = 行A - 1       If 行A < 開始行A Then Exit Do     ElseIf シートA.Cells(行A, 1) < シートB.Cells(行B, 1) Then       行B = 行B - 1       If 行B < 開始行B Then Exit Do     Else       シートA.Range("A" & 行A & ":K" & 行A).Copy シートC.Range("A" & 行C)       シートA.Range("A" & 行A).EntireRow.Delete       行A = 行A - 1       If 行A < 開始行A Then Exit Do       行B = 行B - 1       行C = 行C + 1     End If   Loop   ' シートC も列Aで昇順に並べ替える   If 行C > 2 Then     シートC.Range("A1:K" & (行C - 1)).Sort Key1:=シートC.Range("A2") _       , Order1:=xlAscending, Header:=xlGuess   End If End Sub

6338-tm
質問者

お礼

ご回答いただきありがとうございました。 mimeu様が書いて下さったのも実行してみたのですが、 シートCに1行もコピーされないのです....。 全くないというのはないので、やはり何か私の方で最初からミスっているのだと思います。 実際、最初に投稿した内容で変数の書き間違いを発見してしまってます。 申し訳ありません。 そこのところ修正して、mimeu様が書いて下さったのも見直してもう一度やり直して、シートCにコピーされないので、この投稿は一旦終了とした方が良いと思っています。 返信頂いたのにすみません。 でも、教えて頂いたマクロは保存して、時間かけてやってみます。

その他の回答 (2)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

>シートCにコピーされなかったです...。 大きな改変はしていませんが・・・。 プロシージャー外のコードを追加して試して頂いているものと思っていますが、これは記述してありますよね? そうでないとエラーになりますから。 ----------------------------------- Const strMasSheet = "A" Const strMasSheet2 = "B" Const strSrhSheet = "C" Dim strSrhCode As Long 'シートAの得意先コード Dim strSrhCode2 As Long 'シートBの得意先コード Dim intRow As Long Dim intRow2 As Long Dim intCnt As Long Dim maxgyo As Long 'シートAの最終行 Dim maxgyo2 As Long 'シートBの最終行 ------------------------------------------- あとは、コピー処理の部分を ------------------------------------------- For y = 1 To 11 With Sheets(strSrhSheet) .Cells(intCnt, y) = Sheets(strMasSheet2).Cells(intRow, y) End With Next -------------------------------------------- のように修正してみてください。

6338-tm
質問者

お礼

ご回答いただきありがとうございました。 修正して下さったのも実行してみたのですが、シートCに1行もコピーされないのです....。 (前のも変数の宣言等々は抜けていません) 全くないというのはないので、やはり何か私の方で最初からミスっているのだと思います。 実際、最初に投稿した内容で変数の書き間違いを発見してしまってます。 申し訳ありません。 イミディエイトで変数の動きを見てみたりもしてみたのですが....。 回答頂いたのに本当すみません。 でも、教えて頂いたマクロは保存して、時間かけてやってみます。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>上手く行きません。加えてシートAの該当行は削除しておきたいです。 何がうまく行かないのか解りませんが・・・。 行削除を伴う場合、データを上から検索して削除すると自分の位置(現在行)の認識に矛盾が生じる事になるので、それを理解している方は最下行からの検索と削除を行うプログラムを書きます。 テストはしていませんからイメージとして・・・。 Sub データを分ける2() Dim y As Integer Dim flg As Boolean maxgyo = Sheets(strMasSheet).Cells(Rows.Count, 1).End(xlUp).Row 'シートAの最終行を取得 maxgyo2 = Sheets(strMasSheet2).Cells(Rows.Count, 1).End(xlUp).Row 'シートBの最終行を取得 For intRow = maxgyo To 2 '最終行から始めて2まで(1downで) strSrhCode = Sheets(strMasSheet).Cells(intRow, 2) '検索値 B列= 得意先CDを取得 flg = False 'フラグリセット For intRow2 = 2 To maxgyo '2行から始めて最終行まで(1upで) strSrhCode2 = Sheets(strMasSheet).Cells(intRow, 8) '検索値 H列 = 得意先CDを取得 intCnt = 2 '2行から If strSrhCode = strSrhCode2 Then 'もし検索値と検索対象シートの得意先CDが一致したら intCnt = intCnt + 1 flg = True 'フラグセット For y = 1 To 11 With Sheets(strSrhSheet) .Cells(intCnt, y) = Cells(intRow, y) End With Next End If Next intRow2 If flg Then 'データが見つかった場合、行削除 Sheets(strMasSheet).Rows(intRow).Delete End If Next intRow MsgBox "処理終了" End Sub

6338-tm
質問者

お礼

ご回答いただきありがとうございました。 >行削除を伴う場合、最下行からの検索と削除を行う 全く理解しておらず、勉強になりました。 書いて下さったのを試してみたのですが、シートCにコピーされなかったです...。 私が何か重要なことを分かっていない、ここに書ききれてないせいかもしれませんね。 もう少し試行錯誤してみます。

関連するQ&A

  • VBA 最終行を選んだシートにコピーする。

    VBAど初心者です。どうしても最終行のデータを選んだシートにコピーできません。 LastRow.Selectのところで、止まってしまいます。どのように行を設定していいのかさっぱりわかりません。どなたか、ご指導のほどよろしくお願いします。 Sub copy_last_line() Dim LastRow As Long Sheets("Sheet1").Select LastRow = Cells(Rows.Count, 1).End(xlUp).Row LastRow.Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("A1").Select End Sub

  • VBA コード番号がない場合は、次の行へ進む

    OSはXPPro、 Excelは2003を使用しています。 入金データの「支店データ」シートのコード番号がマスタの表にある時、新シート(test)にコピーするマクロを作ろうと悪戦苦闘しています。 下記までは組んだのですが、「インデックスが有効範囲にありません」とエラーになってしまいます。 マスタにないコードだからだと思っているのですが、そういう場合は次の行のコード番号に進めるステートメントをどう組めば良いか分かりません。 どなたかご教示頂けると有り難いです。 よろしくお願い致します。 Sub test() Dim wb As Workbook Dim ws As Worksheet Dim mypath As String Dim fname As String Dim maxgyo As Long 'マスタの最終行 Dim intRow As Long 'マスタの行 Dim strMasCode As Long   'マスタのコード番号 Dim maxgyo2 As Long '入金データの最終行 Dim intRow2 As Long '入金データの行 Dim strSrhCode As Long '入金データのコード番号 Dim shingyo As Long '新シートの書き込み行 Worksheets.Add After:=ActiveSheet, Count:=1 '新しいワークシートを作成 ActiveSheet.Name = "test"            'そのシートの名前は[test] mypath = "C:\Documents and Settings\XXX\My Documents\XXX\" fname = "マスタ.xls" Set wb = Workbooks.Open(mypath & fname) '上記で指定したブックを開く Set ws = wb.Worksheets("担当マスタ")     '[担当マスタ]シートを指定 Workbooks("入金データ").Activate maxgyo = Sheets("支店データ").Cells(Rows.Count, 1).End(xlUp).Row '支店データの最終行 For intRow = 2 To maxgyo strSrhCode = Worksheets("支店データ").Cells(intRow, 6) shingyo = 1 shingyo = singyo + 1 Workbooks("マスタ").Activate maxgyo2 = Sheets("マスタ").Cells(Rows.Count, 2).End(xlUp).Row 'マスタの最終行 For intRow2 = 2 To maxgyo2 strMasCode = Sheets("マスタ").Cells(intRow2, 2) 'マスタのコード番号を代入 If strSrhCode = strMasCode Then 'マスタと支店データのコード番号が一致したら With Workbooks("入金データ").Worksheets("test") .Cells(shingyo, 1) = Worksheets("支店データ").Cells(intRow, 1) .Cells(shingyo, 2) = Worksheets("支店データ").Cells(intRow, 2) End With End If Next intRow2 Next intRow End Sub

  • エクセル2003マクロの機能追加

    Sub test() Dim 行1 As Long, 最終行 As Long, 行2 As Long Sheets("Sheet2").Cells.ClearContents Sheets("Sheet1").Activate 最終行 = Range("C65536").End(xlUp).Row 行2 = 1 For 行1 = 1 To 最終行 Sheets("Sheet2").Cells(行2, 1).Resize(1, 3) = Range(Cells(行1, 1), Cells(行1, 3)).Value If Range("A" & 行1).Font.Bold Then Sheets("Sheet2").Range("A" & 行2) = Range("A" & 行1) & "-1" Sheets("Sheet2").Cells(行2 + 1, 1).Resize(1, 3) = Range(Cells(行1, 1), Cells(行1, 3)).Value Sheets("Sheet2").Range("A" & 行2 + 1) = Range("A" & 行1) & "-2" 行2 = 行2 + 1 End If If Range("A" & 行1) = "" Then 行2 = 行2 - 1 Sheets("Sheet2").Range("C" & 行2) = Sheets("Sheet2").Range("C" & 行2) + Range("C" & 行1) End If 行2 = 行2 + 1 Next 行1 End Sub 元データ AAAA5 9601  950 BBBB1 9660  150 ASAS9 9654  -50 AXCW5 9603  1375 以下の用にマクロで変換する機能を追加したいのです AAAA5 9601  950 BBBB1-1 9660  150 BBBB1-2 9660  150 ASAS9 9654  50 AXCW5 9603  1375 宜しくおねがいします。

  • シート1のC列の最終行をコピーして同じ行に値貼り付けしたい

    シート1のC列の最終行を取得して その行を丸々値貼り付けするマクロを作りたいと思います。 シート3のB18の値をシート1のC列の最終行の1つ下のセルに値貼り付け すると、その行のA、B列に日付が入力される関数が入っています。(下まで) 関数が入ったままだと、うまくいかない時があるので最終行をコピーして値貼り付けしたいのですが、マクロの作り方を教えてください。 シート1の最終行に貼り付け Sheets("Sheet3").Select Range("B18").Select Selection.Copy Sheets("Sheet1").Select Range("C65536").End(xlUp).Offset(1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub 最終行をコピーして値貼り付け Dim 最終行 As Integer 最終行 = Range("C65536").End(xlUp).Row Range("A6:C" & 最終行).Select Selection.Copy Sheets("Sheet1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub このマクロだと、A6からC列の最終行まで全てコピーされてしまうので、C列の最終行のAからC列まで1行だけコピーできないでしょうか?

  • エクセル2003マクロの再編集

    Sub test() Dim 行1 As Long, 最終行 As Long, 行2 As Long Sheets("Sheet2").Cells.ClearContents Sheets("Sheet1").Activate 最終行 = Range("C65536").End(xlUp).Row 行2 = 1 For 行1 = 1 To 最終行 Sheets("Sheet2").Cells(行2, 1).Resize(1, 3) = Range(Cells(行1, 1), Cells(行1, 3)).Value Sheets("Sheet2").Cells(行2, 3).Value = Abs(Sheets("Sheet2").Cells(行2, 3).Value) If Range("A" & 行1).Value = "BBBB1" Then Sheets("Sheet2").Range("A" & 行2) = Range("A" & 行1) & "-1" Sheets("Sheet2").Cells(行2 + 1, 1).Resize(1, 3) = Range(Cells(行1, 1), Cells(行1, 3)).Value Sheets("Sheet2").Range("A" & 行2 + 1) = Range("A" & 行1) & "-2" 行2 = 行2 + 1 End If If Range("A" & 行1) = "" Then 行2 = 行2 - 1 Sheets("Sheet2").Range("C" & 行2) = Sheets("Sheet2").Range("C" & 行2) + Range("C" & 行1) End If 行2 = 行2 + 1 Next 行1 End Sub を編集したいのですが全然図りません ご指導お願いします 元データ AAAA5 9601  950 BBBB1 9660  150 ASAS9 9654  -50 AXCW5 9603  1375 以下の用にマクロで変換する用に出来たのですが 【1】 BBBB1だけではなくAAAA5も対処になったときの 追加方法です 元データは一切変更が出来ません ※フォントの変更も不可です 【2】 元データと変換後データがSheet1からSheet2になっていますが Sheet1の元は範囲はA1~C400で変換後をSheet1E1~G400にしたいのです AAAA5 9601  950  BBBB1-1 9660  150  BBBB1-2 9660  150 ASAS9 9654  50 AXCW5 9603  1375

  • VBA 新データ行のみ元のデータシートにコピーする

    OSは、XP Excelは、2003 を使用しています。 シート1には元のデータ、シート2には追加データと元データが混じってあります。 元データシートに、追加データシートから追加データ行のみをコピペしたく、 マクロを組んでいます。 下記、 C列の売上番号を見比べて、C列のみ追記するまでは出来たのですが、 1行にデータはA列~X列まであるので、そのデータも一緒にコピペするには どの様にすれば良いのか教えて下さい。 よろしくお願いします。 ****************** Sub 追加データ追記マクロ() Dim motows As Worksheet '元データシート名を格納 Dim tsuikaws As Worksheet '追加データシート名を格納 Dim tsuikamax As Long '追加データの最終行 Dim motomax As Long '元データの最終行 Dim tsuikaNum As Range '追加売上番号 Dim motoNum As Variant '元売上番号 Dim i As Long     '書き込み行 Set motows = Worksheets(1).Name '元シート名を格納 Set tsuikaws = Worksheets(2).Name    '追加シート名を格納 tsuikamax = tsuikaws.Cells(Rows.Count, 1).End(xlUp).Row  '追加データの最終行を格納 motomax = motows.Cells(Rows.Count, 1).End(xlUp).Row '元データの最終行を格納 i = motomax + 1       '書き込み行は元データ最終行+1 For Each tsuikaNum In tsuikaws.Range("C1:C" & tsuikamax)        '追加データ売上番号格納 Set motoNum = motows.Range("C:C").Find(tsuikaNum, lookat:=xlWhole) '元データ売上番号格納 If motoNum Is Nothing Then '元データになかったら With motows .Cells(i, 3) = tsuikaNum i = i + 1 End With End If Next tsuikaNum End Sub

  • VBA 実行時エラー1004(その2)

    毎度お世話になっております。 シート「sheet2」のA列のリスト内容を、シート「M_得意先」のリストからVLOOKUPして、指定のセルに書き出していくというコードを作成してみたのですが、VLOOKUPを実行する段階でエラーが出てしまいます。 少し変更して、同一シート内でのVLOOKUPは問題なく実行できたのですが...原因をご存知の方教えてください。 Dim b As String Dim endRcell2 As Long Dim cnt10 As long Sheets("sheet2").Select Sheets("sheet2").Range("A1").CurrentRegion.Select 'データ全体選択 Selection.SpecialCells(xlCellTypeLastCell).Select '最終行検出 endRcell2 = ActiveCell.Row cnt10 = 2 Do ↓実行時エラー1004が出る行 b = Application.WorksheetFunction.VLookup(Sheets("Sheet2").Range("A" & cnt10).Value, Sheets("M_得意先").Range(Cells(1, 1), Cells(endRcell, 2)), 2, False) ↑実行時エラー1004が出る行 Sheets("sheet2").Range("E" & cnt10).Value = b cnt10 = cnt10 + 1 Loop Until cnt10 = endRcell2

  • Matchの処理について

    下記の処理がどうしてもうまくいかなくて、 皆様のお知恵を拝借できればありがたいです。 Sheet1に下記のように縦に3列データがならんでいます。 A  あ  10 A  い  12 A  う  16 B  あ  19 B  い  15 B  う   7 これをもとにSheet2に下記の通りマトリクス形式に 変換する。   あ  い  う A  10  12  16 B  19  15   7 これを処理しようと以下の通り記述したのですが、 マッチする項目がなかった場合、どうも行(列)が ずれてヒットしているようです。 On Error Resume Nextが原因のような気がするのですが。 これを回避するにはどうしたらよろしいでしょうか? お助けください~。 よろしくお願い致します。 Dim i As Long Dim j As Long Dim k As Long Dim 検索値A As Variant Dim 検索値B As Variant On Error Resume Next i = 2 Do While (Sheets("SHEET1").Cells(i, 1) <> "") 検索値A = Sheets("SHEET1").Cells(i, 1).Value 検索値B = Sheets("SHEET1").Cells(i, 2).Value j = Application.Match(検索値A, Sheets("Sheet2").Range("範囲A"), 0) k = Application.Match(検索値B, Sheets("Sheet2").Range("範囲B"), 0) Sheets("Sheet2").Cells(j, k).Value =Sheets("SHEET1").Cells(i, 3) i = i + 1 Loop End Sub

  • 最終行のコピーペーストのマクロ作成をご指導ください。

    最終行のコピーペーストのマクロ作成をご指導ください。 1つのブックに60シートあります。D~Sまでの行をセルの結合をして文字入力がしてあります。 又、どんどんテキスト行が追加されてゆきます。毎回、行の最終行をコピーして 指定セルB21:s23(セル結合してあり)に貼り付けたい(3シート目~60シート目全てのシート)のですが、上手く行きません。 マクロ素人ですが、思考錯誤してみましたが、駄目です。ご指導下さい。 出来れば、1から教えてください。御願いします。 Dim n As Integer Dim LastR1 As Long, LastR2 As Long For n = 3 To 60 'データシートの数だけループ LastR1 = Sheets(n).Range("B22") '貼付先取得 LastR2 = Sheets(n).Range("D65536").End(xlUp).Row '貼付元シートの最終行取得 With Sheets(n) '貼付元データをコピー(最終行) ここがおかしい? .Range(.Cells(22, 4), .Cells(LastR2, 60)).Copy End With ActiveSheet.Paste Destination:=Sheets(n).Cells(LastR1) '貼付 Next End Sub

  • Excelマクロ CSV出力

    Private Sub cmd_csv_Click() Open "\\サーバ名\フォルダ名\あああ.csv" For Output Access Write As #1 With Sheets("データ") For intRow = 3 To .Range("a2").End(xlDown).Row Print #1, .Cells(intRow, 1) & "," & .Cells(intRow, 2) & "," & .Cells(intRow, 3) & "," & .Cells(intRow, 4) & "," & .Cells(intRow, 5) & "," & .Cells(intRow, 6) & "," & .Cells(intRow, 7) & "," & .Cells(intRow, 8) & "," & .Cells(intRow, 9) & "," & .Cells(intRow, 10) & "," & .Cells(intRow, 11) & "," & .Cells(intRow, 12) & "," & .Cells(intRow, 13) & "," & .Cells(intRow, 14) & "," & .Cells(intRow, 15) Next intRow End With Close #1 MsgBox "出力完了しました。 " & Chr(13) & Chr(10) & Chr(13) & Chr(10) & "出力ファイル:フォルダ名\あああ.csv" End Sub ------------------------------------------------------------- 上記のロジックで「データ」シートのA3からO列の最終行までをCSV出力しています。 このマクロにA列に値が入った行のみを出力する(A列が空白なら無視し次の行へ)というロジックを追加したいのですが、方法がわかる方いらっしゃいますか? どなたか教えてくださいm(__)m!!

専門家に質問してみよう