0

OK、VBAマクロで助けが必要な単純な問題があります。私はこのようなExcelシートを持っています...

Product #     Count
101              1
102              1
101              2
102              2
107              7
101              4
101              4
189              9

製品番号列に基づいて「カウント」列を合計するマクロが必要です。終わったら全体的にこんな感じにしたい…

Product #    Count
101              7
102              7
107              7
189              9

私はVBAに夢中になっているので、助けがあればいいのですが。

4

6 に答える 6

3

データが列AとBにあると仮定すると、次の式でそれを行うことができます。

=SUMIF(A:A,101,B:B)

または、C1に101を入れた場合:

=SUMIF(A:A,C1,B:B)

編集

ただし、それでもVBAが必要な場合は、これが私の(迅速で汚い)提案です。辞書を使用して、各アイテムの合計を追跡します。

Sub doIt()

  Dim data As Variant
  Dim i As Long
  Dim countDict As Variant
  Dim category As Variant
  Dim value As Variant

  Set countDict = CreateObject("Scripting.Dictionary")

  data = ActiveSheet.UsedRange 'Assumes data is in columns A/B

  'Populate the dictionary: key = category / Item = count
  For i = LBound(data, 1) To UBound(data, 1)
    category = data(i, 1)
    value = data(i, 2)
    If countDict.exists(category) Then
      countDict(category) = countDict(category) + value 'if we have already seen that category, add to the total
    Else
      countDict(category) = value 'first time we find that category, create it
    End If
  Next i

  'Copy dictionary into an array
  ReDim data(1 To countDict.Count, 1 To 2) As Variant

  Dim d As Variant
  i = 1
  For Each d In countDict
    data(i, 1) = d
    data(i, 2) = countDict(d)
    i = i + 1
  Next d

  'Puts the result back in the sheet in column D/E, including headers
  With ActiveSheet
    .Range("D1").Resize(UBound(data, 1), UBound(data, 2)) = data
  End With

End Sub
于 2012-04-11T19:42:12.277 に答える
2

この場合、Timが提案したように、最も簡単なのはピボットテーブルを使用することです。

ここに画像の説明を入力してください

于 2012-04-11T20:11:00.860 に答える
1

これは、多次元配列を使用するVBAソリューションです。あなたがVBAに少し慣れていないということを知ったので、そこにいくつかの意味のあるコメントを入れようとしました。奇妙に見えるかもしれないことの1つは、配列のサイズを変更するときです。これは、多次元配列がある場合、Preserveキーワードを使用すると、配列の最後の次元のみをReDimできるためです。

これが私のデータがどのように見えたかです:

Product Count
101     1
102     1
101     2
102     2
107     7
101     4
101     4
189     9

そしてここにコードがあります。それは私の最後の答えと同じ出力を持っています。これを新しいワークブックでテストし、テストデータをヘッダー付きのSheet1に配置します。

Option Explicit

Sub testFunction()
    Dim rng As Excel.Range
    Dim arrProducts() As String
    Dim i As Long

    Set rng = Sheet1.Range("A2:A9")

    arrProducts = getSumOfCountArray(rng)

    Sheet2.Range("A1:B1").Value = Array("Product", "Sum of Count")

    ' go through array and output to Sheet2
    For i = 0 To UBound(arrProducts, 2)
        Sheet2.Cells(i + 2, "A").Value = arrProducts(0, i)
        Sheet2.Cells(i + 2, "B").Value = arrProducts(1, i)
    Next

End Sub

' Pass in the range of the products
Function getSumOfCountArray(ByRef rngProduct As Excel.Range) As String()
    Dim arrProducts() As String
    Dim i As Long, j As Long
    Dim index As Long

    ReDim arrProducts(1, 0)

    For j = 1 To rngProduct.Rows.Count
        index = getProductIndex(arrProducts, rngProduct.Cells(j, 1).Value)
        If (index = -1) Then
            ' create value in array
            ReDim Preserve arrProducts(1, i)
            arrProducts(0, i) = rngProduct.Cells(j, 1).Value ' product name
            arrProducts(1, i) = rngProduct.Cells(j, 2).Value ' count value
            i = i + 1
        Else
            ' value found, add to id
            arrProducts(1, index) = arrProducts(1, index) + rngProduct.Cells(j, 2).Value
        End If
    Next

    getSumOfCountArray = arrProducts
