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

Forumthread: Worksheets().Range in Verbindung mit letzter Zeile

Worksheets().Range in Verbindung mit letzter Zeile
07.02.2014 18:45:34
schluk5
Hallo,
ich weiss grad nicht, wo hier der Fehler liegt und finde auch nichts passendes dazu hier im Forum.
Was ist am folgenden Code nicht in Ordnung?

Range("M:M").Value = Worksheets("Daten").Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)). _
Value

Ohne den Teil, der nur den "beschrieben Bereich" beruecksichtigt geht es ja:

Range("M:M").Value = Worksheets("Daten").Range("A:A").Value

Hier fehlen mir vermutlich noch ein paar Grundlegende VBA Kentnisse...
Viele Gruesse!

Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Immer wieder das gleiche...
07.02.2014 19:14:00
EtoPHG
schluk,
Die Objekte Range("M:M"), Cells(r,c) und Rows.Count referenzieren nicht auf die vorangestellten Objekte.
Wichtig: In was für einem Klassenmodul (Arbeitsmappe, Tabelle, Modul) steht der Code?
Je nachdem beziehen sich die unreferenzierten Objekte auf das gerade aktive Blatt oder eben die Tabelle in deren Klassenmodul der Code steht. Zudem willst du einen Teil einer Spalte einer gesamten Spalte zuordnen. Ist das beabsichtigt?
Eine vollständige Referenzierung könnte z.B. lauten:
With ThisWorkbook.Worksheets("Daten")
.Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)).Copy
ActiveSheet.Cells(1,13).PasteSpecial Paste:=xlPasteValues
End With
Gruess Hansueli

Anzeige
AW: Immer wieder das gleiche...
07.02.2014 19:28:32
Franc
k .. ich hätte erst deinen Beitrag lesen sollen bevor ich "falsch" antworte ;-)
Wieder was dazugelernt. ^^
wußte gar nicht, das Cells(Rows.Count, 1).End(xlUp) so funktioniert
normal liefert das doch nur den Wert zurück ...
naja - wieder was dazugelernt

Was liefert was ?...
07.02.2014 20:34:36
EtoPHG
Franc,
Grundsätzlich liefert Cells(Rows.Count, 1).End(xlUp) gar nichts, sondern stellt ein Objekt dar, nämlich die letze Zelle mit Inhalt einer Spalte von unten nach oben gesehen.
Die Default-Eigenschaft einer Zelle ist deren Wert, spricht .Value.
Wenn du also eine einfache Zuweisung des Zellobjekts zu einer Variablen machst, z.B. durch
V = Cells(Rows.Count, 1).End(xlUp) dann wird in V der Wert des Objekts übergeben.$
Wenn du .Row anhängst, dann eben die Eigenschaft Row, als die Zeilennummer der Zelle.
Schreibst du hingegen Set V = Cells(Rows.Count, 1).End(xlUp), wird die Variable V (sofern als Objekt oder Variant definiert) zu einem weiteren Objekt, das die wiederum die Eigenschaft .Value hat.
Also: Immer gut unterscheiden, was ist ein Objekt, was eine Methode (z.B. End), was eine Eigenschaft!
Gruess Hansueli

Anzeige
AW: Was liefert was ?...
07.02.2014 20:54:19
EtoPHG
Franc, denn richtigerweise hätte der Anfang lauten sollen:
Die Methode .End mit dem Parameter xlup angewandt auf das Objekt Cells(Rows.Count, 1) liefert als Objekt die erste, nicht leere Zelle aus der Richtung des letzten Zelleadresse der Spalte A nach oben gesehen zurück.
Die Methode liefert übrigens eine von den meisten Anwendern unerwartete Zelle zurück, wenn die letzte Zelle der Spalte einen Inhalt hat. Welche und warum?
Gruess Hansueli

