VBA Tabellen Vergleichen und wenn gleich dann bestimme Felder Kopieren

  • Excel

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Petersilie.

    VBA Tabellen Vergleichen und wenn gleich dann bestimme Felder Kopieren

    Hallo Leute,

    ich bin gerade dabei eine Tabelle für Handy-Rechnungen zu erstellen. Die Tabelle sieht wie Bild "Testdaten-Liste" aus.
    Das Problem ist das die Telefonnummern in den Rechnungen der Größe nach geordnet kommen, jedoch in der Testdaten-Liste sind diese Telefonnummern nicht geordnert sondern nach Abteilungen und Mitarbeitern aufgeteilt.
    Jetzt habe ich ein extra Tabellenblatt erstellt namens "Vorlage", indem die Telefonnummern ebenfalls geordnet sind, sodass man die Beträge einfach nur der Reihe nach runterschreiben muss.
    Die Werte die ich nun in die Vorlage eingetragen habe müssen nun in den richtige Tabelle übertragen werden. Ein Makro welches mir ein Extra Tabellen Blatt erstellt und die Tabelle kopiert habe ihc schon gemacht mit folgendem code:

    Sub a()
    Dim ws As Worksheet
    Dim wsname
    wsname = InputBox("Geben sie den Namen für die Datei ein")
    Set ws = ThisWorkbook.Worksheets.Add
    ws.Name = wsname

    Worksheets("Tabelle").Cells.Copy
    With Worksheets(wsname)
    .Cells.PasteSpecial Paste:=xlPasteValues
    .Cells.PasteSpecial Paste:=xlPasteFormats
    End With
    Application.CutCopyMode = False

    End Sub

    Jetzt weiss ich nicht wie ich die Telefonnummern von der "Vorlage" mit den Nummern der richtigen Tabelle vergleichen kann und wenn diese Nummern gleich sind dann in dem jeweiligen Feld den Wert übertragen kann.
    Ich muss also ca. 70 Nummern vergleichen und immer wenn die Nummern gleich sind soll der Wert von den Vorlage in das Netto feld der Tabelle geschrieben werden.

    ich hoffe ihr versteht was ich meine, da ich mir hier grad echt schwer tue das zu erklären :/

    Vielen Dank für eure Hilfe !
    Bilder
    • Testdaten-Liste.PNG

      15,51 kB, 777×221, 21 mal angesehen
    • Vorlage.PNG

      9,05 kB, 337×264, 21 mal angesehen
    Ich sehe da mehrere Varianten.
    1. Die Tabelle "Testdaten-Liste" zum eintragen der Beträge nach den Telefonnummern sortieren und danach wieder zurück nach Abteilungen und Mitarbeitern.
    2. Das ganze mit einer PivotTable lösen.
    3. Die Verweis-Funktion oder eine andere Nachschlagefunktion verwenden.
    4. Mit einer Schleife durch die Telefonnummern gehen und mit der Range.Find-Methode und Range.Offset-Eigenschaft die Beträge suchen .
    Gibt es eine Möglichkeit dies mit einer For-Schleife und vielleicht noch mit IF zu lösen ?? ich hab leider keine Ahnung wie ich so etwas schreibe da ich komplett neu bin in VBA... vom googeln werd ich auch nicht schlauer ... hat jemand einen vorschlag für so einen code für mein problem ?
    Hallo,

    meine Testdatei:
    2 Tabellen

    Spalte 1 hat jeweils die Telefonnummern gespeichert.
    Spalte 1 hat Format "Text"

    Mit dem Code findest du die Nummern:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Public Sub test()
    3. Dim sh1 As Object 'Tabelle mit Nummern
    4. Dim sh2 As Object 'Tabelle in der gesucht wird
    5. Dim searches As Variant 'Array mit Nummern
    6. Dim v_zone As Variant 'Array wo Nummern gesucht werden
    7. Dim lRow As Long 'Letzte Zeile der Spalte xy
    8. Set sh1 = ThisWorkbook.Sheets(1)
    9. Set sh2 = ThisWorkbook.Sheets(2)
    10. With sh1
    11. lRow = .Cells(.Rows.Count, 1).End(xlUp).Row
    12. 'beginnt bei zeile 2 da die erste eine Überschrift enthält
    13. searches = .Range(.Cells(2, 1), .Cells(lRow, 1)).Value
    14. End With
    15. With sh2
    16. lRow = .Cells(.Rows.Count, 1).End(xlUp).Row
    17. 'array mit allen werten der spalte A
    18. 'MUSS bei Zeile 1 losgehen, sonst muss der Wert von indexOf
    19. 'immer um 1 erhöt werden
    20. v_zone = .Range(.Cells(1, 1), .Cells(lRow, 1)).Value
    21. End With
    22. Dim search As Variant
    23. For Each search In searches
    24. Debug.Print indexOf(search, v_zone)
    25. Next search
    26. End Sub
    27. Private Function indexOf(ByVal search As Variant, ByRef lookupZone As Variant) As Long
    28. If Not VBA.IsError(Application.Match(search, lookupZone, 0)) Then
    29. indexOf = Application.Match(search, lookupZone, 0)
    30. End If
    31. End Function