
シート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
言葉足らずの所があればごめんなさい。
追記いたしますので、教えて下さい。
よろしくお願い致します。
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
ご回答いただきありがとうございました。
mimeu様が書いて下さったのも実行してみたのですが、
シートCに1行もコピーされないのです....。
全くないというのはないので、やはり何か私の方で最初からミスっているのだと思います。
実際、最初に投稿した内容で変数の書き間違いを発見してしまってます。
申し訳ありません。
そこのところ修正して、mimeu様が書いて下さったのも見直してもう一度やり直して、シートCにコピーされないので、この投稿は一旦終了とした方が良いと思っています。
返信頂いたのにすみません。
でも、教えて頂いたマクロは保存して、時間かけてやってみます。
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
--------------------------------------------
のように修正してみてください。
ご回答いただきありがとうございました。
修正して下さったのも実行してみたのですが、シートCに1行もコピーされないのです....。
(前のも変数の宣言等々は抜けていません)
全くないというのはないので、やはり何か私の方で最初からミスっているのだと思います。
実際、最初に投稿した内容で変数の書き間違いを発見してしまってます。
申し訳ありません。
イミディエイトで変数の動きを見てみたりもしてみたのですが....。
回答頂いたのに本当すみません。
でも、教えて頂いたマクロは保存して、時間かけてやってみます。
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
ご回答いただきありがとうございました。
>行削除を伴う場合、最下行からの検索と削除を行う
全く理解しておらず、勉強になりました。
書いて下さったのを試してみたのですが、シートCにコピーされなかったです...。
私が何か重要なことを分かっていない、ここに書ききれてないせいかもしれませんね。
もう少し試行錯誤してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) マクロで最終行から上に検索を逆にしたい 1 2022/05/17 18:27
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) VBAで、シート間の転記するコードをFOR~NEXTで教えてください。 9 2023/04/30 20:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定のセルだけ結果がおかしい...
-
エクセル、シートの並び替え
-
EXCELで同一フォーマットのシー...
-
別シート参照のセルをシート毎...
-
エクセルの複数シートの保護を...
-
特定のシートの削除を禁止した...
-
エクセルで前シートを参照して...
-
前の(左隣の)シートを連続参...
-
【Excel マクロ】 同一book内で...
-
シートAとシートBの得意先コー...
-
エクセル 計算式も入っていない...
-
Excelで、同じシート上にコピー...
-
Excelの質問になります、ご教授...
-
シートを追加・名前を次月に変...
-
Excelで金銭出納帳。繰越残高を...
-
MIDで指定するセル番号を、別の...
-
エクセルマクロで教えて下さい。
-
マクロ内のワークシートの名前...
-
Excelで日付けを入れたらスケジ...
-
エクセルで作ったデータを思う...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定のセルだけ結果がおかしい...
-
エクセルの複数シートの保護を...
-
前の(左隣の)シートを連続参...
-
別シート参照のセルをシート毎...
-
エクセルで前シートを参照して...
-
Excel、同じフォルダ内のExcel...
-
特定のシートの削除を禁止した...
-
EXCEL:同じセルへどんどん足し...
-
エクセル 計算式も入っていない...
-
Excelで金銭出納帳。繰越残高を...
-
複数シートの特定の位置に連番...
-
エクセルでファイルを開いたと...
-
シートの保護のあとセルの列、...
-
Accessのスプレッドシートエク...
-
VBAで条件によりフォントサイズ...
-
VBAでシートコピー後、シート名...
-
エクセルで前のシートを連続参...
-
エクセルVBAでパスの¥マークに...
-
EXCELで同一フォーマットのシー...
-
Excelで同じシートのコピーを一...
おすすめ情報