2017-02-02 3 views
1

Я хотел бы написать макрос, который читает слова в столбце A и B, чтобы увидеть, соответствуют ли они словам в столбце E и F соответственно, затемдобавляет значение в колонке C в колонке G.Если столбец A содержит «столбец D», а столбец B содержит «столбец E», то добавьте значение

Например:

enter image description here

Вы можете увидеть, например, что в столбцах А и В есть два экземпляра «Лев» и «Лошадь», поэтому столбец G имеет общее количество двух (10 + 8 = 18).

К сожалению, попытка я сделал только копии значения из столбца C в колонке G:

Sub CombineAnimals() 

lastRow = Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row 

For x = 1 To lastRow 
    If InStr(1, Sheets("Sheet1").Cells(x, 1), Cells(x, 5)) <> 0 _ 
    And InStr(1, Sheets("Sheet1").Cells(x, 2), Cells(x, 6)) <> 0 Then 
     Sheets("Sheet1").Cells(x, 7).Value = _ 
     Sheets("Sheet1").Cells(x, 7).Value + Cells(x, 3) 
    End If 
Next x 

End Sub 

Я знаю, что я делаю что-то не так с «х» (и, возможно, многое другое), но Я не могу понять, как заставить его работать. Есть ли способ изменить это, поэтому он объединяет итоговые суммы, как в примере с моим примером?

Большое спасибо за помощь.

+2

Если вы можете использовать сводная таблица, это было бы намного проще. – Rory

+0

Спасибо, Рори. Сводная таблица работает очень хорошо для этого, но у меня есть еще несколько шагов и несколько других столбцов в моих фактических данных (я упростил это немного здесь для целей вопроса), что означает, что было бы здорово, если бы я вместо этого можно использовать VBA. Большое спасибо за быстрый ответ! – Antony

+3

Как насчет формулы SUMIFS (при необходимости VBA)? – SJR

ответ

3

ли это быть макрос? вы можете просто положить в =SUMIFS(C:C,A:A,E2,B:B,F2) в G2 и заполнить вниз:

enter image description here

Если вы действительно хотите иметь это в макросе, это было бы что-то вроде этого:

Sub CombineAnimals() 

    Range("G2").FormulaR1C1 = "=SUMIFS(C[-4],C[-6],RC[-2],C[-5],RC[-1])" 
    Range("G2").AutoFill Destination:=Range("G2:G" & Range("F" & ActiveSheet.Cells.Rows.Count).End(xlUp).Row) 

End Sub 
+0

Не могу поверить, что я не думал об этом! Я действительно переусердствовал. Большое спасибо всем за ваши предложения. – Antony

+0

@ AntonyBagott не беспокоится - иногда он смотрит вам в лицо :) – Jeremy

+0

Надо сказать, что формула в VBA блестящая! Я никогда не видел таких обозначений раньше (я относительно новичок в VBA). Если бы мне пришлось это сделать, я бы сделал это с чем-то вроде [формулы Рори] (http: // stackoverflow.com/a/42001419/6352151), но это намного более элегантно –

1

Что-то, как это будет работать, хотя это может быть немного излишним:

Вы конкатенировать первые две ячейки в строке и эта строка используется в качестве ключа для словаря. Затем, когда будет найдено что-то подобное, вы добавляете его значение в словарь. В конце вы можете распечатать словарь.

Option Explicit 

Public Sub TestMe() 

    Dim dict   As Object 
    Dim rngCell   As Range 

    Dim rngInput  As Range 
    Dim strInput  As String 
    Dim dblInput  As Double 
    Dim lngCounter  As Long 
    Dim varKey   As Variant 

    Set dict = CreateObject("Scripting.Dictionary") 
    Set rngInput = ActiveSheet.Range("A2:A6") 


    For Each rngCell In rngInput 
     strInput = rngCell.Value & rngCell.Offset(0, 1).Value 
     dblInput = rngCell.Offset(0, 2).Value 

     If dict.exists(strInput) Then 
      dict(strInput) = dict(strInput) + dblInput 
     Else 
      dict.Add strInput, dblInput 
     End If 
    Next rngCell 


    For Each varKey In dict.keys 
     Debug.Print varKey, dict(varKey) 
    Next varKey 


End Sub 
+0

Это ОЧЕНЬ долгий путь вокруг этого! – Jeremy

+0

@Jeremy - Как я уже сказал, это немного перебор. Но у него есть BIG CONS для решения формулы: представьте, что вы хотите лечить 'LionHorse' равным« HorseLion ». С несколькими строками вы можете легко получить это. – Vityata

2

Если нет причин не, простой цикл SUMIFS должен работать:

Sub CombineAnimals() 
With Sheets("Sheet1") 
    lastRow = .Range("E" & .Rows.Count).End(xlUp).Row 

    For x = 2 To lastRow 
     .Cells(x, "G").Value = Application.SumIfs(.Range("C:C"), .Range("A:A"), .Cells(x, "E"), .Range("B:B"), .Cells(x, "F")) 
    Next x 
End With 
End Sub 
Смежные вопросы