1

我必须多次执行 sumif 才能解决此问题。

问题:我有一张表,第一列是零件号,唯一的零件总是一样的。然而,描述 1 和描述 2 并不完美,即使对于相同的部件号(由于拼写错误等)。我需要结合不同库存的数量:V1、V2 和 V3 的数量

在此处输入图像描述

如果我使用多个 sumif 并选择描述首先出现的结果。当然,大约有 50k 行具有许多不同的 PN#。由于人为错误,使用 sumif 时经常会出现错误。

我想就这个问题寻求帮助。比较 PN#,如果它们在不同库存位置的数量总和相同,描述 1 和 2 只需选择最先出现的任何内容(如 CAR - BLACK 和 4 WHEELS)。

有一些类似的问题和答案。但是,它们不能很好地工作。 合并单元格

4

1 回答 1

1

这应该可以解决您的问题。我设置了一个带有 2 个选项卡的工作簿:RawData 和 PNTotals。我创建的数据类似于您示例中的两行。我有 26 行,有 3 个不同的 PN#:本田、丰田和起亚。无论您有多少行和 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 回答