0

以下に添付されているのは、私がここで話していることを示すシートです。しかし、これは私が探しているものです。Finalのシートでわかるように、すべてのリストがきれいな順序で表示されます。

これがエンド ユーザーに表示されます。場合によっては、Orig のようなドキュメントが送られてきて、新しい行があればインポートする必要があります。私が気づいたのは、セリフはほぼ同じですが、クライアントのコメントが異なるということです。

また、Final シートでコメントが赤字で入力されているため、すべてをコピーして置き換えることはできません。私がやりたいことは、クライアントのコメントと必要な出荷日だけを置き換えることです.

発注書、部品、説明を参照点として参照し、クライアントのコメントと必要な出荷日を新しいものに置き換えます。変更がない場合でも、引き続きお願いします。念のためのシナリオとして置き換えました。

誰かが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 の概念ではなく、2 つの個別のセルが一緒になっていないという問題に直面しています。

私が探している結果を得るために、このスクリプトまたはそれに似た別のスクリプトを使用する方法はありますか?

ご提供いただける場合は、事前にご協力いただきますようお願いいたします。

サンプルシート

4

2 に答える 2

1

解決しました。

私が望んでいた方法ではなく、少し違うことをしましたが、それが最も簡単な答えです。最後のタブのデータの最後に 2 つのセルを追加しました。

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 行の答えです。2 つのシート「Final」と「Orig」の列定義に合わせて Enum を維持する必要があります。また、範囲定義 (シート名など) を変更する必要がある場合があります。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 に答える