# Excel: Zeilen selektieren und löschen



## vrodo23 (21. April 2009)

Hallo : ) 

Ich habe folgendes Problem:
Eine Messroutine liefert eine Ausgabedatei (.xls). 
Sie hat folgenden Aufbau: 
Die Spaltenanzahl x ist pro Zeile gleich groß (immer gefüllt). 
Zu den Zeilen: die Datei beginnt immer mit 3 Zeilen header. 
Dann folgt 1 Zeile Datensatz.
Dann kommen wieder 3 Zeilen header.
Dann wieder 1 Zeile Datensatz u.s.w..
Der header wird nur einmal (zu Beginn) benötigt, 
nachfolgende header können (weil redundant) verworfen werden. 
Hinter dem ersten header werden nur die Datensätze benötigt!
Ich muss also alle header, außer den ersten, löschen, so dass im Endeffekt nur die Datensätze (und ein header davor) übrig bleiben. 
Ich möchte das ganze aber aus der Quelldatei in eine neue Datei schreiben oder 
die Quelle zu Beginn umbenennen/kopieren, so dass in jedem Fall das Original erhalten bleibt. Kann man das ganze automatisieren?
Als Makro habe ich das in Excel nicht hinbekommen, bin allerdings auch blutiger Einsteiger, 
und durch VBA schaue ich noch nicht durch. 
Im Prinzip müsste es doch ungefähr so sein (angenommen, ich lösche in einer Kopie der Quelldatei alles das raus, was ich nicht benötige):

setvar zeile x (die Zeilennummer, ab der gestartet werden soll, also 5)
while löschbedingung = erfüllt do
          in Zeile x gehen
          Zeilen x, x+1, x+2 löschen (also 5, 6 + 7)
          setvar zeile „zeile“ + 1 (also 5 + 1 = 6)
endwhile

Kann man das in VBA programmieren?
Könnte mir vielleicht jemand helfen die Syntax zu übersetzen?

Ich bin für jede Hilfe sehr dankbar.

Viele Grüße,
Volker


----------



## DrSoong (21. April 2009)

Du könntest das ganze in einen String speichern, dabei liest du immer nur jede 4 Zeile aus:

```
Dim sInhalt As String, sTemp As String
 lZeile = 4
 Do
  sTemp = ""
  For cnt = 1 To 10 'deine Spaltenzahl
   sTemp = sTemp & Cells(lZeile, cnt) & "|" 'ich nehm das "|" hier als Spaltentrenner
  Next cnt
  sTemp = Left(sTemp, Len(sTemp) - 1)
  If Len(sTemp) < 10 Then Exit Do
  sInhalt = sInhalt & sTemp & vbNewLine 'Neue Zeile als Zeilentrenner
  lZeile = lZeile + 4
 Loop
```

Du könntest die Werte in der Prozedur gleich in ein neues Sheet schreiben, alternativ kannst du in einer anderen Sub den Text am Zeilenumbruch splitten und in ein Sheet schreiben.


Der Doc!


----------



## vrodo23 (21. April 2009)

Hallo Doc. 

Vielen Dank für Deine Antwort.
Ich habe Dein Skript in ein leeres Makro (leer aufgezeichnet) kopiert, 
die Spaltenanzahl geändert (20) und ausgeführt. 
Excel hängt sich dann auf und zieht bis zu 80% CPU. 
Bei ner kleinen Datei von nur 20 Zeilen Länge müsst er doch fix durch sein, oder? 
Ich mache wahrscheinlich etwas falsch
Und noch eine Frage: angenommen, es würde sich nicht aufhängen, 
wie komme ich an den Inhalt der Variablen sInhalt und schreibe ihn in ein neues sheet hinein?

Grüße, Volker


----------



## DrSoong (21. April 2009)

Ist es dir möglich, ein Excel-File mit dem Code und deinen Beispieldaten hier hochzuladen (in einem ZIP, da Excel nicht bei den Erweiterungen hier dabei ist)? So kann ich sehen, wo es bei dir krankt.


Der Doc!


----------



## vrodo23 (21. April 2009)

Hallo Doc. 

Anbei das Zip File!

Grüße, 
Volker


----------



## DrSoong (21. April 2009)

Hi,

im Anhang das korrigierte Excel-File (die Word-Datei ist nicht notwendig, da der VBA-Code in das Excel-File gehört).

Wenn du noch Fragen hast, poste deine Fragen dann einfach hier.


Der Doc!


----------



## vrodo23 (22. April 2009)

Moin Doc. 

DANKE Funktioniert super und Du hast mir SEHR geholfen : ) 

Gruß, Volker


----------

