Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Kopieren bestimmter Zelle aus ListObject

Forumthread: Kopieren bestimmter Zelle aus ListObject

Kopieren bestimmter Zelle aus ListObject
10.03.2021 10:19:00
Dietmar
Hallo liebe Experten,
zuerst stelle ich mich vor. Mein Name ist Dietmar.
Ich habe ein Problem mit den Listen Objekten an einer Stelle.
Vorab, die Module laufen wunderbar bis auf eine Stelle, an der ich immer wieder scheitere.
Es geht hierbei um eine If-Abfrage, die nachträglich einfügen musste, um einen bestimmten Fall abzudecken.
Im Anhang senden ich den gesamten Code. Ja, ich weiß, etliche Zeilen kann man in Sub-Routinen zusammenfassen, aber ich bin erst einmal froh, dass es soweit läuft. Die Feinarbeit kommt noch. Ich bitte auch um Veständnis, dass ich nicht das original Worksheet senden kann, da hier sehr viele personebezogene Daten (Datenschutz) vorhanden sind. Ich lege aber ein Bild bei, dass das Problem verdeutlichen sollte.
Hier da Problem:
Ich habe eine intelligente, gefilterte Tabelle. jetzt brauch ich eine IF-Abfrage in dieser Tabelle. Wenn die Bedingung in Feld "K13" erfüllt ist, also "11.11.1911" (Dummydatum), dann soll das Datum aus Zelle Zelle "H13" nach "H14" kopiert werden. Anschließend wir die Zeile "13" herausgefiltert.
Soweit die Erklärung, nur passiert nichts. Schon bei der IF-Abfrage überspringt er den folgenden Code. Die Adressierung der Spalten mit den Header-Überschriften brauche ich, da es immer wieder mal passieren kann, dass sich die Sortierreihenfolge der Datenbankabfrage ändert, die Namen der Spalten aber bleiben.
Hier die Stelle, an der es klemmt:
With LOTerm
.Range.AutoFilter Field:=1, Criteria1:=strFKZ
.Range.AutoFilter Field:=5, Criteria1:="Zwischenbericht"
'MsgBox LOTerm.ListColumns("Nachweis/Bericht vom").DataBodyRange(3)
If LOTerm.ListColumns("Nachweis/Bericht vom").DataBodyRange(2) = DateValue("11.11.1911") Then
strZwB = LOTerm.ListColumns("Beginn des Berichtszeitraumes").DataBodyRange(2)
LOTerm.ListColumns("Beginn des Berichtszeitraumes").DataBodyRange(3) = strZwB
End If

.Range.AutoFilter Field:=12, Criteria1:=""
On Error Resume Next
Set rngLOTerm = .DataBodyRange.Columns(1).SpecialCells(xlVisible)
' On Error GoTo 0
If Not rngLOTerm Is Nothing Then
wrkShtTerm.Range("E2:E" & wrkShtTerm.UsedRange.Rows.Count).SpecialCells(xlCellTypeVisible).Copy Destination:=wrkShtUeber.Range("A15")
wrkShtTerm.Range("H2:J" & wrkShtTerm.UsedRange.Rows.Count).SpecialCells(xlCellTypeVisible).Copy Destination:=wrkShtUeber.Range("B15")
End If
On Error GoTo 0
End With
Im Vorraus vielen Dank
Dietmar

Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kopieren bestimmter Zelle aus ListObject
10.03.2021 13:32:33
ChrisL
Hi Dietmar
Vielleicht hast du vergessen die Links zu deinen erwähnten Anhängen in den Beitrag zu kopieren.
Als "Trockenübung" funktioniert folgender Schnipsel ohne Probleme:
Sub t()
Dim strZwB As String
With ActiveSheet.ListObjects.Item(1)
If .ListColumns("Nachweis/Bericht vom").DataBodyRange(2) = DateValue("11.11.1911") Then
strZwB = .ListColumns("Beginn des Berichtszeitraumes").DataBodyRange(2)
.ListColumns("Beginn des Berichtszeitraumes").DataBodyRange(3) = strZwB
End If
End With
End Sub
Dass bei dir die If-Bedingung gar nicht erst erfüllt wird, könnte daran liegen, dass in Zeile 3 (Titel wird nicht mitgezählt) kein echtes Datum/Zahl sondern Text steht. Lässt sich einfach prüfen:
=ISTZAHL(B3)
Da du von einer Datenbankabfrage sprichst, könnte dir Power-Query (PQ) als Alternative zu VBA helfen. PQ ist für Abfragen (=Query) bestens geeignet und die Typenkonvertierung (Text in Datum) lässt sich leicht realisieren.
https://excelhero.de/power-query/power-query-ganz-einfach-erklaert/
Bei Bedarf kannst du mal ein vereinfachtes, anonymisiertes Beispiel deiner Rohdaten (gerne als XLSX, da ich keine Makrodateien downloaden kann) ins Forum stellen und dein Ziel erläutern (nach welchem Kriterium soll konkret gefiltert werden und wie soll das Ergebnis aussehen).
cu
Chris

