Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1364to1368
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Felder prüfen

Felder prüfen
23.06.2014 15:18:49
aem
Hallo liebe Leute,
die Suche im Archiv hat mir schon oft weitergeholfen, nur diesmal nicht.
Ich habe ein Tabellenblatt, wo in der ersten Spalte die Positionnr ist und in den Darauffolgenden die Details. Generiert wurde die Liste von mir per VBA aus einer txt-datei. Handelt es sich um viele Details, wird in der nachfolgenden Zeile weiter geschrieben, etwa nach diesem Muster:
1 text 1 text 2 text 3
text 4
text 5
text 6
2 text 7 text 8 text 9
usw.
Das Ziel meines Teilskriptes ist die Bestimmung der Zellen zwischen 1 und 2, was in diesem Beispiel 3 wären:
For i = 7 To Zeilenanzahl
'Anzahl der leeren Zellen in Spalte A zwischen jedem Eintrag bestimmen
zähler1 = 0
For j = i + 1 To Zeilenanzahl
If InStr(Range("A" & j).text, " ") größer 0 Then
zähler1 = zähler1 + 1
MsgBox "Zähler +1"
End If
If zähler1 größer 0 Then
MsgBox zähler
End If
Next j
.
.
.
Next i
Die I-Schleife soll durch die ganze Tabelle laufen und die J-Schleife mit der Variablen zähler1 jedes Mal den Abstand zurück geben, nur krieg ichs einfach nicht auf die Reihe, weiß jemand Rat?
Achja, in den Zellen dazwischen befindet sich nicht NICHTS, sondern Leerzeichen, verursacht durchs Einlesen

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Felder prüfen
23.06.2014 18:07:29
Michael
Hi,
der eine Lösungsansatz könnte beim "Einlesen" mit VBA liegen: dann schreibst Du nur solche Zeilen, in denen auch Werte vorhanden sind, andere nicht.
Der Knackpunkt liegt in den Schleifen; mit for werden immer alle Werte durchlaufen, das ist ja in diesem Fall nicht erwünscht.
Der andere Knackpunkt ist die if-Abfrage. Sie findet natürlich auch in anderen Strings, z.B. 2 text 7 usw. Leerzeichen, die Schleife läuft also weiter als gedacht.
Abhilfe ist ein Vergleich mit einem geTRIMten string (alle Leerzeichen entfernt) mit dem Leerstring.
Zu guter Letzt bin ich ein Programmierer der alten Schule: soll heißen, es schüttelt mich, wenn Variablen Umlaute enthalten. Stelle Deinem Code bitte auch die Option explicit voran, dann findet VBA nämlich auch falsch geschriebene Variablennamen: bei Deiner unteren MsgBox fehlt die "1" nach zähler!
Sieht dann insgesamt so aus:
Option Explicit
Sub zaehlen()
Dim Zeilenanzahl, i, j, zähler1 As Integer
Zeilenanzahl = 12 ' nach Bedarf auskommentieren
i = 7
Do While i 
Ich seh grad, das option excpl. steht nicht im VBA-Rahmen, aber es gehört vor die erste s*u*b.
Schöne Grüße,
Michael

Anzeige
AW: Felder prüfen
24.06.2014 11:04:41
aem
Ich seh grad, dass meine Formatierung etwas schief gegangen ist.
Je mehr man das Problem in Teilaufgaben unterteilt, desdo einfacher wirds :-D
Ich hab eben erstmal über die Trim-Funktion die Zellen, in denen nur Leerzeichen stehen bereinigt, d.h. jetzt schau ich, ob die Zellen leer sind oder nicht, hab dazu die innere Schleife in eine Do while verändert:
For i = 7 To Zeilenanzahl
'Anzahl der leeren Zellen in Spalte A zwischen jedem Eintrag bestimmen
Zellenabstand = 0
j = i + 1
Do While ActiveSheet.Cells(j, 1) = "" And j 
Leider tut sich da auch nichts

