2017-02-02 4 views
1

Ich möchte ein Makro schreiben, das Wörter in Spalte A und B liest, um zu sehen, ob sie Wörter in Spalte E übereinstimmen und bzw. F dannfügen den Wert in Spalte C-Säule G.Wenn Spalte A enthält "Spalte D" UND Spalte B enthält "Spalte E" DANN Wert hinzufügen

zum Beispiel:

enter image description here

Sie sehen können, zum Beispiel, dass es in den Spalten A und B zwei Instanzen von "Lion" und "Horse" gibt, also hat Spalte G die Summe der beiden (10 + 8 = 18).

Leider ist der Versuch machte ich nur kopiert die Werte aus Spalte C bis Spalte 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 

Ich weiß, ich bin etwas falsch mit dem „x“ (und wahrscheinlich viele andere Dinge) zu tun, aber Ich kann keinen Weg finden, es zum Laufen zu bringen. Gibt es eine Möglichkeit, dies zu ändern, so fügt es die Summen zusammen, wie es in meinem Beispielbild tut?

Vielen Dank für Ihre Hilfe.

+2

Wenn Sie verwenden können:

enter image description here

Wenn Sie wirklich in einem Makro diese haben wollen, ist es so etwas wie dieses würde eine Pivot-Tabelle, das wäre viel einfacher. – Rory

+0

Danke Rory. Eine Pivot-Tabelle funktioniert wirklich gut dafür, aber ich habe ein paar weitere Schritte und ein paar andere Spalten in meinen tatsächlichen Daten (ich habe es hier ein wenig für die Zwecke der Frage vereinfacht), die bedeuten, dass es toll wäre, wenn ich könnte stattdessen VBA verwenden. Vielen Dank für die schnelle Antwort! – Antony

+3

Was ist mit der Formel SUMIFS (in VBA falls erforderlich)? – SJR

Antwort

3

Hat es ein Makro sein? Sie könnten nur in =SUMIFS(C:C,A:A,E2,B:B,F2) in G2 setzen und füllen nach unten:

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

Ich kann nicht glauben, dass ich nicht darüber nachgedacht habe! Ich habe es wirklich übertrieben. Vielen Dank an alle für Ihre Vorschläge. – Antony

+0

@AntonyBagott keine Sorgen - manchmal starrt es Sie ins Gesicht :) – Jeremy

+0

Ich muss sagen, die Formel in VBA ist brilliant! Ich habe diese Art von Notation noch nie gesehen (ich bin relativ neu in VBA). Wenn ich dies tun müsste, hätte ich es mit etwas wie [Rorys Formel] (http: // stackoverflow) gemacht.com/a/42001419/6352151), aber das ist viel eleganter –

1

So etwas wie dies funktionieren wird, auch wenn es ein bisschen zu viel des Guten kann:

Sie verketten die ersten beiden Zellen in einem String und diese Zeichenfolge wird als Schlüssel für ein Wörterbuch verwendet. Wenn Sie etwas Ähnliches gefunden haben, fügen Sie den Wert zum Wörterbuch hinzu. Am Ende können Sie das Wörterbuch ausdrucken.

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

Das ist ein sehr langer Weg um es zu tun !! – Jeremy

+0

@ Jeremy - Wie gesagt, es ist ein bisschen übertrieben. Aber es hat seinen großen Vorteil gegenüber der Formel Lösung: Stellen Sie sich vor, Sie möchten 'LionHorse' gleichsetzen mit 'HorseLion'. Mit ein paar Zeilen mehr können Sie es leicht bekommen. – Vityata

2

Es sei denn, es gibt gute Gründe nicht zu, sollte eine einfache SUMIFS Schleife arbeiten:

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 
Verwandte Themen