Ich habe drei Blätter: "bom", "MPS" und "DData". Was ich versuche zu tun ist, zuerst den Wert von Zelle A2 von "MPS" zu lesen und alle Zeilen von "bom", die in Spalte A diesen Wert haben, abzurufen und sie in "DData" aufzulisten.
Gleichzeitig brauche ich die Werte in Spalte C und D von "MPS", um zu den entsprechenden Zeilen abgerufen zu werden. Wenn also der Wert in "MPS" -Zelle A2 mit 4 Zeilen in "bom" übereinstimmt, sollten die Werte aus den Zellen C2 und D2 nach diesen 4 Zeilen gesetzt werden. Das funktioniert im Moment nicht richtig.
Sobald diese Schleife beendet ist, sollte sie auf den Zellenwert A3 in "MPS" weitergehen und so weiter ... Der folgende Code funktioniert einigermaßen. Ich habe versucht, eine zweite for-Schleife und alles andere hinzuzufügen, was mir in den Sinn kam, aber ohne viel Glück. Das größte Problem ist, dass wenn MPS!A2
hat wert 1, A3
= 2 und A4
ist wieder 1, listet die Werte von "bom" nicht ein zweites Mal auf.
Der Code basiert ursprünglich auf: https://stackoverflow.com/a/26912176
Public Sub CommandButton1_Click()
Dim countRows1 As Long, countRows2 As Long
countRows1 = 2 'the first row of your dataset in sheet1
endRows1 = 50 'the last row of your dataset in sheet1
countRows2 = 2 'the first row where you want to start writing the found rows
For j = countRows1 To endRows1
Dim keyword As String: keyword = Sheets("MPS").Cells("A2, A100").Value
If Sheets("bom").Range("A2, A100").Value = keyword Then
Sheets("DData").Rows(countRows2).Value = Sheets("bom").Rows(j).Value
Sheets("DData").Rows(countRows2).Cells(6).Value = Sheets("MPS").Rows(countRows2).Cells(3).Value
Sheets("DData").Rows(countRows2).Cells(7).Value = Sheets("MPS").Rows(countRows2).Cells(4).Value
countRows2 = countRows2 + 1
End If
Next j
End Sub
Meiner Meinung nach braucht dies definitiv zwei Schleifen, aber ich konnte es einfach nicht zum Laufen bringen.
Ich kann keine Bilder posten, aber ich werde versuchen zu veranschaulichen, was benötigt wird und was unten besser passiert.
Blatt "bom" Struktur und Daten (Bereich A1: E7):
id desc id_part desc_part qty
30010 build1 10200 part1 1
30010 build1 23002 part2 3
30010 build1 21003 part3 500
30010 build1 21503 part4 400
20010 build2 10210 part5 100
20010 build2 10001 part6 5
Blatt "MPS" Struktur und Daten (Bereich A1: D4):
id desc week batches
30010 build1 1 2
20010 build2 2 4
30010 build1 2 0
Blatt "Daten" Struktur (Bereich A1: H3) und was mit Ihrem Code Panhandle zurückgegeben wird
id desc id_part desc_part qty week batches total(=qty*batches)
30010 1 2
30010 2 0
Und mein Ziel ist folgendes:
id desc id_part desc_part qty week batches total (=qty*batches)
30010 build1 10200 part1 1 1 2
30010 build1 23002 part2 3 1 2
30010 build1 21003 part3 500 1 2
30010 build1 21503 part4 400 1 2
20010 build2 10210 part5 100 2 4
20010 build2 10001 part6 5 2 4
30010 build1 10200 part1 1 2 0
30010 build1 23002 part2 3 2 0
30010 build1 21003 part3 500 2 0
30010 build1 21503 part4 400 2 0
... auch wenn H2 zum Beispiel den Wert E2 * G2 haben würde.
*** Ich habe versucht mich zu ändern
Sheets("DData").Range("A" & countRows2).Value = Sheets("bom").Range("A" & lCount).Value
zu
Sheets("DData").Rows(countRows2).Value = Sheets("bom").Rows(lCount).Value
zum Beispiel, aber Excel stürzte heftig ab. Ist es sinnvoller, Range anstelle von Rows zu verwenden?
quelle
Antworten:
BEARBEITET: Eine Schleife durchläuft Zeile für Zeile die MPS-Spalte A, die zweite Schleife vergleicht jeden MPS-Spalte-A-Wert mit allen "bom" -Spalte-A-Werten. Sobald eine Übereinstimmung gefunden wurde, wird jede einzelne Zelle in das DData-Blatt kopiert (ich bin mir sicher, es gibt eine schnellere Möglichkeit, dies zu tun, aber dies zeigt, was gut läuft), und in Spalte H wird eine Formel zur Berechnung Ihrer Gesamtsumme abgerufen.
Die Registerkarten sind die gleichen wie die, die Sie jetzt haben, und führen dazu, was Sie erwarten / brauchen.
quelle
Run-time error '1004': Methor 'Intersect' of object '_Global' failed
von der LinieSet MPSRng = Intersect(Columns("A").Cells, Worksheets("MPS").UsedRange)
undSet bomRng = Intersect(Columns("A").Cells, Worksheets("bom").UsedRange)
aber korrigiert, indem Sie sie schreibenSet MPSRng = Intersect(Worksheets("MPS").Columns("A").Cells, Worksheets("MPS").UsedRange)
undSet bomRng = Intersect(Worksheets("bom").Columns("A").Cells, Worksheets("bom").UsedRange)
- Ist das der richtige Weg?