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

Forumthread: Per VBA definierte Range verschieben

Per VBA definierte Range verschieben
23.08.2018 14:32:09
RK
Aloha Community.
Wie angehangene Datei zeigt verfügt meine Excel-Datei über zwei Registerblätter und je 3 Zeilen (1,4,7) in deren Spalten (A-H) Daten stehen. Ich möchte ein Makro schreiben, dass die Range zum zählen mit jedem Durchlauf um 3 Zeilen nach unten verschiebt. Diese Prozedur für beide Registerblätter.
Mein bestehendes Makro arbeitet die erste Zeile problemlos ab.
Möchte ich jedoch in meinem Makro die auskommendtierte Zeile verwenden, um die Verschiebung eingeben zu können, erhalte ich folgenden Fehler:
Laufzeitfehler 1004
Anwendungs- oder objektdefinierter Fehler

Makro:

Sub zählen()
Dim Range As Range
For i = 1 To Sheets.Count
Set ZRB = ThisWorkbook.Sheets(i)
Set Range = ZRB.Range("A1:H1")
'Set Range = ZRB.Range(Cells(1, 1), Cells(1, 8))
k = Application.WorksheetFunction.CountA(Range)
ZRB.Cells(1, 10) = k
Next
End Sub

Datei:
https://www.herber.de/bbs/user/123517.zip
Ich bitte um Hilfe.
Weiss mir keinen Rat mehr.
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Per VBA definierte Range verschieben
23.08.2018 14:45:41
Wolfgang

Set Range = Range(ZRB.Cells(1, 1), ZRB.Cells(1, 8))

sollte funktionieren
Gruß, Wolfgang
AW: Per VBA definierte Range verschieben
23.08.2018 14:58:23
RK
Vielen dank aber leider nicht.
Der Fehler lautet in diesem Fall:
Laufzeitfehler 91:
Objektvariable oder With-Blockvariable nicht festgelegt

Sub zählen()
Dim Range As Range
For i = 1 To Sheets.Count
Set ZRB = ThisWorkbook.Sheets(i)
'Set Range = ZRB.Range("A1:H1")
Set Range = Range(ZRB.Cells(1, 1), ZRB.Cells(1, 8))
k = Application.WorksheetFunction.CountA(Range)
ZRB.Cells(1, 10) = k
Next
End Sub

Anzeige
AW: Per VBA definierte Range verschieben
23.08.2018 15:33:05
RK
Ok, dein Ansatz funktioniert, allerdings hatte ich einen zusätzlicher Fehler.
Die Range darf nicht als Range definiert werden.
Das fertige Ergebnis sieht wie folgt aus:
Sub zählen()
Dim R As Range
For i = 1 To Sheets.Count
Set ZRB = ThisWorkbook.Sheets(i)
k = 0
For j = 0 To 2 'Zeilen durchlaufen
Set R = Range(ZRB.Cells(1 + k, 1), ZRB.Cells(1 + k, 8))
l = Application.WorksheetFunction.CountA(R)
ZRB.Cells(1 + k, 10) = l
k = k + 3
Next
Next
End Sub
Die Datei zum Nachvollziehen:
https://www.herber.de/bbs/user/123521.zip
Anzeige
mit OffSet und Resize
23.08.2018 19:02:01
Rudi
Hallo,
ich würde das so machen:
Set R = ZRB.Cells(1, 1).OffSet(k).Resize(,8)
Gruß
Rudi
;
Anzeige
Anzeige

Infobox / Tutorial

Per VBA definierte Range verschieben


Schritt-für-Schritt-Anleitung

Um eine per VBA definierte Range in Excel zu verschieben, kannst du folgendes Makro verwenden. Dieses Beispiel erfordert Excel mit VBA-Unterstützung:

Sub zählen()
    Dim R As Range
    For i = 1 To Sheets.Count
        Set ZRB = ThisWorkbook.Sheets(i)
        k = 0
        For j = 0 To 2 ' Zeilen durchlaufen
            Set R = ZRB.Range(ZRB.Cells(1 + k, 1), ZRB.Cells(1 + k, 8))
            l = Application.WorksheetFunction.CountA(R)
            ZRB.Cells(1 + k, 10) = l
            k = k + 3
        Next
    Next
End Sub

In diesem Code wird die Range mit Range(ZRB.Cells(1 + k, 1), ZRB.Cells(1 + k, 8)) definiert, wobei k die Verschiebung darstellt. Du kannst die For-Schleife anpassen, um die Range nach Bedarf zu erweitern.


Häufige Fehler und Lösungen

Hier sind einige häufige Fehler, die beim Arbeiten mit einer vba range auftreten können, sowie deren Lösungen:

  • Laufzeitfehler 1004: Anwendungs- oder objektdefinierter Fehler.

    • Lösung: Stelle sicher, dass die Range korrekt definiert ist. Verwende die Syntax Range(ZRB.Cells(...)), um sicherzustellen, dass du auf die richtige Zelle zugreifst.
  • Laufzeitfehler 91: Objektvariable oder With-Blockvariable nicht festgelegt.

    • Lösung: Überprüfe, ob die Range-Variable korrekt initialisiert wurde. Anstelle von Dim Range As Range solltest du eine andere Bezeichnung wählen, z.B. Dim R As Range, um Konflikte mit dem reservierten Wort "Range" zu vermeiden.

Alternative Methoden

Wenn du eine andere Methode zur Definition der Range ausprobieren möchtest, kannst du die Offset- und Resize-Methoden verwenden. Hier ist ein Beispiel:

Set R = ZRB.Cells(1, 1).Offset(k).Resize(, 8)

Dies verschiebt die Startzelle um k Zeilen nach unten und passt die Größe der Range auf 8 Spalten an.


Praktische Beispiele

Hier sind einige praktische Beispiele, die zeigen, wie du die Range in verschiedenen Szenarien verschieben kannst:

  1. Einfaches Zählen in einer Range:

    • Verwende die oben beschriebene Methode, um die Anzahl der nicht leeren Zellen in einer definierten Range zu zählen.
  2. Daten kopieren:

    • Du kannst die Werte aus einer Range in eine andere verschieben, indem du ZRB.Range("A1").Copy Destination:=ZRB.Range("A4") verwendest.

Tipps für Profis

  • Nutze die With-Anweisung, um den Code lesbarer zu gestalten:
With ZRB
    Set R = .Range(.Cells(1 + k, 1), .Cells(1 + k, 8))
End With
  • Achte darauf, die Range-Variablen sinnvoll zu benennen, um Verwirrung zu vermeiden. Anstatt "Range" ist "R" oder "DataRange" hilfreicher.

FAQ: Häufige Fragen

1. Wie kann ich die Range dynamisch anpassen?
Du kannst die Größe der Range anpassen, indem du die Werte in den Cells-Methoden änderst oder die Schleifen anpasst.

2. Was ist der Unterschied zwischen Offset und Resize?
Offset verschiebt die Startposition der Range, während Resize die Größe der Range anpasst, ohne die Startposition zu ändern.

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