1

この問題を解決するには、sumif を複数回実行する必要があります。

問題: 部品番号が最初の列のテーブルがあり、固有の部品は常に同じです。ただし、説明1と説明2は、同じ部品番号であっても(タイプミスなどにより)完全ではありません。異なる在庫の数量を組み合わせる必要があります: QTY AT V1、V2、および V3

ここに画像の説明を入力

複数の sumif を使用して説明を選択した場合の結果が最初に表示されます。もちろん、多くの異なる PN# を持つ行が 50k ほどあります。ヒューマンエラーにより、sumif を使用するとエラーが発生することがよくあります。

この点について、助けを求めたいと思います。異なる在庫場所の数量の合計が同じ場合、PN# を比較します。説明 1 と 2 は、最初に表示されるものを選択します (CAR - BLACK と 4 WHEELS など)。

これと似たような質問と回答がいくつかあります。ただし、うまく機能しません。 セルを結合します

4

1 に答える 1

1

これで問題が解決するはずです。RawData と PNTotals の 2 つのタブを持つワークブックをセットアップしました。例の 2 つの行に似たデータを作成しました。ホンダ、トヨタ、起亜の 3 つの異なる PN 番号を持つ 26 行があります。このコードは、行と PN 番号の数に関係なく機能します。

以下のコードを実行すると、PNTotals タブの PN ごとの合計が次のようになります。

HONDA   CAR - BLACK   4 WHEELS        936   516 2214
TOYOTA  CAR                           864   414 2079
KIA     CAR - RED     SPORT PACKAGE   504   204 1234

これを機能させるには、次のコードをモジュールに追加し、 sub を実行しますDispatchTotalsByPNNumber()

Option Explicit

Sub DispatchTotalsByPNNumber()
    Dim LastPN As Long

    LastPN = Sheets("RawData").Range("A1").End(xlDown).Row

    GetDistinctListOfPNNumbers (LastPN)
    GetQuantityTotalsForEachPNNumber (LastPN)

End Sub
Sub GetDistinctListOfPNNumbers(ByVal LastPN As Long)

    Sheets("PNTotals").Cells.Clear
    Sheets("RawData").Range("A2:A" & LastPN).Copy Sheets("PNTotals").Range("A1")
    Sheets("PNTotals").Range("a:a").RemoveDuplicates Columns:=1, Header:=xlNo
End Sub
Function DescCols(ByVal LastPN As Long) As Integer
    Dim i As Integer

    For i = 2 To 10 ' If you ever have more than 9 description columns, increase range here
         If Not IsNumeric(Cells(Cells(LastPN + 1, i).End(xlUp).Row, i)) Then
            DescCols = DescCols + 1
        Else
            Exit Function
        End If
    Next i
End Function

Sub GetQuantityTotalsForEachPNNumber(ByVal LastPN As Long)
    Dim i As Long
    Dim x As Integer
    Dim TotCols As Integer
    Dim PNN As String
    Dim ThisColumn As String
    Dim PNCount As Integer

    TotCols = Sheets("RawData").Range("A1").End(xlToRight).Column
    PNCount = 1
    ' get count of PN#s if there are more than 1
    If Sheets("PNTotals").Range("A2").Value <> "" Then
        PNCount = Sheets("PNTotals").Range("a1").End(xlDown).Row
    End If

    For i = 1 To PNCount
        PNN = Sheets("PNTotals").Range("A" & i).Value
        Sheets("RawData").Select
        Sheets("RawData").Range("A1").Select
        Sheets("RawData").Cells.Find(What:=PNN, after:=ActiveCell, searchorder:=xlByRows).Activate

        ' Copy description text from first instance of pn to total sheet for all description columns
        For x = 1 To DescCols(LastPN)
            Sheets("PNTotals").Cells(i, x + 1).Value = ActiveCell.Offset(, x).Value
        Next
        For x = x + 1 To TotCols
            ThisColumn = GetColumnLetter(x)
        ' set sumif formulas for however many quantity columns we have
        Sheets("PNTotals").Range(ThisColumn & i).Formula = "=SUMIF(RawData!A2:" & ThisColumn & LastPN & ",PNTotals!A" & i & ",RawData!" & ThisColumn & "2:" & ThisColumn & LastPN & ")"

        Next
    Next
End Sub

Function GetColumnLetter(ByVal ColNum As Integer) As String

    GetColumnLetter = Left(ActiveSheet.Cells(1, ColNum).Address(False, False), (ColNum <= 26) + 2)

End Function

注:生データは RawData シートのセル A1 から始まり、空白の PN 番号がないことを前提としています。空白がある場合は、最後の PN 行を別の方法で決定する必要があります。

于 2012-05-28T04:39:49.493 に答える