Anzeige
AW: Was liefert was ?...
08.02.2014 00:48:30
Franc
Ich weiß schon, warum ich bei VBA "kaum Kenntnisse ausgewählt habe" ^^
Ich finde zwar Möglichkeiten wie ich Dinge umsetzen/anpassen kann aber das Problem ist wohl das ich häufig nicht weiß warum/wie das funktioniert.
Deshalb hatte ich auch erwartet, das
Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp))
auf Fehler läuft, weil für mein Verständnis nicht nur die Spaltenangabe fehlt sondern auch .End(xlUp) unvollständig war.
Das mit Objekt/Methode/Eigenschaft war mir auch nicht (so) bekannt. (ahh mir wird grad bewusst wie wenig ich weiß ...)
Ich denk aber ich habe was dazugelernt und dafür bin ich dir dankbar.

Anzeige
AW: Immer wieder das gleiche...
07.02.2014 19:31:29
schluk5
Ah ok. Das wusste ich natuerlich nicht...:-( Danke Hansueli!!
Der Code steht in einem Tabellenblatt "Suche". In dieses wollte ich beispielhaft einen Bereich aus dem Tabellenblatt "Daten" kopieren.
Das Mit der Zuordnung der verschieden grossen Bereiche war natuerlich unguenstig gewaehlt.
Eigenltich bin ich auf der Suche nach einer Loesung fuer ein etwas anderes Problem und hatte obiges Besipiel nur gewaehlt, da ich dachte es waere einfacher zu erklaeren.
Mein eigentliches Problem ist folgendes (der code steht wieder im Arbeistblatt "Suche"):

If Application.CountIf(Worksheets("Daten").Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)),  _
Range("D30")) Then
Else: MsgBox "ungueltige Artikelnummer"

Es soll ueberprueft werden ob der Zelleninhalt in "D30" aus dem Tabellenblatt "Suche" in einer Liste in Tabellenblatt "Daten" vorhanden ist.
So funktioert es (aus nun bekannten Gruenden) jedenfalls nicht.
Muss ich hier wieder mit der with-Umgebung arbeiten?

Anzeige
Alle aufdröseln...
08.02.2014 08:41:37
EtoPHG
Hallo schluk,
    Dim rBereich As Range
Dim vKriterium As Variant
With ThisWorkbook.Worksheets("Daten")
Set rBereich = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With
vKriterium = ThisWorkbook.Worksheets("Daten").Range("D30").Value
If WorksheetFunction.CountIf(rBereich, vKriterium) Then
' kommt vor
Else
MsgBox "ungueltige Artikelnummer"
End If
Gruess Hansueli