Anzeige
AW: Kopieren bestimmter Zelle aus ListObject
10.03.2021 14:22:13
Dietmar
Hallo Chris,
vielen Dank für Deine Antwort. Ich werde Deinen Lösungsvorschlag ausprobieren.
Tja, mit dem Upload hat wohl nicht geklappt, ich vesuche es nochmal.
PowerQuery hilft mir nicht, auch wenn ich sonst gerne damit arbeite, aber es handelt sich um eine externe Datenbank, auf die wir lediglich Zugrich über eine Excel-Schnittstelle haben, mit weitgehend vordefinierten Querys. Deswegen muss man das beste daraus machen.
Verzeih mir, aber eine DummyDatei zuerstellen ist in dieser Situation recht aufwendig. Allein das eine Tabellenblatt, das ich zu Filterung des 2. brauche hat, ca. 180 Spalten! Aber vielleicht hilt das Bild.
Also: wenn die Bedingung in K13 (A) erfüllt ist, soll den Wert aus H13 (B) nach H14 (C) kopieren. Manuell bekomme ich das ja auch hin, aber bei rund 2000 Datensäten? :-)
Userbild
hier noch die Codedatei: https://www.herber.de/bbs/user/144624.txt
Vielen Dank
Dietmar

Anzeige
AW: Kopieren bestimmter Zelle aus ListObject
10.03.2021 15:41:03
ChrisL
Hi Dietmar
Ein stark vereinfachtes Beispiel, so dass man das Problem nachvollziehen und den relevanten Codeteil testen/entwickeln kann, würde bereits reichen. Die wenigsten können Freiluft programmieren und der Aufwand zur Erstellung eines Beispiels ist beim Antworter nicht weniger gering wie beim Frager.
Ich denke das Problem könnte sein, dass DataBodyRange(2) die Zeile 3 darstellt. Der Filter wird nicht berücksichtigt. Gleiche WENN-Abfrage mit DataBodyRange(12) würde wahrscheinlich funktionieren.
Ein Detail: strZwB hast du korrekt als Date deklariert. Zur Vermeidung allgemeiner Verwirrung wäre es sinnvoll die Variable nicht als "str" (Text-String) zu bezeichnen.
Die Power-Query liesse sich leicht auf der bereits vorhandenen Abfrage aufbauen. Ich dachte zwar daran die bestehende Query zu erweitern, aber wenn es nicht geht, kannst du auch eine zweite individuelle Query darauf aufbauen.
cu
Chris

Anzeige
AW: Kopieren bestimmter Zelle aus ListObject
10.03.2021 16:01:46
Dietmar
Hallo Chris,
vielen Dank erst mal für Deine Hilfe.
Ich werde mit Deinen Tipps erst einmal weiterarbeiten. Notfalls meld ich mich noch einemal.
Viele Grüße
Dietmar

AW: Kopieren bestimmter Zelle aus ListObject
10.03.2021 18:18:26
Dietmar
Hallo Chris,
Heureka!
Dein Hinweis mit den Adressen war Gold wert!
Tatsächlich war es so, dass er die Zeile 3 aus der GESAMTEN Tabelle genommen hat.
Jetzt habe ich die Zelle mit der FIND-Methode im gefilterten Bereich und nur im gefilterten Bereich gesucht. Das brachte mit die Adresse $K$13! Damit hatte ich alles was ich brauchte.
Der Rest war ein Kinderspiel (na ja, stark übertrieben, aber dafür sehr anschaulich :-)).
Falls es für Dich von Interesse ist, hier der Code:
Private c As Range
Private adrErste As String
Private adrZweite As Integer
With LOTerm
.Range.AutoFilter Field:=1, Criteria1:=strFKZ
.Range.AutoFilter Field:=5, Criteria1:="Zwischenbericht"
With LOTerm.DataBodyRange.SpecialCells(xlCellTypeVisible)
Set c = .Find(DateValue("11.11.1911"), LookIn:=xlValues)
If Not c Is Nothing Then
adrErste = c.Address
adrZweite = Range(adrErste).Row
LOTerm.Range(adrZweite, 8).Copy Destination:=LOTerm.Range(adrZweite + 1, 8)
End If
End With
End With
Dabei ist die Spalte 8 in meinem Fall immer fix. Will mal schauen, ob es auch mit dem Spaltennamen geht. Das wäre dann, glaube ich, die Kür.
Vielleicht kann das ja mal jemand gebrauchen.
Viele Grüße
Dietmar
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Kopieren bestimmter Zelle aus ListObject


