エクセルでデータの比較をしたいです。お教え頂けないでしょうか
エクセルで2つのシートにある同一の商品コードと
在庫数を比較するマクロを作成中です。
シート1のA列にある商品コードとB列にある在庫数を取得し
シート2のA列にある商品コードから同じ商品コードを探します。
同一の商品コードがあった場合に在庫数を比較して
その数が減少していなければC列に次の処理を加える。
商品コードが合致した後は 処理を抜けて次の商品コードを比較させたいのですが
下行にある商品コードを探し続けてしまいます。(データの総当りとなる)
つきましては どの様に記述すれば良いのでしょうか
お教え頂けます様 よろしくお願い致します。
***********
Sub check1()
Dim kz1 As long 'シート1データ数
Dim kz2 As long 'シート2データ数
Dim st1 As String 'シート名
Dim dt1 As Variant '商品コード
Dim dt2 As Variant '在庫数
Sheets("sheet1").Select
st1 = ActiveSheet.Name
kz1 = Range("a65536").End(xlUp).Row
Range("a1").Select
ActiveCell.Offset(1, 0).Select
For a = 0 To kz1 - 2
Sheets(st1).Select
dt1 = ActiveCell.Value '商品コード
dt2 = ActiveCell.Offset(0, 1).Value '在庫数
Sheets("sheet2").Select
kz2 = Range("a65536").End(xlUp).Row
Range("a1").Select
ActiveCell.Offset(1, 0).Select
For b = 0 To kz2 - 1
'同一商品コードを検索
if activecell.value = dt1
'在庫数を比較
if activecell.value >= dt2
'在庫数が同じ もしくは増加していた場合に処理
'次の処理を追加
endif
else
ActiveCell.Offset(1, 0).Select
endif
Next b
Sheets(st1).Select
Next a
end sub
No.3ベストアンサー
- 回答日時:
コードを提示する場合は、書き写すと書き写し間違いの可能性があるので、コピペするようにしましょう。
if activecell.value = dt1
これなんて、文法的にエラーですよね。
セルの値を調べたり、セルに値を入力したりする場合は、わざわざシートやセルをSelectする必要はありません。
たとえば、Sheet1のA1に、Sheet2のB2の値を入力したかったら、
Worksheets("Sheet1").Range("A1").Value = Worksheets("Sheet2").Range("B2").Value
だけで良いです。
Dim st1 As String 'シート名
Sheets("sheet1").Select
st1 = ActiveSheet.Name
Sheets(st1).Select
このように、シート名用の文字列変数を使うのも一つの手ですが、それよりも、st1をワークシート変数として使うほうが、一般的だし、便利です。
st1をワークシート変数として使うと、上記のコードは、下記のようになります。
Dim st1 As Worksheet
Set st1 = Sheets("sheet1")
st1.Select
そして、Sheet1のA1は、
st1.Range("A1")
と書くことが出来ます。
Forループを抜けたいときは、Exit For です。
セルをいちいち選択して、ActiveCellを変数代わりに使っているから、ややこしいことになっていると思われます。
セルも変数を使いましょう。
Forループのカウンターとして使っているaもbも、ループの中で使用していないので、ループはDo Whileループ、もしくはDo Untilループを使うのも良いでしょう。
これらを踏まえて、コードを書き直すと、以下のようになります。
Sub check2()
Dim st1 As Worksheet
Dim st2 As Worksheet
Dim cl1 As Range
Dim cl2 As Range
Set st1 = Sheets("sheet1")
Set st2 = Sheets("sheet2")
Set cl1 = st1.Range("A2")
Do Until cl1.Row > cl1.Range("a65536").End(xlUp).Row
Set cl2 = st2.Range("A2")
Do Until cl2.Row > cl2.Range("a65536").End(xlUp).Row
'同一商品コードを検索
If cl2.Value = cl1.Value Then
'在庫数を比較
If cl2.Offset(, 1).Value >= cl1.Offset(, 1).Value Then
'在庫数が同じ もしくは増加していた場合に処理
'次の処理を追加
Exit Do
End If
End If
Set cl2 = cl2.Offset(1)
Next b
Set cl1 = cl1.Offset(1)
Next a
End Sub
nattocurryさん
はじめまして ご回答して頂きありがとうございます
お伺いしたい内容には不必要な処理が多かった為に
手入力にて修正をしたところ文法誤りをしていた様です。
大変失礼致しました。
大変判り易いご説明をして頂きまして
希望していた事が進められそうです。
皆さん お時間を割いて頂きまして心より深く感謝申し上げます。
No.2
- 回答日時:
雑感
下記参考にしてみて。
質問者はまだプログラムロジックというものが色々あるという経験を積んでないようだ。
マッチングという手法もあるが。
質問にはそのロジックの説明が無い。意識が薄い状態では。それによってコードが短くなったりする。
マクロの記録で出てくるSelectは、VBAが良くわかって慣れれば、ほとんど使わなくて良い。
特にセルのSelectはね。
それに両シートを扱うときのSet Sh1=worksheets("Sheet1")のような書き方も使ってない。
WEBで照会すること。
また両シートで、同じ商品コードが複数行現れるケースかも認識してますか。書いてないのであいまいのままでは。これが処理に大きく影響する場合が多いよ。
ーー
検索するにはどういうロジックがあるのか勉強のこと。
全行総なめ
Findメソッド
両データをソートして検索不要に持ち込む
フィルタ利用
SQLなど
1つしか該当ないならVLOOKUPやMATCHのVBA関数の利用
など勉強してみて。
imogasiさん
はじめまして ご回答して頂きありがとうございます
ご指摘の通り VBというものをよく理解していない中で
本マクロを作成しております。
また 同じコードが複数ある場合など想定が足りておらず
おはずかしい限りでございます。
記述の簡略化など大変参考になりました。
お伺いしたように 理解を深められるように時間を設ける事に致します。
No.1
- 回答日時:
コード合致処理の後はFor~Nextから抜けるために、Exit For を入れてやります。
'---------------------------------------------------
Sub test()
Dim R1 As Long
Dim R2 As Long
Dim Sht1 As Worksheet
Dim Sht2 As Worksheet
Set Sht1 = Worksheets("Sheet1")
Set Sht2 = Worksheets("Sheet2")
For R1 = 2 To Sht1.Cells(Rows.Count, "A").End(xlUp).Row
For R2 = 2 To Sht2.Cells(Rows.Count, "B").End(xlUp).Row
If Sht1.Cells(R1, "A").Value = Sht2.Cells(R2, "A").Value Then
If Sht1.Cells(R1, "B").Value > Sht2.Cells(R2, "B").Value Then
'▼在庫減少の処理
Else
'▼在庫同じ&増加の処理
End If
Exit For '●コード合致したのでForを抜けて次のコードへ
End If
Next R2
Next R1
End Sub
'---------------------------------------------------
今回のような場合は、シート等をいちいちSelectする必要ありません。
また、データが多い場合は、コード検索にはFindメソッドを使いますが
質問者の場合はまだFor~Nextを理解してからでいいでしょう。
以上です。
myRangeさん
はじめまして ご回答して頂きありがとうございます
早速 使わせて頂きたいと思います。
これまで必要以上の無駄な記述をしていた様です
大変参考になりました。 ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) エクセル VBA 処理スピードを上げたいのですが。 6 2023/03/31 20:52
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) VBAでのループ順序について 3 2023/03/13 10:55
- Visual Basic(VBA) VBA 税率を判定表する方法を教えて下さい。 10 2022/03/28 11:21
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロの「SaveAs」でエラーが...
-
VBA 別ブックからの転記の高速...
-
マクロ実行後に別シートの残像...
-
EXCELのSheet番号って変更でき...
-
VBA 空白行に転記する
-
【VBA】特定の条件でセルをコピー
-
Excel VBA オートフィルターで...
-
ExcelのVBマクロを、バックグラ...
-
VBAコードについて
-
100万件越えCSVから条件を満た...
-
グラフマクロで系列を変数にす...
-
VBAでのピボットテーブルの範囲...
-
VBAで、1つのエクセルで、2つの...
-
Count Ifのセルの範囲指定に変...
-
Excel2013で切り取り禁止
-
VBA 実行時エラー1004 rangeメ...
-
VBAのグラフに違うシートの...
-
【VBA】データを各シートに自動...
-
VBAで質問ですが、皆さんはどの...
-
アクセスからエクセルへ出力時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロの「SaveAs」でエラーが...
-
マクロ実行後に別シートの残像...
-
VBA 空白行に転記する
-
EXCELのSheet番号って変更でき...
-
VBA 別ブックからの転記の高速...
-
VBA別シートの最終行の次行へ転...
-
100万件越えCSVから条件を満た...
-
VBAで変数の数/変数名を動的に...
-
Unionでの他のシートの参照につ...
-
VBA 実行時エラー1004 rangeメ...
-
【VBA】特定の条件でセルをコピー
-
楽天RSSからエクセルVBAを使用...
-
【Excel VBA】自動メール送信の...
-
Changeイベントで複数セルへの...
-
Excel2013で切り取り禁止
-
Excel VBA オートフィルターで...
-
Count Ifのセルの範囲指定に変...
-
複数シートの複数列に入力され...
-
アクセスからエクセルへ出力時...
-
グラフマクロで系列を変数にす...
おすすめ情報