End Function

Function getProductIndex(ByRef arrProducts() As String, ByRef strSearch As String) As Long
    ' returns the index of the array if found
    Dim i As Long
    For i = 0 To UBound(arrProducts, 2)
        If (arrProducts(0, i) = strSearch) Then
            getProductIndex = i
            Exit Function
        End If
    Next

    ' not found
    getProductIndex = -1
End Function
于 2012-04-11T21:01:00.917 に答える
1
Sub BestWaytoDoIt()

Dim i As Long                    ' Loop Counter
Dim int_DestRwCntr As Integer    ' Dest. sheet Counter
Dim dic_UniquePrd As Scripting.Dictionary
Set dic_UniquePrd = New Scripting.Dictionary

For i = 2 To Sheet1.Range("A" & Sheet1.Cells.Rows.Count - 1).End(xlUp).Row
    If dic_UniquePrd.exist(Sheet1.Range("A" & i).Value) <> True Then
        dic_UniquePrd.Add Sheet1.Range("A" & i).Value, DestRwCntr
        sheet2.Range("A" & int_DestRwCntr).Value = Sheet1.Range("A" & i).Value
        sheet2.Range("B" & int_DestRwCntr).Value = Sheet1.Range("B" & i).Value
    Else
        sheet2.Range("A" & dic_UniquePrd.Item(Sheet1.Range("A" & i).Value)).Value = sheet2.Range("B" & dic_UniquePrd.Item(Sheet1.Range("A" & i).Value)).Value + Sheet1.Range("B" & i).Value
    End If
Next
End Sub

これは目的を果たします。覚えておくべきことは、参照で「MicrosoftScriptingRuntimes」をアクティブ化することだけです。

于 2012-08-01T15:10:16.363 に答える
0

Sub doIt()のコードに基づいて、for Each ycleで発生数も取得できますか?

例:

製品番号101には4つのオカレンスがあります

製品#102には2つのオカレンスeccがあります。

于 2013-08-06T11:13:35.770 に答える
0

遅いことはわかっていますが、列Cの値に基づいて列Bを合計することでここに来たので、そこで使用したのと同じ「式」アプローチを使用して、この実際のニーズに適合したソリューションを投稿します。

Option Explicit

Sub main()

    With ActiveSheet
        With .Range("A:B").Resize(.cells(.Rows.Count, 1).End(xlUp).row) '<== here adjust "A:B" to whatever colums range you need
            With .Offset(1).Resize(.Rows.Count - 1)
                .Offset(, .Columns.Count).Resize(, 1).FormulaR1C1 = "=SUMIF(C1,RC1,C2)" ' "helper" column: it's the 1st column right of data columns (since ".Offset(, .Columns.Count)")
                .Columns(2).Value = .Offset(, .Columns.Count).Resize(, 1).Value 'update "count" with sum-up from "helper" column

                With .Offset(, .Columns.Count).Resize(, 1) ' reference to "helper" column
                    .FormulaR1C1 = "=IF(countIF(R1C1:RC1,RC1)=1,1,"""")" ' locate Product# repetition with blank cells
                    .Value = .Value 'fix values
                    .SpecialCells(xlCellTypeBlanks).EntireRow.Delete 'delete rows corresponding to blank cells
                    .ClearContents ' clear "helper" column
                End With
            End With
        End With
    End With

    End Sub

これは「ヘルパー」列を使用します。これは、最後のデータ列に隣接する列である可能性があります(つまり、データ列が「A:B」の場合、ヘルパー列は「C」です)。

別の「ヘルパー」列が必要な場合は、それがどのように配置されているかについてのコメントを参照し、それに応じてコードを変更してください

于 2016-04-17T09:15:52.120 に答える