プロが教えるわが家の防犯対策術!

追記する列を増やしたい
2つのデータを検索・照合して元データにないデータを下記マクロで商品名を追記しています。今回、図にあるJ列のコードもA列へ追記したいのですがどう記述したら良いかわかりません。助けてください。
 Dim I, L, lRow, mRow As Long
Dim CheckCells As Range
With ActiveSheet
lRow = .Cells(Rows.Count, "E").End(xlUp).Row 'A列の最終行を取得します。(元データ)
mRow = .Cells(Rows.Count, "K").End(xlUp).Row 'K列の最終行を取得します。(追記対象データ)
L = lRow + 1 '追記行を求める(E列最終行+1)
For I = 2 To mRow '追記対象データ分繰り返す(最終行まで)
Set CheckCells = .Range("E:E").Find(.Cells(I, "K")) 'E列全てに対してN列の追記対象データを1件ずつ照合する。
If CheckCells Is Nothing Then 'データが無ければ追記対象データをE列の最終行に追記します
.Cells(L, "E") = .Cells(I, "K")
L = L + 1 'E列の追記行に+1を加算する。
End If
Next I
End With

「追記する列を増やしたい 2つのデータを検」の質問画像

A 回答 (9件)

安全運転なので(多分)遅いかもですがご参考程度に。



Sub try()
Dim myDic As Object
Dim ra As Range, rj As Range
Dim st As String

Set myDic = CreateObject("Scripting.Dictionary")

For Each rj In Range("J3", Cells(Rows.Count, "J").End(xlUp))
st = Join(Array(rj.Range("A1").Value, rj.Range("B1").Value), "_")
If Not myDic.exists(st) Then _
myDic.Add st, Array(rj.Range("A1").Value, rj.Range("B1").Value)
Next

For Each ra In Range("A3", Cells(Rows.Count, "A").End(xlUp))
st = Join(Array(ra.Range("A1").Value, ra.Range("E1").Value), "_")
If myDic.exists(st) Then myDic.Remove (st)
Next

If myDic.Count > 0 Then
With Cells(Rows.Count, "A").End(xlUp).Offset(1)
.Range("A1").Resize(myDic.Count, 1).Value = WorksheetFunction.Index(myDic.Items, 0, 1)
.Range("E1").Resize(myDic.Count, 1).Value = WorksheetFunction.Index(myDic.Items, 0, 2)
End With
End If

Set myDic = Nothing

End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。助かりました。

お礼日時:2022/10/07 12:23

No7です。


一から作り直しになりますが、以下のようにしてください。
標準モジュールに登録してください。

Option Explicit
Public Sub 商品追記()
Dim dicT As Object
Dim maxrow1 As Long
Dim maxrow2 As Long
Dim row1 As Long
Dim row2 As Long
Dim key As String
Dim ws As Worksheet
Set ws = ActiveSheet
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
maxrow1 = ws.Cells(Rows.Count, "A").End(xlUp).Row 'A列の最大行取得
maxrow2 = ws.Cells(Rows.Count, "J").End(xlUp).Row 'J列の最大行取得
For row1 = 3 To maxrow1
key = ws.Cells(row1, "A").Value & "|" & ws.Cells(row1, "E").Value
dicT(key) = True
Next
row1 = maxrow1 + 1
For row2 = 3 To maxrow2
key = ws.Cells(row2, "J").Value & "|" & ws.Cells(row2, "K").Value
If dicT.exists(key) = False Then
ws.Cells(row1, "A").Value = ws.Cells(row2, "J").Value
ws.Cells(row1, "E").Value = ws.Cells(row2, "K").Value
dicT(key) = True
row1 = row1 + 1
End If
Next
MsgBox ("完了")
End Sub
    • good
    • 7
この回答へのお礼

ありがとうございます。勉強させていただきます。

お礼日時:2022/10/07 12:24

1.比較するときに、品名だけではなく、コード+品名で比較して、


左側の表にないものを追記していけば良いと思いますがいかがでしょうか。

2.提示されたマクロをみると、右側の表の開始は2行目のようになってますが、3行目から開始で間違いないでしょうか。

以下のマクロは2行目から処理を行っています。
>For I = 2 To mRow '追記対象データ分繰り返す(最終行まで)
    • good
    • 3
この回答へのお礼

ありがとうございます。
1. コード+品名で比較したいです。
2 .For I = 3 To mRowの間違いでした。

お礼日時:2022/10/06 12:34

No.4です。



『当月追記対象』のJ・K列のデータは、無論前月のデータは存在せず翌月になれば当月のデータは削除される。
と考えて宜しいのでしょうか?

なので当月については既に左の表に存在するかもしれないし、存在しないかも知れない。
またコードを基準とした並び替えも月毎に必要なのでしょうか?
それとも他のデータを入力?した後に手作業と言う感じなどですか?
    • good
    • 2
この回答へのお礼

>翌月になれば当月のデータは削除されます。
> 存在するかもしれないし、存在しないかも知れません。
> コードを基準とした並び替えも月毎必要です。これは一旦確認したいので最終行を目視で確認し手作業で行いたいです。よろしくお願いします。

お礼日時:2022/10/05 16:09

No1です。



>件数が少なく手修正しておりました。
ご質問の本文とは異なる内容に見受けられます。

ご質問文がなさりたいことなら、NO1の回答で。
補足の方が本当にやりたいことなら、商品コードをIDとして用いるのが正でしょうから、現状のコードのA,E列、J,K列を入れ替えれば済む話と思います。
コードを修正するのが嫌なら、シート側の列を入替えておけば、そのままでも利用できるでしょう。
    • good
    • 0
この回答へのお礼

お考えいただきありがとうございます。現状のコードのA,E列、J,K列を入れ替えてみましたがやり方が悪いのかこーA列のコードは空欄でした。

お礼日時:2022/10/05 16:11

No.2です。



>件数が少なく手修正しておりました。今回対象が増え自動化できないか模索しています。

自動化された後でNo.2のように品名が同じでコード違いって起こりうる可能性は如何なものでしょう?
あり得るか否かで変わるかと。。。
    • good
    • 0
この回答へのお礼

深くお考えいただきありがとうございます。目先しか考えておりませんでしたが、同じ品名でコード違いは稀ですが起こります。よとしくお願いします。

お礼日時:2022/10/05 14:40

No.2です。



私にはわかりませんが別の回答がついているようですけど、そちらは如何な感じなのでしょうか?
    • good
    • 0

画像を見ると『品名』が同じでも『コード』が違うケースがありますが、チェックの際に品名だけを行なっていると、6行目の『なし』については4行目に存在するので、コード違いの同品名が追加されているのは何故かなと気になりました。


⇒手修正で追加ですかね?
    • good
    • 0
この回答へのお礼

件数が少なく手修正しておりました。今回対象が増え自動化できないか模索しています。

お礼日時:2022/10/05 12:05

こんにちは



>図にあるJ列のコードもA列へ追記したいのですがどう記述したら良いかわかりません。
いったいどうやってご提示のコードを作成したのかわかりませんkねれど・・・

>.Cells(L, "E") = .Cells(I, "K")
でK列の値を、E列に追記しているのですから、同じ行に対して、J列の値をA列に記入すれば良いだけではないのでしょうか?
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!