Сумма значений в столбце A на основе строковых критериев в столбце B - PullRequest
1 голос
/ 13 июля 2020

У меня есть следующие столбцы:

A       B
23      75001
42      94
1       13
3       75002
4       12

Я хотел бы суммировать значения столбца A, если две первые цифры числа в столбце B совпадают с 75 или 12.

В этом примере результат будет 23 + 3 + 4 = 30.

Я пытался использовать =SUMIFS, но похоже, что я могу использовать только критерии, основанные на целых числах ...

У вас есть идеи, как это сделать?

РЕДАКТИРОВАТЬ: я пытаюсь создать макрос VBA

Ответы [ 3 ]

3 голосов
/ 13 июля 2020

Один вариант с использованием СУММПРОИЗВ:

=SUMPRODUCT(A1:A5*((--LEFT(B1:B5,2)=75)+(--LEFT(B1:B5,2)=12)))

введите описание изображения здесь

Аналогично, используя FILTER, если у вас есть доступ к нему:

=SUM(FILTER(A1:A5,((--LEFT(B1:B5,2)=75)+(--LEFT(B1:B5,2)=12))))

Еще короче:

=SUMPRODUCT(A1:A5*(LEFT(B1:B5,2)={"75","12"}))

или если вы не хотите чтобы заключить числа в кавычки

=SUMPRODUCT(A1:A5*(--LEFT(B1:B5,2)={75,12}))

, хотя сохранение кавычек вокруг 75 и 12 является лучшим подходом, если у вас есть одна или несколько пустых ячеек в B1: B5.

1 голос
/ 13 июля 2020

Вы можете использовать:

=SUMPRODUCT(IF(ISNUMBER(SEARCH({"|75";"|12"},"|"&B1:B5)),A1:A5,0))

Хотя, если бы у вас был ExcelO365, вы могли бы использовать вместо него SUM(). Если вам нужно, чтобы это был VBA, вы можете легко использовать c. Не позволяйте ошибаться, другой ответ - метод go -to, однако таким образом вы можете легко добавить дополнительные критерии, если это необходимо. используйте массив и Select Case, если вам нужно будет добавить дополнительные критерии в будущем:

Sub Test()

Dim lr As Long, x As Long, sm As Double, arr As Variant
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sheet1")

With ws
    lr = .Cells(.Rows.Count, 2).End(xlUp).Row
    arr = .Range("A1:B" & lr).Value
    For x = LBound(arr) To UBound(arr)
        Select Case Left(arr(x, 2), 2)
            Case "75", "12": sm = sm + arr(x, 1)
        End Select
    Next
    Debug.Print sm
End With

End Sub
0 голосов
/ 13 июля 2020

Попробуйте, пожалуйста, следующую функцию:

Function countOccLeft(arr As Variant, Cr1 As String, Cr2 As String) As Long
   Dim dict As Object, i As Long: Set dict = CreateObject("Scripting.Dictionary")
   
   For i = 1 To UBound(arr)
     If Left(arr(i, 2), 2) = Cr1 Or Left(arr(i, 2), 2) = Cr2 Then
        If Not dict.Exists("key_sum") Then
            dict.Add "key_sum", arr(i, 1)
        Else
            dict("key_sum") = dict("key_sum") + arr(i, 1)
        End If
     End If
   Next i
   countOccLeft = dict("key_sum")
End Function

Ее можно вызвать так:

Sub testCountOccL()
  Dim sh As Worksheet, arr As Variant, strSearch As String, lastRow As Long
  
   Set sh = ActiveSheet
   lastRow = sh.Range("A" & Rows.Count).End(xlUp).Row
   arr = sh.Range("A2:B" & lastRow).Value
   
   Debug.Print countOccLeft(arr, "75", "12")
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...