ich habe eine Spalte mit 2 „Datenblöcken“, also Zellenbereiche die mit Daten gefüllt sind. Getrennt sind diese durch eine Leerzelle.
Nun möchte ich den oberen Datenblock einzeln markieren bzw. den unteren.
Soweit so gut!
Da es aber vorkommen kann das Daten (Zellen) hinzukommen oder wegfallen, kann ich nicht immer den gleichen Bereich markieren.
Wie schreibe ich es in VBA das er in der Spalte B alle Zellen bis zur Leerzelle markiert bzw. alle Zellen die danach kommen?
die folgende Lösung funktioniert nicht nur mit zwei, sondern mit beliebig vielen „Datenblöcken“, wie Du sie beschreibst. Die Sub „Markiere“ erledigt die Aufgabe. Sie erhält als Übergabeparameter die Nummer des Datenblocks und die Spaltennummer, auf das sich das Ganze bezieht. Ein Beispiel für den Aufruf steht in der Sub „Test“.
Ein Feedback, ob es geklappt hat, wäre schön.
Sub Test()
Markiere 1, 1
End Sub
Sub Markiere(Nr%, Spalte%)
Dim max%, i%, zAnf%, zEnd%, gefunden%
max = UsedRange.Rows.Count
If Nr = 1 Then zAnf = 1 Else zAnf = 0
zEnd = 0
gefunden = 0
For i = 1 To max + 1
If Cells(i, Spalte) = "" Then
gefunden = gefunden + 1
If (Nr \> 1) And (gefunden = Nr - 1) Then zAnf = i + 1
If gefunden = Nr Then
zEnd = i - 1
Exit For
End If
End If
Next
If (zAnf \> 0) And (zEnd \> 0) Then
Range(Cells(zAnf, Spalte), Cells(zEnd, Spalte)).Select
End If
End Sub
Hallo,
zur Beantwortung der Frage:
wenn ich das richtig verstanden habe, „Die Anzahl der Daten in der entsprechenden Spalte ist variabel“
In meinen Tabellen würde ich so verfahren:
„Der Leerzelle zwischen den Datenblöcken würde ich einen Inhalt geben. (z.B. **Block**)
Damit hat man bei der Suchroutine für beide Zellblöcke eine Start-Endposition.
Es können in beide Blöcke Zellen angehängt oder entfernt werden.
Falls ich Deine Frage falsch verstanden habe, nimm einfach Kontakt zu mir auf. [email protected]
Hier werden die Tastensprungfunktionen Strg+Pfeil-runter bzw. die damit verbundenen Markierungsmöglichkeiten Strg+Shift+Pfeil-runter verwendet. Meine Testblöcke haben folgenden Datenbereich:
Block: Zellen A1:A5
Block: Zellen A7:A10
Zelle A6 ist leer.
Beim nochmaligen ausführen werden beide Blöcke nacheinander selektiert.
Lang her dass ich das machte. Du kannst den inhalt der zelle abfragen. Wenn du eine mit inhalt „“ hast (also nichts im inhalt steht) ist die zelle leer.
Wie schreibe ich es in VBA das er in der Spalte B alle Zellen
bis zur Leerzelle markiert bzw. alle Zellen die danach kommen?
Das ist relativ einfach
Option Explicit
Sub Markiere()
Sheets(„DeinTabellenname“).Select 'Die korrekte Tabelle auswählen (falls nötig)
ActiveSheet.Range(„D1“).select 'Evtl. auf die korrekte Spalte anpassen - hier wird die erste Zelle in Spalte D ausgewählt
'Solange die aktuelle Zelle keinen Wert enthält, 1 Zeile weiter runter springen…
While Not ActiveCell.Value = „“
ActiveCell.Offset(1,0).Select
Wend
'Folgende Zeile wählt dann von Zelle D1 bis zur aktuellen markierten Zelle aus
ActiveSheet.Range(„D1:“ & ActiveCell.Address).Select
End Sub
Ich hoffe, ich konnte dir damit weiterhelfen. Das war ja zum Glück nur eine kleine Fingerübung
Wie schreibe ich es in VBA das er in der Spalte B alle Zellen
bis zur Leerzelle markiert bzw. alle Zellen die danach kommen?
hallo,
die genaue Art der Programmierung kann ich Dir leider nicht sagen, aber den Weg.
um den ersten Bereich der Zellen zu markieren, musst du über eine Schleife abfragen, welche Zelle leer ist und dann von Zelle 1 bis Leerzelle-1 markieren. der 2. Bereich wird mit Leerzelle+1 bis Ende markiert.
wie gesagt, den genauen Wortlaut kann ich dir leider nicht sagen, da ich zur Zeit im Urlaub bin und selbst erst ausprobieren müsste, aber vielleicht konnte ich wenigstens etwas helfen.
ich hoffe ich verstehe die frage richtig.
„eine Spalte mit 2 Datenblöcken“ verwirrt mich ein wenig…
Sub LoeschenBisZweiFrei()
'Range(„B1“).Select
Dim frei As Boolean
frei = False
Do Until frei And ActiveCell = „“
If ActiveCell = „“ Then
'löscht die aktuelle Zeile
Selection.EntireRow.Delete
frei = True
Else
'versetzt den cursor nach unten
ActiveCell.Offset(1, 0).Select
frei = False
End If
Loop
End Sub
Der Algorithmus funktioniert so:
.du markierst eine Zelle und startest.
.der algorithmus prüft die Zelle, ob sie leer ist
…ist sie nicht leer, nimmt er die nächste
…ist sie leer wird die Zeile gelöscht.
…war schon die vorherige leer, dann hört der algorithmus auf.
Wenn der Algorithmus immer in B1 (oder wo anders) anfangen soll, musst du das hochkomma der 2. zeile löschen.
Wenn der Algorithmus vertikal arbeiten soll musst du die 1 und die 0 bei „ActiveCell.Offset(1, 0).Select“ tauschen und wenn der Algorithmus von hinten nach vorn arbeiten soll, musst du die 1 durch -1 ersetzen.