Schritt-für-Schritt-Anleitung

Um eine bestimmte Zelle aus einem ListObject in Excel VBA zu kopieren, kannst Du folgende Schritte befolgen:

  1. Öffne den VBA-Editor:

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Füge ein neues Modul hinzu:

    • Klicke im Projekt-Explorer mit der rechten Maustaste auf VBAProject, wähle Einfügen und dann Modul.
  3. Schreibe den VBA-Code:

    • Hier ist ein einfacher Code, der zeigt, wie Du eine Zelle kopieren kannst:
    Sub KopiereZelle()
       Dim strZwB As String
       With ActiveSheet.ListObjects.Item(1)
           If .ListColumns("Nachweis/Bericht vom").DataBodyRange(2) = DateValue("11.11.1911") Then
               strZwB = .ListColumns("Beginn des Berichtszeitraumes").DataBodyRange(2)
               .ListColumns("Beginn des Berichtszeitraumes").DataBodyRange(3) = strZwB
           End If
       End With
    End Sub
    • In diesem Beispiel wird überprüft, ob der Wert in der zweiten Zeile der Spalte "Nachweis/Bericht vom" dem Datum "11.11.1911" entspricht. Wenn ja, wird der Wert aus der Spalte "Beginn des Berichtszeitraumes" in die nächste Zeile kopiert.
  4. Führe den Code aus:

    • Drücke F5, um das Makro auszuführen.

Häufige Fehler und Lösungen

  • Fehler: IF-Bedingung wird nicht erfüllt.

    • Überprüfe, ob die Daten in der entsprechenden Zelle als Datum formatiert sind. Ein einfacher Test mit der Formel =ISTZAHL(B3) kann helfen.
  • Fehler: Zelle nicht gefunden.

    • Stelle sicher, dass Du im gefilterten Bereich suchst. Verwende SpecialCells(xlCellTypeVisible) für sichtbare Zellen.

Alternative Methoden

Wenn Du den VBA-Ansatz nicht verwenden möchtest, kannst Du auch Power Query in Betracht ziehen. Power Query ermöglicht es Dir, Daten effizient zu transformieren und zu filtern. Du kannst die Abfragen so definieren, dass sie automatisch aktualisiert werden, ohne dass manuelles Kopieren erforderlich ist. Weitere Informationen findest Du hier.


Praktische Beispiele

Hier ist ein erweitertes Beispiel, das zeigt, wie Du mit einer FIND-Methode die richtige Zelle im gefilterten Bereich findest:

Private c As Range
Private adrErste As String
Private adrZweite As Integer

With LOTerm
    .Range.AutoFilter Field:=1, Criteria1:=strFKZ
    .Range.AutoFilter Field:=5, Criteria1:="Zwischenbericht"

    With LOTerm.DataBodyRange.SpecialCells(xlCellTypeVisible)
        Set c = .Find(DateValue("11.11.1911"), LookIn:=xlValues)
        If Not c Is Nothing Then
            adrErste = c.Address
            adrZweite = Range(adrErste).Row
            LOTerm.Range(adrZweite, 8).Copy Destination:=LOTerm.Range(adrZweite + 1, 8)
        End If
    End With
End With

In diesem Beispiel wird die gefilterte Tabelle verwendet, um die Adresse einer Zelle zu finden und deren Wert zu kopieren.


Tipps für Profis

  • Verwende Variablen für Spaltennamen:

    • Anstatt harte Kodierung der Spaltennamen zu verwenden, speichere sie in Variablen. Das macht den Code flexibler und einfacher zu warten.
  • Fehlerbehandlung:

    • Füge Fehlerbehandlungsroutinen hinzu, um sicherzustellen, dass der Code bei unerwarteten Situationen nicht abstürzt.
  • Optimiere Deine Abfragen:

    • Reduziere die Anzahl der Abfragen, um die Effizienz zu steigern, insbesondere bei großen Datenmengen.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass ich die richtige Zelle im gefilterten Bereich anspreche? Um sicherzustellen, dass Du die richtige Zelle ansprichst, verwende die SpecialCells(xlCellTypeVisible) Methode, um nur mit sichtbaren Zellen zu arbeiten.

2. Was mache ich, wenn mein Wert als Text und nicht als Datum gespeichert ist? Du kannst die Funktion DateValue() verwenden, um sicherzustellen, dass der Vergleich mit einem Datum korrekt durchgeführt wird. Überprüfe zudem die Formatierung der Zelle.

3. Kann ich mit mehreren Bedingungen arbeiten? Ja, Du kannst mehrere IF-Bedingungen verschachteln oder die And/Or Operatoren verwenden, um komplexere Logik in Dein VBA-Skript einzufügen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige