Excel VBA-Zeilenabrufschleife

1

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?

Ben Gretzky
quelle
Du hast mich in deinem zweiten Absatz verloren. Können Sie die 4 Zeilen, von denen Sie in diesem Bit sprechen, umformulieren oder klären? Wenn also der Wert in der MPS-Zelle A2 mit 4 Zeilen in bom übereinstimmt, sollten die Werte aus den Zellen C2 und D2 nach diesen 4 Zeilen gesetzt werden.
panhandel
Es tut uns leid! Ich habe versucht, es in meiner Antwort unten zu erklären (Woche und Chargen).
Ben Gretzky
Der einzige Ort, den ich gesehen habe .Rows verwendet wird beim Kopieren und Einfügen. Ich bin nicht sicher, ob Sie es mit einem .Value verfolgen können. Und danke für die Klarstellung. Sie benötigen zwei Schleifen; Eine, um MPS-Zeilen zu durchlaufen, und für jede dieser Zeilen eine weitere Schleife, um alle bom-Zeilen zu durchsuchen. Ich werde meine Antwort bald ändern.
panhandel

Antworten:

1

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.

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
panhandel
quelle
Vielen Dank für die Eingabe! Ich wollte nur antworten, sondern kommentierte stattdessen ..
Ben Gretzky
Ich habe das Format des Superuser durcheinander gebracht und die ursprüngliche Frage bearbeitet, um neue Daten aufzunehmen.
Ben Gretzky
Aktualisierte; So erhalten Sie das Datenblatt genau so, wie Sie es jetzt möchten.
panhandel
Ja, danke! Ich habe den Fehler bekommen Run-time error '1004': Methor 'Intersect' of object '_Global' failed von der Linie Set MPSRng = Intersect(Columns("A").Cells, Worksheets("MPS").UsedRange) und Set bomRng = Intersect(Columns("A").Cells, Worksheets("bom").UsedRange) aber korrigiert, indem Sie sie schreiben Set MPSRng = Intersect(Worksheets("MPS").Columns("A").Cells, Worksheets("MPS").UsedRange) und Set bomRng = Intersect(Worksheets("bom").Columns("A").Cells, Worksheets("bom").UsedRange) - Ist das der richtige Weg?
Ben Gretzky
Wenn es bei dir funktioniert, sag ich lauf damit!
panhandel