Zelleninhalt ans Ende der Tabelle einfügen

Hallo liebes Forum,

ich habe vor kurzem eine super Hilfe erhalten, eine Tabelle nach vorhandenen Werten zu durchsuchen: Siehe dazu:
/t/tabelle-in-mehreren-spalten-durchsuchen/4508258/10
Nun habe ich noch zwei Fragen: Wie ist es möglich, die Werte aus den Zellen A1, B1 und C1, die vorher dort eingegeben werden, ans Ende der Tabelle zu schreiben (also nicht suchen, sondern hinzufügen), dort auch wieder in die Spalten A, B und C. Die vorhandene Tabelle enthät allerdings ab und zu mal eine oder zwie aufeinanderfolgene Leerzeilen, erkennt Excel trotzdem, dass nach den Leerzeilen noch etwas in der Tabelle folgt?
Die zweite Frage: Das im Link beschriebene Suchproblem würde ich gerne auch dadurch lösen, dass zusätzlich zur Messagebox noch die entsprechnde Zeile markiert und auf den Bildschirm gerückt wird (die Tabelle enthält mehr als 2000 Werte). Geht das mit z.B. .Select oder .onFocus? Leider bin ich (noch) nicht sehr versiert in VBA…

Für Eure Hilfe und Anregungen vielen Dank.

Gruß Achim

Prinzipiell so …
Moin,

also wie ich Reinhard kenne, ist der schon wieder am Programmieren :wink: Also spare ich mir detailierte Ausführungen zu Deinem Problem und sage nur so viel, dass es mittels VBA kein Problem ist, den letzten Eintrag in einer Zeile oder Spalte zu finden:

Nehmen wir an, Deine Liste steht in Spalte A, und sie hat zunächst KEINE Leerzellen. Dann

  • markierst Du mit der Maus eine beliebige Zelle in dieser Liste,

  • legst den Finger auf die ENDE-Taste,

  • guckst ganz rechts auf die Statusleiste,

  • drückst währenddessen die ENDE-Taste,

  • erkennst, dass in der Statusleiste der „Ende“-Modus angezeigt wird,

  • drückst nun die „Pfeil nach unten“-Taste (Cursortaste)

  • und erkennst, dass nun das letzte Element der Liste ausgewählt ist.

Gleiches geht natürlich in alle vier Richtungen. Sollte die Liste nun Löcher haben, springt man damit immer von Loch zu Loch. Mache ich fast täglich, und die Ende-Taste ist daher schon recht abgenutzt :wink:

Im Ende-Modus kann man übrigens auch markieren. Dazu drückt man einfach parallen zur Cursortaste die Umschalttaste. Wenn das nicht ginge, wäre ich oft ganz schon am Scrollen :wink: Man sollte sich das also wirklich antrainieren, das spart sehr viel Zeit, wenn man´s drauf hat.

So, um nun das letzte Element in einer LÖCHRIGEN Liste zu finden, müssen wir „von unten“ kommen. Das heißt, wir starten in einer Zelle, die garantiert UNTER der Liste liegt. Ich nehme in der Vertikalen immer einfach die letzte Zeile. In unserem Falle wäre das die Zelle A65536. Wenn Du also in einer leeren Spalte im Ende-Modus die Cursortasten auf- und abdrückst, springst Du immer zwischen der ersten und der letzten Zeile hin und her. Von unten gehen wir dann jedenfalls im Ende-Modus wieder rauf, und Excel bleibt beim ersten Treffer hängen - dem letzten Eintrag in der Liste.

In VBA sieht das nun so aus:

Range("A65536").End(xlUp).Select

Das kann man natürlich beliebig geschickter machen, je nach Aufgabe, aber für Deinen Zweck sollte es erstmal reichen. Die anderen vier Richtungen realisiert man mit den folgenden Konstanten:

xlDown
xlToRight
xlToLeft

Viel Erfolg,
Kristian

Nun habe ich noch zwei Fragen: Wie ist es möglich, die Werte
aus den Zellen A1, B1 und C1, die vorher dort eingegeben
werden, ans Ende der Tabelle zu schreiben (also nicht suchen,
sondern hinzufügen), dort auch wieder in die Spalten A, B und
Die zweite Frage: Das im Link beschriebene Suchproblem würde
ich gerne auch dadurch lösen, dass zusätzlich zur Messagebox
noch die entsprechnde Zeile markiert und auf den Bildschirm
gerückt wird (die Tabelle enthält mehr als 2000 Werte). Geht