Anzeige
AW: Felder prüfen
24.06.2014 16:05:01
aem
So, nachdem ich einfach auf die falsche Mappe geschaut habe, hier nochmal die ganze Lösung:
Sub Tabelle_generieren()
Dim Dateiname, Dateipfad, Tabellenende, Datensatz(50) As String, i, j, k, l, Länge_Datensatz, Lä _
nge_Datenabstand As Integer
Dateipfad = Hilfsfunktionen.Dateipfad_einlesen
Dateiname = Hilfsfunktionen.Dateiname_einlesen
Tabellenende = Workbooks("Prototyp_v1.xlsm").Sheets(2).UsedRange.SpecialCells( _
xlCellTypeLastCell).Row
Application.DisplayAlerts = False
Application.ScreenUpdating = False
'Tabelle auswählen und kopieren
Sheets(6).Select
Sheets(6).Copy
'Zielblatt entsprechend Verzeichnis und Dateiname speichern
ActiveWorkbook.SaveAs Filename:=Dateipfad & "\" & Dateiname & ".xls", FileFormat:=xlNormal,  _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False
'Ziellisten Überschrift benennen
Sheets(1).Cells(1, 8) = Dateiname
'Zieltabellenzähler(l) auf Startpunkt setzen
l = 4
'Per Schleife Datensatz einlesen und in Zieltabelle schreiben
For i = 7 To Tabellenende
'Array und Zwischenzähler rücksetzen
For j = 1 To 50
Datensatz(j) = ""
Next j
Länge_Datenabstand = 0
'Datensatz in Array zwischenspeichern
Datensatz(1) = Workbooks("Prototyp_v1.xlsm").Sheets(2).Cells(i, 1).Value
Datensatz(2) = Workbooks("Prototyp_v1.xlsm").Sheets(2).Cells(i, 2).Value
Datensatz(3) = Workbooks("Prototyp_v1.xlsm").Sheets(2).Cells(i, 3).Value
Datensatz(4) = Workbooks("Prototyp_v1.xlsm").Sheets(2).Cells(i, 4).Value
Datensatz(5) = Workbooks("Prototyp_v1.xlsm").Sheets(2).Cells(i, 5).Value
Datensatz(6) = Workbooks("Prototyp_v1.xlsm").Sheets(2).Cells(i, 6).Value
Datensatz(7) = Workbooks("Prototyp_v1.xlsm").Sheets(2).Cells(i, 7).Value
Datensatz(8) = Workbooks("Prototyp_v1.xlsm").Sheets(2).Cells(i, 8).Value
'als Hilfe Anzahl der leeren Zellen in Spalte A zwischen jedem Eintrag bestimmen
For k = i + 1 To Tabellenende
If Workbooks("Prototyp_v1.xlsm").Sheets(2).Cells(k, 1).Value = "" Then
Länge_Datenabstand = Länge_Datenabstand + 1
Länge_Datensatz = 8 + Länge_Datenabstand
Datensatz(Länge_Datensatz) = Workbooks("Prototyp_v1.xlsm").Sheets(2).Cells(k, 8).Value
End If
If Not Workbooks("Prototyp_v1.xlsm").Sheets(2).Cells(k, 1).Value = "" Then
Exit For
End If
Next k
'Von Array in Zieltabelle entsprechend Formatierung schreiben
ActiveWorkbook.Sheets(1).Cells(l, 10) = Datensatz(1)
ActiveWorkbook.Sheets(1).Cells(l, 3) = Datensatz(3)
ActiveWorkbook.Sheets(1).Cells(l, 12) = Datensatz(8)
ActiveWorkbook.Sheets(1).Cells(l, 6) = Datensatz(9)
ActiveWorkbook.Sheets(1).Cells(l, 8) = Datensatz(10)
ActiveWorkbook.Sheets(1).Cells(l, 9) = Datensatz(11)
ActiveWorkbook.Sheets(1).Cells(l, 4) = Datensatz(12)
ActiveWorkbook.Sheets(1).Cells(l, 5) = Datensatz(13)
'Zieltabellenzähler(l) und Ausgangstabellenzähler(i) hochzählen
l = l + 1
i = i + Länge_Datenabstand
Next i
'Zielblatt entsprechend Verzeichnis und Dateiname erneut speichern, dann alles schliessen
ActiveWorkbook.SaveAs Filename:=Dateipfad & "\" & Dateiname & ".xls", FileFormat:=xlNormal,  _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False
ActiveWorkbook.Close
Sheets(1).Select
Sheets(2).Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige