0

下面附上一张表,它将显示我在这里所说的内容。但这就是我要找的。正如您在 Final 中的表格中看到的那样,所有列表都以整齐的顺序显示。

这是最终用户看到的。现在在某些情况下,当像 Orig 这样的文档发送给我时,如果有的话,我需要导入新行。我一直注意到的是,虽然这条线几乎完全相同,但客户的评论却不同。

并且由于我们在最终表上以红色输入评论的方式,我无法复制和替换所有内容。我想要做的只是替换客户评论和所需的发货日期。

我想把PO、Part和Description作为参考点,然后用新的替换客户评论和要求的发货日期,即使没有变化,我仍然希望有它被替换为以防万一。

有人可以给我看一个 VBA 中的脚本可以做到这一点吗?

我想过使用这样的东西来做到这一点:

With Intersect(wsJL.UsedRange, wsJL.Columns("Q"))
        .AutoFilter 1, "<>Same"
        With Intersect(.Offset(2).EntireRow, .Parent.Range("B:U"))
            .Copy wsJAR.Cells(Rows.Count, "B").End(xlUp).Offset(1)
            .EntireRow.Delete
        End With
        .AutoFilter
    End With

但是我遇到了一个问题,这不是 EntireRow 概念,而是两个单独的单元格不在一起,否则对我来说会容易得多。

有没有办法使用这个脚本或其他类似的脚本来获得我正在寻找的结果?

如果您能提供任何帮助,请提前感谢您的帮助。

示例表

4

2 回答 2

1

解决了。

做了一些不同的事情,不是我想要的,但这是最简单的答案。在最终选项卡的数据末尾添加了两个单元格:

对于 O2-O4

=IFERROR(INDEX(Orig!$J$2:$J$4,MATCH(1,INDEX((Orig!$B$2:$B$4=$A2)*(Orig!$D$2:$D$4=$B2),0),0)),"")

对于 P2-P4

=IFERROR(INDEX(Orig!$E$2:$E$4,MATCH(1,INDEX((Orig!$B$2:$B$4=$A2)*(Orig!$D$2:$D$4=$B2),0),0)),"")

然后创建了一个新脚本:

Option Explicit

Sub One()

    Dim wsFIN As Worksheet 'Final
    Dim wsORI As Worksheet 'Original
    Dim lastrow    
    Set wsFIN = Sheets("Final")
    Set wsORI = Sheets("Orig")

        lastrow = wsFIN.Range("B" & Rows.Count).End(xlUp).Row
        wsFIN.Range("O2:P" & lastrow).Copy wsFIN.Range("I2:J" & lastrow)
        wsFIN.Range("I2:J" & lastrow).Borders.Weight = xlThin
        wsFIN.Range("I2:J" & lastrow).Font.Size = 12
        wsFIN.Range("I2:J" & lastrow).Font.Name = "Calibri"

End Sub

它有效,但我希望有一些更清洁的东西。这是最终结果。

解决方案

于 2012-09-26T14:19:06.763 回答
0

好吧,如果我了解您的要求,那么这个问题没有简单的 4 行答案。但这是一个简单的 90 行答案。您需要使枚举与您的两张纸“Final”和“Orig”上的列定义保持一致。您可能需要更改范围定义(工作表名称等)。您需要执行 VBE Menu/Tools/References 并检查“Microsoft Scripting Runtime”以获取字典对象。对不起,如果它看起来罗嗦,但它应该很容易维护。

Option Explicit

' This is the definition of the columns on "Final" sheet
Enum final_record
    fr_partid
    fr_descr
    fr_vendorid
    fr_po
    fr_due
    fr_quantdue
    fr_status
    fr_orig
    fr_desired
    fr_comment
    fr_dayslate
    fr_pri
    fr_shoporder
    fr_remarks
    fr_end
End Enum

' This is the definition of the columns on "Orig" sheet
Enum orig_record
    or_po
    or_partid
    or_vendorid
    or_descr
    or_comment
    or_status
    or_quant
    or_balance
    or_orig
    or_requested
    or_end
End Enum

Sub UpdateDescrAndShipDate()
' Update comments and required ship date if matches po/partid/description.
' Else add a new row.
Dim lRows As Long, lRow As Long, rFinal As Range, rOrig As Range, sKey As String
Dim lTarget As Long, lNew As Long
Dim dictTarget As New Scripting.Dictionary

' Get Final rows into dict by key
    Set rFinal = Worksheets("Final").Range("A1")

    lRows = rFinal.Offset(65000, 0).End(xlUp).Row - rFinal.Row
    For lRow = 1 To lRows
        sKey = rFinal.Offset(lRow, fr_po).Value & "|" & _
               rFinal.Offset(lRow, fr_partid).Value & "|" & _
               rFinal.Offset(lRow, fr_descr).Value

        If Not dictTarget.Exists(sKey) Then
            dictTarget.Add sKey, lRow
        Else
            MsgBox "Invalid duplicate key? " & sKey
        End If
    Next
    lNew = lRows

' Run through Orig rows, and write to Orig based on key value
    Set rOrig = Worksheets("Orig").Range("A1")

    lRows = rOrig.Offset(65000, 0).End(xlUp).Row - rOrig.Row

    For lRow = 1 To lRows
        sKey = rOrig.Offset(lRow, or_po).Value & "|" & _
               rOrig.Offset(lRow, or_partid).Value & "|" & _
               rOrig.Offset(lRow, or_descr).Value

        If dictTarget.Exists(sKey) Then
' update
            lTarget = dictTarget(sKey)
            rFinal.Offset(lTarget, fr_comment).Value = rOrig.Offset(lRow, or_comment).Value
            rFinal.Offset(lTarget, fr_desired).Value = rOrig.Offset(lRow, or_requested).Value
        Else
' new row
            lNew = lNew + 1
            rFinal.Offset(lNew, fr_partid).Value = rOrig.Offset(lRow, or_partid)
            rFinal.Offset(lNew, fr_descr).Value = rOrig.Offset(lRow, or_descr)
            rFinal.Offset(lNew, fr_vendorid).Value = rOrig.Offset(lRow, or_vendorid)
            rFinal.Offset(lNew, fr_po).Value = rOrig.Offset(lRow, or_po)
            rFinal.Offset(lNew, fr_due).Value = rOrig.Offset(lRow, or_balance)
            rFinal.Offset(lNew, fr_quantdue).Value = rOrig.Offset(lRow, or_orig)
            rFinal.Offset(lNew, fr_status).Value = rOrig.Offset(lRow, or_status)
            rFinal.Offset(lNew, fr_orig).Value = ""
            rFinal.Offset(lNew, fr_desired).Value = rOrig.Offset(lRow, or_requested)
            rFinal.Offset(lNew, fr_comment).Value = rOrig.Offset(lRow, or_comment)
            rFinal.Offset(lNew, fr_dayslate).Value = ""
            rFinal.Offset(lNew, fr_pri).Value = ""
            rFinal.Offset(lNew, fr_shoporder).Value = ""
            rFinal.Offset(lNew, fr_remarks).Value = ""
        End If
    Next

End Sub
于 2012-09-26T14:26:33.070 回答