HERBERS Excel-Forum - das Archiv
Bei Finden eines Suchbegriffs Übertrag bestimmter Zellen
Martin
Hallo zusammen,

Ich möchte bei der Datei https://www.herber.de/bbs/user/175646.xlsm Werte übertragen.

Folgendes soll geschehen:
  • 1. Suche mir den Wert aus Export!C9* in 'Liste 2025-02-10'!C:C und übertrage die Spalten I:M
  • 2. Wenn der Wert nicht gefunden wurde schreibe in die jeweilige Zeile in Spalte N "Neuer Datensatz"
  • 3. Wenn sich in der jeweiligen Zeile in den Spalten B; D:H etwas geändert hat schreibe in der jeweiligen Zeile in Spalte N "veränderter Datensatz"
  • 4. Wenn es in 'Liste 2025-02-10'!C:C einen Wert gibt, den es in Export!C:C nicht gibt, dann übertrage die Zeile im Bereich B:H in die erste ungefüllte Zeile von Export!B:H und schreibe in die jeweilige Zeile in Spalte N "veralteter Datensatz"


  • *Geht natürlich bis zur letzten gefüllten Zeile ^^

    Ich habe mich daran mehr schlecht als recht probiert, Beginn ist ab Zeile
    '************************BIS HIERHIN AKTUALISIERT***********************************************************


    und geht bis
    'Autofilter setzen, neues Tabellenblatt umbennen, Bestandsblatt ausblenden


    Vielen Dank im Voraus für Eure Hilfe! :)
    AW: Bei Finden eines Suchbegriffs Übertrag bestimmter Zellen
    MCO
    Moin, Martin!

    Ich hoffe, dass ich dein Anliegen richtig umgesetzt habe.
    Allerdings hab ich mir nicht die Mühe gemacht, deinen Code zu modifizieren sondern bin neu angefangen.

    Probier es mal aus:
    Sub Übertragen()
    

    Dim sh1 As Worksheet, sh2 As Worksheet
    Dim wert As Range, werte As Range, gefunden As Range
    Dim str_werte1 As String, str_werte2 As String
    Dim sp_array As Variant
    Dim i As Integer, lz As Long

    ' Arbeitsblätter zuweisen
    Set sh1 = Sheets(1)
    Set sh2 = Sheets(2)

    ' Werte aus Spalte C des zweiten Sheets abrufen
    Set werte = sh2.Range("C:C").SpecialCells(xlCellTypeConstants, xlNumbers)

    ' Erste Vergleichsschleife (sh2 -> sh1)
    For Each wert In werte
    ' Suche den Wert in Spalte C von sh1
    Set gefunden = sh1.Range("C:C").Find(what:=wert, LookIn:=xlValues, LookAt:=xlWhole)

    If Not gefunden Is Nothing Then ' Falls Wert gefunden wurde
    ' Erstellen von Vergleichsstrings für geänderte Datensätze
    str_werte1 = WorksheetFunction.Concat(sh1.Range("D" & gefunden.Row & ":H" & gefunden.Row), sh1.Cells(gefunden.Row, "B"))
    str_werte2 = WorksheetFunction.Concat(sh2.Range("D" & wert.Row & ":H" & wert.Row), sh2.Cells(wert.Row, "B"))

    If str_werte1 <> str_werte2 Then ' Unterschiedliche Inhalte?
    sh2.Cells(wert.Row, "N").Value = "veränderter Datensatz"
    End If

    ' Datenübernahme
    sp_array = Array(2, 4, 5, 6, 7, 8) ' zu übertragende Spalten

    For i = LBound(sp_array) To UBound(sp_array)
    sh1.Cells(gefunden.Row, sp_array(i)).Value = sh2.Cells(wert.Row, sp_array(i)).Value
    Next i

    Else
    ' Markiere nicht gefundene Werte rot
    wert.Interior.ColorIndex = 3
    End If
    Next wert

    ' Umgedrehte Suche (sh1 -> sh2)
    Set werte = sh1.Range("C:C").SpecialCells(xlCellTypeConstants, xlNumbers)

    For Each wert In werte
    Set gefunden = sh2.Range("C:C").Find(what:=wert, LookIn:=xlValues, LookAt:=xlWhole)

    If gefunden Is Nothing Then ' Falls nicht in sh2 gefunden
    lz = sh2.Cells(Rows.Count, "C").End(xlUp).Row ' Letzte verwendete Zeile
    sp_array = Array(2, 3, 4, 5, 6, 7, 8) ' zu übertragende Spalten

    For i = LBound(sp_array) To UBound(sp_array)
    sh2.Cells(lz + 1, sp_array(i)).Value = sh1.Cells(wert.Row, sp_array(i)).Value
    Next i
    sh2.Cells(lz + 1, "N").Value = "veränderter Datensatz"
    End If
    Next wert

    End Sub

    Gruß, MCO
    AW: Bei Finden eines Suchbegriffs Übertrag bestimmter Zellen
    Martin
    Danke, Piet und MCO.

    Der Code klappt größtenteils. Leider werden die Kommentare in den Spalten I:M in der Bestandsliste (im Beispiel sh1) nicht in die neue Liste übertragen. Ich sehe gerade, dass ich vergaß es zu erwähnen.
    Pro Datensatz müssen die Werte aus der alten in die neue Tabelle übertragen werden.

    Ein weiteres Problem habe ich: Im korrekten Fall wird das exportierte Tabellenblatt später mit dem aktuellen Datum versehen. Wenn ich in einem Monat den Code erneut abspiele muss ich identifizieren, welches Tabellenblatt das Bestehende ist. Beispiel:

    Start des Makros am 01.03.2025: Tabellenblatt alt = Assetliste 2025-02-01; Tabellenblatt neu = Export, wird umbenannt in Assetliste 2025-03-01, altes Blatt wird ausgeblendet
    Start des Makros am 01.04.2025: Tabellenblatt alt = Assetliste 2025-03-01; Tabellenblatt neu = Export, wird umbenannt in Assetliste 2025-04-01, altes Blatt wird ausgeblendet

    Im Grunde genommen muss das Makro wissen, welches das alte Tabellenblatt ist. Entweder, dass es das einzige Eingeblendete ist (neben Export). Oder ich gebe am Anfang ein Auswahlfeld der eingeblendeten Tabellenblätter, von denen man sich dann eines aussuchen kann. In der hochgeladenen Datei seht Ihr am Anfang folgende Messagebox:
    Abfrage = MsgBox(prompt:="Ist das aktuelle Tabellenblatt selektiert?", Buttons:=vbOKCancel)

    Das ist aber enorm fehleranfällig

    AW: Bei Finden eines Suchbegriffs Übertrag bestimmter Zellen
    Piet
    Hallo

    wie wäre es, wenn du die erste Msgbox Abfrage durch diesen Teil ersetzt
    ThisWorkbook.Save
    Worksheets(1).Select
    If ActiveSheet.Name = "Export" Then MsgBox "aktuelles Sheet fehlt!": Exit Sub

    mfg Piet
    AW: Bei Finden eines Suchbegriffs Übertrag bestimmter Zellen
    Martin
    Hi MCO,

    danke für den Code. An folgender Stelle erhalte ich einen Laufzeitfehler '1004': Keine Zellen gefunden.
    Den Namen des Tabellenblattes habe ich auf den von Dir beschriebenen sh2 gelassen und testweise auf den im restlichen Code verwendeten Begriff wsNew, das hatte aber keine Änderung zur Folge.

        Set werte = sh2.Range("C:C").SpecialCells(xlCellTypeConstants, xlNumbers)

    AW: Bei Finden eines Suchbegriffs Übertrag bestimmter Zellen
    MCO
    Hi!

    Die Zeile such in Spalte C nur nach Konstanten (keine Formelergebnisse) mit Zahlenwerten, so wie es dein Bespiel verlangt hat.
    Du kannst ", xlNumbers" auch rauslöschen, dann werden auch Text-Konstanten mit selectiert.

    ....und natürlich kannst du auch zusätzlich die Fehlerbehandlung von Piet einbauen....

    Gruß, MCO
    AW: Bei Finden eines Suchbegriffs Übertrag bestimmter Zellen
    Piet
    Hallo

    im Code des Kollegen fehlt ein Befehl zum Fehler abfangen, deshalb kommt Laufzeitfehler!
    Set Werte = sh2.Range("C:C") .... --> Laufzeitfehler, wenn keine Werte gefunden werden!!
    If Werte is Nothing Then MsgBox "Keine Werte gefunden!": Exit Sub
    Mit dieser MsgBox kannst du den Fehler abfangen! Der Code wird nach Set abgebrochen.

    Alternativ kannst du auch VOR der 1. Next Schleife diesen Befehl setzen, und -End If- HINTER Next!
    If Not Werte is Nothing Then --> danach kommt die 1. For Next Schleife

    Ob du "nicht gefunden" mit der 1. oder 2. Methode abfängst ist deine Sache. Kannst du frei wählen.
    Ich benutze beide, je nachdem was einfacher zu programmieren ist.

    mfg Piet
    AW: Bei Finden eines Suchbegriffs Übertrag bestimmter Zellen
    Martin
    Vielen Dank, Piet.

    Ich frage mich aber, warum kein Wert gefunden wurde. Das Makro arbeitet ja leider nicht weiter und vergleicht die Daten der einen Tabelle mit denen der Anderen