Anzeige
AW: Worksheets().Range in Verbindung mit letzter Zeile
07.02.2014 19:24:05
Franc
3 Fehler ^^
1.
Cells(Rows.Count, 1).End(xlUp) ist unvollständig
Um die letzte Zeile zu finden muss .row ergänzt werden also
Cells(Rows.Count, 1).End(xlUp).Row
2.
dann gehts aber immer noch nicht
Nehmen wir an die letzte Zeile ist 10, dann würde der Audrück diesen Bereich ergeben
Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp).Row)
Cells(1, 1) = A1
Cells(Rows.Count, 1).End(xlUp).Row = 10
Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp).Row) = Range("A1:10")
Wie wir sehen, fehlt die Spaltenangabe
3.
Du musst auch den Bereich eingrenzen, wo du es einfügst (bei mir stand ansonsten überall unterhalb der letzten Zeile "#nv"
Richtig ist (hab letzt zeile ausgelagert, damit es übersichtlicher wird
lLetzteZeile = Cells(Rows.Count, 1).End(xlUp).Row
Range("M1:M" & lLetzteZeile).Value = Worksheets("Daten").Range(Cells(1, 1), Cells(lLetzteZeile, 1)).Value
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Arbeiten mit Worksheets().Range und der letzten Zeile in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Bestimme die letzte Zeile in einem Bereich: Um die letzte Zeile mit Inhalt zu finden, kannst du den folgenden VBA-Code verwenden:

    Dim letzteZeile As Long
    letzteZeile = Cells(Rows.Count, 1).End(xlUp).Row
  2. Verwende Worksheets().Range: Um auf einen Bereich zuzugreifen, der von der ersten bis zur letzten Zeile reicht, nutze diesen Code:

    With ThisWorkbook.Worksheets("Daten")
       .Range(.Cells(1, 1), .Cells(letzteZeile, 1)).Copy
    End With
  3. Setze Werte in einen anderen Bereich: Um die Werte in eine andere Spalte zu übertragen, kannst du den folgenden Code verwenden:

    ActiveSheet.Range("M1:M" & letzteZeile).Value = Worksheets("Daten").Range(.Cells(1, 1), .Cells(letzteZeile, 1)).Value

Häufige Fehler und Lösungen

  • Unzureichende Referenzierung: Wenn du Range("M:M") verwendest, ohne das Arbeitsblatt zu referenzieren, kann es zu Problemen kommen. Stelle sicher, dass du die richtige Referenz hast:

    With ThisWorkbook.Worksheets("Daten")
       .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)).Copy
    End With
  • Fehlende Spaltenangabe: Wenn du Cells(Rows.Count, 1).End(xlUp) verwendest, vergiss nicht die .Row-Eigenschaft hinzuzufügen:

    letzteZeile = Cells(Rows.Count, 1).End(xlUp).Row

Alternative Methoden

  • Verwendung von Range.End: Du kannst die letzte Zeile auch mit Range("A1").End(xlDown).Row finden, allerdings kann dies zu unerwarteten Ergebnissen führen, wenn die Zelle unter A1 leer ist.

  • Zugriff auf ActiveSheet: Anstelle von ThisWorkbook.Worksheets kannst du auch ActiveSheet verwenden, um auf das aktuell aktive Blatt zuzugreifen. Dies kann jedoch zu Verwirrungen führen, wenn das falsche Blatt aktiv ist.


Praktische Beispiele

  • Kopieren eines Bereichs: Um einen Bereich von Zellen zu kopieren, der von der ersten bis zur letzten Zeile reicht, kannst du den folgenden Code verwenden:

    Dim letzteZeile As Long
    letzteZeile = Cells(Rows.Count, 1).End(xlUp).Row
    ActiveSheet.Range("M1:M" & letzteZeile).Value = Worksheets("Daten").Range("A1:A" & letzteZeile).Value
  • Zählen mit CountIf: Um zu überprüfen, ob ein bestimmter Wert in einem Bereich vorhanden ist, kannst du diesen Code verwenden:

    Dim vKriterium As Variant
    vKriterium = ThisWorkbook.Worksheets("Suche").Range("D30").Value
    If WorksheetFunction.CountIf(Worksheets("Daten").Range("A1:A" & letzteZeile), vKriterium) Then
       ' Wert gefunden
    Else
       MsgBox "Ungültige Artikelnummer"
    End If

Tipps für Profis

  • Verwende For Each Schleifen: Wenn du durch einen Bereich iterieren möchtest, kannst du For Each cell In Range verwenden, um jeden Wert einzeln zu verarbeiten.

  • Optimierung der Performance: Deaktiviere Bildschirmaktualisierung und automatische Berechnungen während der Ausführung deines Codes, um die Performance zu verbessern:

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    ' Dein Code hier
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

FAQ: Häufige Fragen

1. Wie finde ich die letzte Zeile einer bestimmten Spalte?
Verwende den Code letzteZeile = Cells(Rows.Count, 1).End(xlUp).Row, wobei die 1 die Spalte A repräsentiert. Ändere die Zahl für andere Spalten entsprechend.

2. Was ist der Unterschied zwischen .Row und .Value in VBA?
.Row gibt die Zeilennummer einer Zelle zurück, während .Value den Inhalt der Zelle wiedergibt.

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