Vba 与Sum宏抗争

Vba 与Sum宏抗争,vba,excel,Vba,Excel,因此,我有一个宏,它将我复制的发票复制到工作表中,然后复制保费金额并将其粘贴到单元格中的摘要选项卡上,该选项卡与两张工作表上相同的社会保险号对应。以下是宏: Sub Eyemed2() Dim rw, LastRow, LastRRow As Long Dim rng As Range, Found As Range, SheetEnd3 As Range Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = Sheets("Eyemed 2") Se

因此,我有一个宏,它将我复制的发票复制到工作表中,然后复制保费金额并将其粘贴到单元格中的摘要选项卡上,该选项卡与两张工作表上相同的社会保险号对应。以下是宏:

Sub Eyemed2()
Dim rw, LastRow, LastRRow As Long
Dim rng As Range, Found As Range, SheetEnd3 As Range
Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = Sheets("Eyemed 2")
Set ws2 = Sheets("Raw")
LastRow = ws2.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Row
Set rng = ws2.Range("A2:B" & LastRow)    
LastRRow = ws1.Cells(Rows.Count, "R").End(xlUp).Row
For rw = 14 To LastRRow     'Begin in row 14 of Eyemed 2
    If Not ws1.Range("R" & rw) Is Nothing Then    
is blank
        Set Found = rng.Find(What:=ws1.Range("A" & rw).Value, 
LookIn:=xlValues)
        If Not Found Is Nothing Then
            ws2.Range("N" & Found.Row) = ws1.Cells(rw, "J").Value

        Else
            Set SheetEnd3 = rng.Find(What:=ws1.Range("A" & rw).Value, 
      LookIn:=xlValues)
            LastRow = ws2.Cells(Rows.Count, "B").End(xlUp).Offset(1, 0).Row
            ws1.Range("A" & rw).Copy ws2.Range("B" & LastRow)
            ws2.Range("N" & SheetEnd3.Row) = ws1.Cells(rw, "J").Value

        End If
    End If
Next rw
End Sub
因此,它查看“Eyemed 2”中的R列,如果它不是空的,则将N列中的单元格复制到摘要选项卡的J列中。它通过搜索摘要选项卡A:B列中“Eyemed 2”的A列中的社会保险号,找到要粘贴到摘要选项卡中的相应行

我的问题是在“Eyemed 2”中,一些社会保险号码不止一次地以两种不同的金额列出。因此,我需要编辑宏,将所有具有相同社会保险号码的金额相加,然后在摘要选项卡中搜索并粘贴到一个条目中,而不是现在只复制并粘贴一个金额


非常感谢

如果有多个匹配项,则只剩下最后找到的值:

ws2.Range("N" & Found.Row) = ws1.Cells(rw, "J").Value
…但这会将每个值添加到任何以前的值中

With ws2.Range("N" & Found.Row)
    .Value = .Value + ws1.Cells(rw, "J").Value
End with

如果您正在录制宏,请使用“FindNext”,这是下一步。我建议您发布数据的屏幕截图。使用
SUMIF
公式似乎更容易完成这项任务。您可以使用一些选项来完成这项任务,这取决于您对Excel和VBA的舒适程度。在不太高级的一端,只需使用一个数据透视表,其中SSN为行,总计为值。然后你可以用一个类似的方法来计算你所拥有的,它会给你准确的总数。另一方面,更高级的方法是使用Scripting.Dictionary对象。鉴于您当前的代码,我强烈推荐前一种方法。从短期来看,这对你来说会更容易。
如果不是ws1.Range(“R”和rw)什么都不是
在这里,你要测试的是范围是否是一个对象-这将始终是
真的
。也许你的意思是
如果Len(ws1.Range(“R”)和rw.Value)>0,那么