これで問題が解決するはずです。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 行を別の方法で決定する必要があります。