Hallo Achim,

soll A1:C1 immer unten eingefügt werden, auch wenn es schon in der Liste vorkommt, so mußt du wahrscheinlich nur die Zeile:
Range(„A1:C1“).Copy…
hinter das „End If“ verschieben.

Sub Finden()
Dim Zeile As Long, Gefunden As Boolean
Zeile = 1
While Finde([a1], Zeile + 1, 1) \> 0 And Gefunden = False
 Zeile = Finde([a1], Zeile + 1, 1)
 If Cells(Zeile, 2) = [B1] And Cells(Zeile, 3) = [C1] Then Gefunden = True
Wend
If Gefunden = True Then
 MsgBox "Gefunden in Zeile " & Zeile
Else
 MsgBox "Nicht gefunden"
 Zeile = Cells(Rows.Count, 1).End(xlUp).Row + 1
 Range("A1:C1").Copy Destination:=Range("A" & Zeile)
End If
Range("A" & Zeile).Select
End Sub
'
Function Finde(Wert As Variant, Erste As Long, Spalte As Integer) As Long
Dim Letzte As Long, Zelle As Range
Letzte = ActiveSheet.Cells(Rows.Count, Spalte).End(xlUp).Row
If Erste \> Letzte Then Exit Function
With ActiveSheet.Range(Cells(Erste, Spalte), Cells(Letzte, Spalte))
 Set Zelle = .Find(Wert, LookIn:=xlValues)
 If Not Zelle Is Nothing Then Finde = Zelle.Row
End With
End Function

Gruß
Reinhard

Hallo Reinhard,

vielen Dank für Deine Lösung. Ich hatte schon eine Lösung ausgetüftelt, die allerdings nicht so elegant gelöst wurde wie Deine und auch nicht so funktional ist. Leider unterscheidet Deine Lösung zwischen Groß- u. Kleinschreibung. Gibt es da auch noch eine Möglichkeit, z.B. mit UCase? Im Deinem Code müssen noch 2 If-Anweisungen beendet werden. Einmal vor Wend und einmal vor End With.

Viele Grüße

Achim

Sub Finden()
Dim Zeile As Long, Gefunden As Boolean
Zeile = 1
While Finde([a1], Zeile + 1, 1) > 0 And Gefunden = False
Zeile = Finde([a1], Zeile + 1, 1)
If Cells(Zeile, 2) = [B1] And Cells(Zeile, 3) = [C1] Then
Gefunden = True
Wend
If Gefunden = True Then
MsgBox "Gefunden in Zeile " & Zeile
Else
MsgBox „Nicht gefunden“
Zeile = Cells(Rows.Count, 1).End(xlUp).Row + 1
Range(„A1:C1“).Copy Destination:=Range(„A“ & Zeile)
End If
Range(„A“ & Zeile).Select
End Sub

Function Finde(Wert As Variant, Erste As Long, Spalte As
Integer) As Long
Dim Letzte As Long, Zelle As Range
Letzte = ActiveSheet.Cells(Rows.Count, Spalte).End(xlUp).Row
If Erste > Letzte Then Exit Function
With ActiveSheet.Range(Cells(Erste, Spalte), Cells(Letzte,
Spalte))
Set Zelle = .Find(Wert, LookIn:=xlValues)
If Not Zelle Is Nothing Then Finde = Zelle.Row
End With
End Function

Hallo Achim,

Leider unterscheidet
Deine Lösung zwischen Groß- u. Kleinschreibung. Gibt es da
auch noch eine Möglichkeit, z.B. mit UCase?

ja, baue halt ucase bei allen Begriffen ein. Wie die Find-Methode nach Groß/Klein unterscheidet, bzw. obs da einen Parameter gibt, weiß ich gerade nicht auswendig, hab hier keine vba-Hilfe.

Im Deinem Code
müssen noch 2 If-Anweisungen beendet werden. Einmal vor Wend
und einmal vor End With.

Jain, als ich den Code abschickte, waren es einzeilige If-Abfragen, w-w-w machte daraus durch Zeilenumbruch Zweizeiler, mache daraus wieder Einzeiler, dann stimmt es wieder.

Gruß
Reinhard

Hallo Reinhard,

vielen Dank für Deine Tipps.

Viele Grüße,

Achim