Ich habe drei Blätter: „bom“, „MPS“ und „DData“. Ich versuche, zuerst den Wert der Zelle A2 aus „MPS“ zu lesen und alle Zeilen aus „bom“ abzurufen, die in Spalte A diesen Wert haben, und sie in „DData“ aufzulisten.
Gleichzeitig müsste ich die Werte in Spalte C und D von „MPS“ in die entsprechenden Zeilen holen. Wenn also der Wert in Zelle A2 von „MPS“ mit 4 Zeilen in „bom“ übereinstimmt, sollten die Werte aus den Zellen C2 und D2 nach diesen 4 Zeilen eingefügt werden. Das funktioniert im Moment nicht richtig.
Sobald diese Schleife abgeschlossen ist, sollte sie zum Zellenwert A3 in „MPS“ übergehen und so weiter … Der folgende Code funktioniert einigermaßen. Ich habe versucht, eine zweite For-Schleife und alles andere hinzuzufügen, was mir einfiel, aber ohne Erfolg. Das größte Problem ist, dass, wenn MPS!A2
der Wert 1, A3
= 2 und A4
wieder 1 ist, die Werte aus „bom“ nicht ein zweites Mal aufgelistet werden.
Der Code basiert ursprünglich darauf: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
Mein Verstand sagt mir, dass dafür definitiv zwei Schleifen nötig sind, aber ich habe es einfach nicht zum Laufen gebracht.
Ich kann keine Bilder posten, aber ich werde versuchen, unten besser darzustellen, was nötig ist und passiert.
Blattstruktur und Daten „bom“ (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
Aufbau und Daten des Blattes „MPS“ (Bereich A1:D4):
id desc week batches
30010 build1 1 2
20010 build2 2 4
30010 build1 2 0
Blattstruktur „DData“ (Bereich A1:H3) und was mit Ihrem Code panhandel 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 beispielsweise den Wert E2 * G2 hätte.
*** 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 begann heftig abzustürzen. Ist es klüger, Range statt Rows zu verwenden?
Antwort1
BEARBEITET: Eine Schleife geht Zeile für Zeile durch MPS-Spalte A, die zweite Schleife vergleicht jeden Wert der MPS-Spalte A mit allen Werten der „bom“-Spalte A. Sobald eine Übereinstimmung gefunden wurde, wird jede einzelne Zelle in das DData-Blatt kopiert (ich bin sicher, es gibt einen schnelleren Weg, dies zu tun, aber dies veranschaulicht gut, was vor sich geht), und Spalte H erhält eine Formel zur Berechnung Ihres Gesamtergebnisses.
Die Registerkarten sind genauso eingestellt wie jetzt und liefern das, was Sie erwarten/brauchen.
Sub Button1_Click()
Dim countRows2 As Long
countRows2 = 2 'the first row where you want to start writing the found rows
Dim szMPSValues As Variant
Dim szbomValues As Variant
Dim lCount As Long
Dim lCountbom As Long
Dim MPSRng As Range
Dim bomRng As Range
Dim szConcatString As Variant
Dim strKeyword As String
'gets range of used cells
Set MPSRng = Intersect(Columns("A").Cells, Worksheets("MPS").UsedRange)
If MPSRng Is Nothing Then MsgBox "Nothing to do"
'have to switch sheets to set the second loop's range of "bom" values
Worksheets("bom").Activate
Set bomRng = Intersect(Columns("A").Cells, Worksheets("bom").UsedRange)
Worksheets("MPS").Activate
'saves range values into arrays
szMPSValues = MPSRng.Value
szbomValues = bomRng.Value
'double check a to be sure its an array and of proper size
If Not IsArray(szMPSValues) Then ReDim a(1, 1): szMPSValues = MPSRng.Value
'loop through array concatenating cell values with a space after cell value
'NOTE: Changed this to start at 2 in case you have a header row**
For lCount = 2 To UBound(szMPSValues)
strKeyword = Sheets("MPS").Range("A" & lCount).Value 'gets MPS.A2, MPS.A3, etc
For lCountbom = 2 To UBound(szbomValues)
If Sheets("bom").Range("A" & lCountbom).Value = strKeyword Then 'compares to bom.A2, bom.A3, etc
Sheets("DData").Range("A" & countRows2).Value = Sheets("bom").Range("A" & lCountbom).Value
Sheets("DData").Range("B" & countRows2).Value = Sheets("bom").Range("B" & lCountbom).Value
Sheets("DData").Range("C" & countRows2).Value = Sheets("bom").Range("C" & lCountbom).Value
Sheets("DData").Range("D" & countRows2).Value = Sheets("bom").Range("D" & lCountbom).Value
Sheets("DData").Range("E" & countRows2).Value = Sheets("bom").Range("E" & lCountbom).Value
Sheets("DData").Range("F" & countRows2).Value = Sheets("MPS").Range("C" & lCount).Value
Sheets("DData").Range("G" & countRows2).Value = Sheets("MPS").Range("D" & lCount).Value
Sheets("DData").Range("H" & countRows2).Formula = "=$F" & countRows2 & "*$G" & countRows2
countRows2 = countRows2 + 1
End If
Next lCountbom
Next lCount
End Sub