hallo.
ich folgendes kompliziertes problem (echt nur was für leute die zeit haben ).
die aufgabenstellung ist etwas verwirrend find ich, aber lest doch bitte selbst:
Es ist ein Visual-Basic-Programm zu schreiben.
Eingabe von 12 Wertepaaren (Monat + Temperatur), Überprüfung der eingegebenen Daten auf Plausibilität, Speicherung der Daten in einer Datei; außerdem soll es möglich sein, daß die gespeicherten Daten – aus der Datei - wieder ins Programm eingelesen werden können.
Dieser Teil ist Ihre Aufgabe.
Das Visual-Basic-Projekt erhält den Namen: DatenPaare, 2 Formulare: frmDatenPaare + frmDiagram. Das „Layout“ des Programms ist folgendermaßen gestaltet (siehe auch vorgegebenes Projekt, das verbindlich ist!):
Es enthält einen Hinweis (lblHinweis), in dem einerseits die Funktion (Fähigkeiten) des Programms beschrieben wird und andererseits dem Anwender beschrieben wird, in welcher Weise er das Programm benutzen muß/kann.
Es enthält ein Textfeld (txtDatenPaare) + Überschrift dazu (lblTitelzuTxtDatenPaare), in das der Anwender 12 Datenpaare eingeben kann/muß in der Form: Monatsname (min. 3 Buchstabe) „;“ Temperaturwert (zwischen -30 und 40 Grad einschließlich). Die Überprüfung der eingegebenen Daten wird mit einem Knopf (btnDtnCheck) gestartet.
Es enthält 3 „Aktionsknöpfe“: Daten speichern (btnDtnSave) Daten lesen (btnDtnRead) + Diagramm (btnDiagram); außerdem den Knopf Ende (btnEnde)
Die Prüfung der Eingaben soll mit „Anklicken eines Knopfes“ (btnDtnCheck) gestartet werden.
Die Prüfung umfaßt: Die Datenpaare sind zeilenweise in der Form „Mon ; Temp.’wert z.B. 12,000 ‚Entertaste’=Zeilenende“ einzugeben und dementsprechend die (abwechselnde) Eingabe von „;“ + Entertaste (vbNewLine) zu überprüfen.
Leerzeichen vor oder nach den eingegebenen Daten sind zu entfernen.
Der Anwender muß mindestens 3 Buchstaben für den Monatsnamen eingeben, d.h. werden mehr als 3 Buchstaben eingegeben, werden nur die ersten 3 im Programm weiter verwendet. Doppelte „3-buchstabige“ Monatsnamen sind mit entsprechender Meldung zu monieren. Zur Überprüfung soll eine Funktion (monatsEingabeOk()) benutzt werden.
Die Temperaturwerte sind als „Single“ deklariert und dementsprechend als numerisches Datum zu überprüfen. „Unsere“ Funktion „eingabeOk()“ ist zu benutzen – natürlich entsprechend angepaßt (Namensänderung: numEingabeOk())! Auch „unsere“ anderen Funktionen sollten Sie benutzen (eventuell entsprechend angepaßt). Daneben soll die Zahleneingabe formatiert werden und zwar in der Form „#0.000“ – Dezimalzeichen im Textfeld „,“, im Programm „.“.
Es müssen genau 12 Datenpaare eingegeben werden; nicht weniger + nicht mehr.
Bei/während der Prüfung (d.h. bevor die Datenpaare gespeichert werden) sollen die Datenpaare in passenden Variablen „zwischengespeichert“ werden. Dabei ist zu berücksichtigen, daß die „Zwischenspeicherung“ im Programm so erfolgen soll, daß das Programm leicht/einfach auf beispielsweise 30 oder 100 Datenpaare erweitert/geändert werden kann. Hinweis: Konstantenvereinbarung „Const maxDatenPaare As Integer = 12“
Im Fall eines Eingabefehlers soll eine passende Fehlermeldung mit Berichtigungshinweis erfolgen + die „Fehlerstelle“ (Fehlerzeile) markiert werden (siehe auch „unsere“ Funktion „fehlerGemeldet()“ – natürlich entsprechend angepaßt).
Wenn die Prüfung der Daten ohne Fehler geblieben ist, sind die Daten in einer “Randomdatei“ zu speichern, deren vollständiger Name (mit Laufwerksbuchstabe + Pfad + Dateityp) einer Variablen (Dim datenPaareDatei As String) zugewiesen wird. Der Dateityp dieser Datei soll „MOTE“ (Const dateiTyp = ".MOTE") heißen. Für die Datensätze der Datei sind die Definitionen:
Private Type datenPaareSatz
monat As String
temperatur As Single
End Type und
Dim datenPaar As datenPaareSatz zu verwenden.
Falls beim Schreiben der Datei Fehler auftreten, soll eine entsprechende Fehlermeldung den Anwender darüber informieren
Außerdem soll es möglich sein, daß der Anwender die in einer Datei gespeicherten Datenpaare wieder ins Programm ins Textfeld (txtDatenPaare) einlesen kann (Knopf: btnDtnRead), um die Daten anzusehen oder zu edieren.
Falls beim Lesen der Datei Fehler auftreten, soll eine entsprechende Fehlermeldung den Anwender darüber informieren
Die Steuerung zur Aktivierung/Deaktivierung der Knöpfe (btnSoundso.Enabled = false/true) soll folgendermaßen erfolgen:
Zu Anfang sind die Knöpfe „btnDtnSave“ + „btnDiagram“ nicht aktiv. Erst nach positiver Überprüfung der Datenpaare ist der Knopf „btnDtnSave“ frei zu geben und nach erfolgreicher Abspeicherung der Daten in einer Datei der Knopf „btnDiagram“.
Falls die Daten aus einer Datei eingelesen werden + der Anwender die eingelesenen Daten ändert/ediert, sollen die Knöpfe „btnDtnSave“ + „btnDiagram“ wieder gesperrt werden und erst wieder nach erfolgter (+erfolgreicher) Prüfung bzw. Speicherung frei gegeben werden - wie „zu Anfang“; werden die Daten nur aus einer Datei eingelesen (ohne Edierung), sollen nach erfolgreichem Lesen der Datei die Knöpfe „btnDtnSave“ + „btnDiagram“ frei gegeben werden.
Das Projekt „DatenPaare“ mit den Visual-Basic-Dateien: DatenPaare.vbp, DatenPaare.vbw sowie frmDatenPaare.frm und frmDiagram.frm ist – in der neuesten/letzten Version - für die Lösung der Aufgabe zu benutzen.
PS: Im Programm Ist die Klausel „Option Explicit“ zu benutzten, d.h. alle Daten/Parameter sind explizit mit einem Datentyp, mit dem die Daten/Parameter im Programm verwendet werden sollen, zu typisieren. - Daraus folgt, daß der Datentyp „Variant“ nicht benutzt werden darf!
soweit die theorie
ich hab nun hier mal eine lösung, allerdings erscheint mir die recht langatmig.
wer hätte einen anderen lösungsvorschlag??? oder könnte das programm hier vereinfacht schreiben??? bin für jede hilfe zu tiefst dankbar, hab nämlich nicht wirklich viel ahnung von VB
Lösung 1:
Option Explicit
Const dateiTyp = ".MOTE"
Const maxDatenPaare As Integer = 12
Const maxTemp As Single = 40
Const minTemp As Single = -30
Private Type datenPaareSatz
monat As String
temperatur As Single
End Type
Dim datenPaar(maxDatenPaare) As datenPaareSatz 'Google sei Dank: Datenfeld definiert mit maxDatenPaare-Anzahl als Größe
Dim datenPaareDatei As String
Dim errNr As Long
Dim anzSemis As Integer
Dim anzNewLines As Integer
Dim eingabeFehler As Boolean
Dim zeichenLaenge As Integer
'***********************************************************************************
Private Sub Form_Load()
lblHinweis.Caption = "Das Programm -DatenPaare- speichert Ihre eingegebenen Daten in Paaren in einer Randomdatei des Types -MOTE-" _
& ", die Sie benötigen, um sich Ihre Daten als Grafik anzeigen zu lassen. Dazu ist es notwendig, dass Sie folgende Regeln bei der Eingabe beachten: " _
+ vbNewLine + vbNewLine + " Sie können 12 Datenpaare eingeben (je eine Monat mit der dazugehörigen Temperatur). " _
+ vbNewLine + " Die Dateneingabe muss in diesem Format erfolgen: mmm;#0,000" + vbNewLine + " Die Monatsbezeichnung -mmm- muss min. drei Zeichen enthalten und darf sich nicht wiederholen." _
+ vbNewLine + " Monat und Temperatur muss mit einem -;- getrennt werden." + vbNewLine + " Die Temperatur muss im Intervall von 40 bis -30°C liegen und kann drei Nachkommastellen haben." _
+ vbNewLine + " Der Temperaturwert muss mit Komma statt Punkt geschrieben werden." + vbNewLine + " Jedes Paar muss in eine extra Zeile im Textfeld geschrieben werden." _
+ vbNewLine + " Jede Zeile muss mit -Return- beendet werden." + vbNewLine + " Überzählige Zeichen des Monats oder Nachkommastellen" _
+ "der Temperatur werden abgeschnitten." + vbNewLine + vbNewLine + " Haben Sie die Eingabe der 12 Datenpaare beendet, drücken Sie bitte den Knopf - Dateneingabe abschließen-." _
+ " Daraufhin führt das Programm eine Überprüfung der Eingabe durch und bittet Sie gegebenenfalls Fehler zu korrigieren. Ist die Prüfung erfolgreich verlaufen, wird der Knopf -Daten speichern- aktiviert." _
+ "Bei dessen Betätigung speichern Sie Ihre Daten in einer Randomdatei, die Sie im erscheinenden Fenster auswählen oder erstellen können. " + vbNewLine + " Nach erfolgreicher Speicherung aktiviert sich der Knopf -Diagramm- über" _
+ " den Sie zu der graphischen Darstellung Ihrer Daten gelangen. Ist bereits eine -MOTE--Datei vorhanden, können Sie diese über den Knopf -Daten lesen- suchen und aufrufen. Die Daten werden im Textfeld sichtbar," _
+ "und Sie haben die Möglichkeit, Änderungen durchzuführen. Diese müssen allerdings ebenfalls erst geprüft und neu abgespeichert werden, bevor Sie sie im Diagramm betrachten können. " + vbNewLine + _
vbNewLine + " Viel Erfolg mit -DatenPaare-!"
End Sub
Private Sub btnDtnCheck_Click()
Dim anzSemis As Integer
Dim anzNewLines As Integer
lblStatus.Caption = ""
If trennZchnOk(txtDatenPaare, anzSemis, anzNewLines) Then
If monatsEingabeOk(txtDatenPaare, datenPaar) Then
If numEingabeOk(txtDatenPaare, datenPaar) Then
btnDtnSave.Enabled = True
End If
End If
End If
End Sub
Private Sub btnDtnSave_Click() ' Btn Daten speichern
Dim i As Integer
'Debug.Print "dateiname: " + dateiName
If dateiName = "" Then 'falls keine Datei ausgewählt
Exit Sub
Else
datenPaareDatei = dateiName 'Pfad + name
Open datenPaareDatei For Random As #1 'Len = Len(data)
For i = 0 To maxDatenPaare - 1
Put #1, i + 1, datenPaar(i) 'zeilenweise abspeichern
Next
Close #1
btnDiagram.Enabled = True
lblStatus.Caption = "Datenspeicherung erfolgreich abgeschlossen!"
End If
End Sub
Private Sub btnDtnRead_Click() 'Btn Daten lesen
Dim i As Integer
lblStatus.Caption = ""
datenPaareDatei = dateiName 'Funktion für Dateiauswahlfenster
If datenPaareDatei = "" Then 'falls keine Datei ausgewählt
Exit Sub
Else
txtDatenPaare.Text = "" 'Textfeld löschen
Cls
Open datenPaareDatei For Random As #1 'Len = Len(data)
For i = 0 To maxDatenPaare - 1
Get #1, i + 1, datenPaar(i) 'zeilenweise lesen
txtDatenPaare.Text = txtDatenPaare.Text + datenPaar(i).monat + ";" + CStr(datenPaar(i).temperatur) + vbNewLine
Next 'als string wieder hinschreiben
Close #1
End If
btnDtnSave.Enabled = True
btnDiagram.Enabled = True
End Sub
Private Function monatsEingabeOk(ByVal txtDatenFeld As Object, ByRef datenPaar() As datenPaareSatz) As Boolean
Dim datenPaarZeile() As String
Dim monatsString As String
Dim posSemi As Integer
Dim monats As String
Dim monatDoppelt As Integer
Dim i As Integer
Dim j As Integer
Dim fehler As Boolean
monatsEingabeOk = True
posSemi = 1
zeichenLaenge = 0
datenPaarZeile = Split(txtDatenFeld.Text, vbNewLine) 'Lob an Google! spaltet Text in Zeilen am return
For i = 0 To maxDatenPaare - 1 'Schleife: zeilenweise spalten
Debug.Print datenPaarZeile(i)
zeichenLaenge = zeichenLaenge + Len(datenPaarZeile(i + 1)) + 2
If InStr(datenPaarZeile(i), ";") Then 'falls kein Semikolon in der Zeile
If InStr(posSemi, datenPaarZeile(i), ";") > 0 Then 'falls kein monat eingegeben
posSemi = InStr(posSemi, datenPaarZeile(i), ";") - 1 'findet ";" und merkt sich Position
monatsString = Left$(datenPaarZeile(i), posSemi) 'links neben ";" = monat
monats = Trim$(monatsString) 'monat ohne Leerzeichen
Debug.Print "-"; monats; "-"
Else
txtDatenPaare.SetFocus
monatsEingabeOk = False
fehler = datenFehlerGemeldet(txtDatenPaare, "Monatsbezeichnung fehlt!", ">>> min. 3 Zeichen eingeben!")
Exit Function
End If
Else
txtDatenPaare.SetFocus
monatsEingabeOk = False
fehler = datenFehlerGemeldet(txtDatenPaare, "Semikolon fehlt in dieser Zeile!", ">>> Datenpaar mit Semikolon trennen!")
Exit Function
End If
If Len(monats) < 3 Then 'meckern bei weniger als 3 Zeichen
txtDatenPaare.SetFocus
monatsEingabeOk = False
fehler = datenFehlerGemeldet(txtDatenPaare, "In der Zeile ist die Monatsbezeichnung zu kurz!", ">>> mind. drei Zeichen eingeben!")
Exit Function
End If
If Len(monats) > 3 Then 'nach 3 Zeichen abschneiden
monats = Left$(datenPaarZeile(i), 3)
End If
For j = 0 To i - 1 'Prüfung, ob Monat doppelt: Schleife in Schleife: erst vom Anfang bis jetzige Zeile
monatDoppelt = InStr(datenPaarZeile(j), monats)
If monatDoppelt > 0 Then
txtDatenPaare.SetFocus
monatsEingabeOk = False
fehler = datenFehlerGemeldet(txtDatenPaare, "Die Monatsbezeichnung ist doppelt!", ">>> andere Bezeichnung eingeben!")
Exit Function
End If
Next
For j = i + 1 To maxDatenPaare - 1 'Prüfung, ob Monat doppelt: dann von jetziger Zeile bis Ende Text
monatDoppelt = InStr(datenPaarZeile(j), monats)
If monatDoppelt > 0 Then
txtDatenPaare.SetFocus
monatsEingabeOk = False
fehler = datenFehlerGemeldet(txtDatenPaare, "Die Monatsbezeichnung ist doppelt!", ">>> andere Bezeichnung eingeben!")
Exit Function
End If
Next
datenPaar(i).monat = monats 'nach Prüfung in Datenfeld schreiben
Next 'Schleife zu ende
End Function
Private Function numEingabeOk(ByVal txtDatenFeld As Object, ByRef datenPaar() As datenPaareSatz) As Boolean
Dim datenPaarZeile() As String
Dim tempWert As String
Dim tempZahl As String
Dim tZahl As Single
Dim posNewLine As Integer
Dim posSemi As Integer
Dim tZahlLong As Long
Dim fehler As Boolean
Dim i As Integer
posNewLine = 1
posSemi = 1
zeichenLaenge = 0
datenPaarZeile = Split(txtDatenFeld.Text, vbNewLine) 'Lob an Google! spaltet Text in Zeilen am return
For i = 0 To maxDatenPaare - 1 'Schleife: zeilenweise spalten
posNewLine = InStr(posNewLine, txtDatenFeld.Text, Chr(Asc(vbNewLine))) + 1 'Position return
posSemi = InStr(posSemi, datenPaarZeile(i), ";") - 1 'Position ";"
tempWert = Mid$(datenPaarZeile(i), posSemi + 2, posNewLine - posSemi - 1) 'Temperatur = nach ";" und Position return minus Position ";" lang
zeichenLaenge = zeichenLaenge + Len(datenPaarZeile(i + 1)) + 2
tempZahl = Trim(tempWert) 'Leerzeichen weg
If Len(tempZahl) = 0 Then
txtDatenPaare.SetFocus
numEingabeOk = False 'meckern wenn nix geschrieben
fehler = datenFehlerGemeldet(txtDatenPaare, "Die Temperatureingabe fehlt!", ">>> Temperatur eingeben!")
Exit Function
ElseIf InStr(1, tempZahl, ".") Then 'EingabeOk
numEingabeOk = False
fehler = datenFehlerGemeldet(txtDatenPaare, "falsches Trennzeichen!", ">>> Bitte nur Trennzeichen """", """" eingeben!")
txtDatenPaare.SetFocus
numEingabeOk = False
Exit Function
ElseIf InStr(1, tempZahl, "(") Or InStr(1, tempZahl, ")") Then
fehler = datenFehlerGemeldet(txtDatenPaare, "falsche Temperatureingabe!", ">>> Bitte nur Ziffern 0-9 eingeben!")
txtDatenPaare.SetFocus
numEingabeOk = False
Exit Function
ElseIf Not IsNumeric(tempZahl) Then
fehler = datenFehlerGemeldet(txtDatenPaare, "falsche Temperatureingabe!", ">>> Bitte nur Ziffern 0-9 eingeben!")
txtDatenPaare.SetFocus
numEingabeOk = False
Exit Function
ElseIf InStr(1, tempZahl, ",") Then 'Komma intern ersetzen
tempZahl = Replace(tempZahl, ",", ".")
End If
On Error Resume Next
tZahl = Val(tempZahl) 'in Zahl umwandeln
errNr = Err.Number
On Error GoTo 0
If errNr <> 0 Then
Select Case errNr
Case 6
numEingabeOk = False
fehler = datenFehlerGemeldet(txtDatenPaare, "Zahl zu groß!", ">>> Temperaturen müssen zwischen 40 und -30°C liegen!")
Exit Function
Case Else
MsgBox "unbekannter Fehler!"
End Select
numEingabeOk = False
Exit Function
Else
numEingabeOk = True
End If
If tZahl > maxTemp Or tZahl < minTemp Then 'Prüfung, ob Temp im Intervall
fehler = datenFehlerGemeldet(txtDatenPaare, "Temperaturwert liegt nicht im Intervall!", ">>> Temperaturen müssen zwischen 40 und -30°C liegen!")
txtDatenPaare.SetFocus
numEingabeOk = False
Exit Function
Else
tZahl = tZahl * 1000 'irgendwie auf 3 Nachkommastellen trimmen
tZahlLong = CLng(tZahl)
tZahl = tZahlLong / 1000
End If
datenPaar(i).temperatur = tZahl 'nach Prüfung in Datenfeld schreiben
Debug.Print "-"; datenPaar(i).temperatur; "-"
Next 'Schleife zu ende
End Function
Private Function datenFehlerGemeldet(txtDatenPaare As Object, ByVal fehlerTxt As String, ByVal hinweisTxt As String) As Boolean
txtDatenPaare.SetFocus
txtDatenPaare.SelStart = zeichenLaenge
MsgBox fehlerTxt + vbNewLine + vbNewLine + hinweisTxt
datenFehlerGemeldet = True
End Function
Private Sub txtDatenPaare_Change()
btnDtnSave.Enabled = False 'wenn Textfeld geändert
btnDiagram.Enabled = False 'Btn ausschalten
lblStatus.Caption = "" 'u. Anzeige löschen
End Sub
Private Function dateiName() As String 'liefert Dateiname einschließlich Pfad + Laufwerk
On Error Resume Next
fdiaDateiAuswahl.CancelError = True 'fkt. kopiert aus ProSplit
fdiaDateiAuswahl.DialogTitle = "Datei auswählen"
fdiaDateiAuswahl.Filter = ".MOTE | *.MOTE"
fdiaDateiAuswahl.Flags = cdlOFNFileMustExist
fdiaDateiAuswahl.ShowOpen
If Err = 0 Then
dateiName = fdiaDateiAuswahl.FileName
Else
dateiName = ""
End If
On Error GoTo 0
End Function
'***********************************************************************************
Private Sub btnDiagram_Click()
frmDiagram.Visible = True
frmDatenPaare.Visible = False
End Sub
Private Sub btnEnde_Click()
End
End Sub
Private Function fehlerGemeldet(txtDatenPaare As Object, ByVal fehlerTxt As String, ByVal hinweisTxt As String, ByVal anfZle As Integer, ByVal endeZle As Integer) As Boolean
Dim posSemi As Integer
Dim posNewLine As Integer
Dim anzSemis As Integer
Dim anzNewLines As Integer
Debug.Print "anfZle " & anfZle
Debug.Print "endeZle " & endeZle
txtDatenPaare.SetFocus
txtDatenPaare.SelStart = anfZle
If anfZle > endeZle Then
txtDatenPaare.SelStart = endeZle
End If
MsgBox fehlerTxt + vbNewLine + vbNewLine + hinweisTxt
fehlerGemeldet = True
End Function
Private Function trennZchnOk(txtDatenFeld As Object, ByRef anzSemis As Integer, ByRef anzNewLines As Integer) As Boolean
Dim posSemi As Integer
Dim posNewLine As Integer
Dim anfZle As Integer
Dim endeZle As Integer
Dim fehler As Boolean
trennZchnOk = True
posSemi = 1
posNewLine = 1
anfZle = 0
endeZle = 1
anzSemis = 0
anzNewLines = 0
While (InStr(posSemi, txtDatenFeld.Text, ";") > 0) Or (InStr(posNewLine, txtDatenFeld.Text, vbNewLine) > 0)
If (InStr(posSemi, txtDatenFeld.Text, ";") > 0) Then
anzSemis = anzSemis + 1
posSemi = InStr(posSemi, txtDatenFeld.Text, ";") + 1
endeZle = posSemi
End If
If (InStr(posNewLine, txtDatenFeld.Text, Chr(Asc(vbNewLine))) > 0) Then
anzNewLines = anzNewLines + 1
posNewLine = InStr(posNewLine, txtDatenFeld.Text, Chr(Asc(vbNewLine))) + 1
' endeZle = posNewLine - 1 funktioniert nicht so recht1
endeZle = posNewLine - 2
End If
If (anzSemis < anzNewLines) Or ((posSemi > posNewLine) And (anzSemis = anzNewLines)) Then
fehler = fehlerGemeldet(txtDatenPaare, "in der Zeile fehlt ein Semikolon!", ">>> Semikolon eingeben!", anfZle, endeZle)
trennZchnOk = False
Exit Function
End If
If ((anzSemis > anzNewLines + 1) And (posNewLine < posSemi)) Or ((anzSemis > anzNewLines) And (posNewLine > posSemi)) Then
fehler = fehlerGemeldet(txtDatenPaare, "in der Zeile ist ein (oder mehrere) Semikolon zu viel!", ">>> Semikolon löschen!", anfZle, endeZle)
trennZchnOk = False
Exit Function
End If
If (anzSemis > maxDatenPaare) Or (anzNewLines > maxDatenPaare) Then
fehler = fehlerGemeldet(txtDatenPaare, "Zu viele Zeilen!", ">>> nur 12 Zeilen/ Datenpaare eingeben!", anfZle, endeZle)
trennZchnOk = False
Exit Function
End If
anfZle = posNewLine
endeZle = posNewLine
Wend
If (anzSemis < maxDatenPaare) Or (anzNewLines < maxDatenPaare) Then
fehler = fehlerGemeldet(txtDatenPaare, "Zeilen fehlen!", ">>> bitte 12 Zeilen/ Datenpaare eingeben!", anfZle, endeZle)
trennZchnOk = False
End If
If (anzSemis >= maxDatenPaare) Or (anzNewLines >= maxDatenPaare) Then
If Len(txtDatenFeld.Text) > endeZle Then
fehler = fehlerGemeldet(txtDatenPaare, "zu viele Daten!", ">>> nur 12 Zeilen/ Datenpaare eingeben!", anfZle, endeZle)
trennZchnOk = False
End If
End If
Debug.Print "anfZle " & anfZle
Debug.Print "nach while posSemi " & posSemi & " anzSemis " & anzSemis
Debug.Print "nach while posNL " & posNewLine & " anzNL " & anzNewLines
End Function
im anhang befindet sich das original programm..........dickes danke schonmal.
mfg alex
ich folgendes kompliziertes problem (echt nur was für leute die zeit haben ).
die aufgabenstellung ist etwas verwirrend find ich, aber lest doch bitte selbst:
Es ist ein Visual-Basic-Programm zu schreiben.
Eingabe von 12 Wertepaaren (Monat + Temperatur), Überprüfung der eingegebenen Daten auf Plausibilität, Speicherung der Daten in einer Datei; außerdem soll es möglich sein, daß die gespeicherten Daten – aus der Datei - wieder ins Programm eingelesen werden können.
Dieser Teil ist Ihre Aufgabe.
Das Visual-Basic-Projekt erhält den Namen: DatenPaare, 2 Formulare: frmDatenPaare + frmDiagram. Das „Layout“ des Programms ist folgendermaßen gestaltet (siehe auch vorgegebenes Projekt, das verbindlich ist!):
Es enthält einen Hinweis (lblHinweis), in dem einerseits die Funktion (Fähigkeiten) des Programms beschrieben wird und andererseits dem Anwender beschrieben wird, in welcher Weise er das Programm benutzen muß/kann.
Es enthält ein Textfeld (txtDatenPaare) + Überschrift dazu (lblTitelzuTxtDatenPaare), in das der Anwender 12 Datenpaare eingeben kann/muß in der Form: Monatsname (min. 3 Buchstabe) „;“ Temperaturwert (zwischen -30 und 40 Grad einschließlich). Die Überprüfung der eingegebenen Daten wird mit einem Knopf (btnDtnCheck) gestartet.
Es enthält 3 „Aktionsknöpfe“: Daten speichern (btnDtnSave) Daten lesen (btnDtnRead) + Diagramm (btnDiagram); außerdem den Knopf Ende (btnEnde)
Die Prüfung der Eingaben soll mit „Anklicken eines Knopfes“ (btnDtnCheck) gestartet werden.
Die Prüfung umfaßt: Die Datenpaare sind zeilenweise in der Form „Mon ; Temp.’wert z.B. 12,000 ‚Entertaste’=Zeilenende“ einzugeben und dementsprechend die (abwechselnde) Eingabe von „;“ + Entertaste (vbNewLine) zu überprüfen.
Leerzeichen vor oder nach den eingegebenen Daten sind zu entfernen.
Der Anwender muß mindestens 3 Buchstaben für den Monatsnamen eingeben, d.h. werden mehr als 3 Buchstaben eingegeben, werden nur die ersten 3 im Programm weiter verwendet. Doppelte „3-buchstabige“ Monatsnamen sind mit entsprechender Meldung zu monieren. Zur Überprüfung soll eine Funktion (monatsEingabeOk()) benutzt werden.
Die Temperaturwerte sind als „Single“ deklariert und dementsprechend als numerisches Datum zu überprüfen. „Unsere“ Funktion „eingabeOk()“ ist zu benutzen – natürlich entsprechend angepaßt (Namensänderung: numEingabeOk())! Auch „unsere“ anderen Funktionen sollten Sie benutzen (eventuell entsprechend angepaßt). Daneben soll die Zahleneingabe formatiert werden und zwar in der Form „#0.000“ – Dezimalzeichen im Textfeld „,“, im Programm „.“.
Es müssen genau 12 Datenpaare eingegeben werden; nicht weniger + nicht mehr.
Bei/während der Prüfung (d.h. bevor die Datenpaare gespeichert werden) sollen die Datenpaare in passenden Variablen „zwischengespeichert“ werden. Dabei ist zu berücksichtigen, daß die „Zwischenspeicherung“ im Programm so erfolgen soll, daß das Programm leicht/einfach auf beispielsweise 30 oder 100 Datenpaare erweitert/geändert werden kann. Hinweis: Konstantenvereinbarung „Const maxDatenPaare As Integer = 12“
Im Fall eines Eingabefehlers soll eine passende Fehlermeldung mit Berichtigungshinweis erfolgen + die „Fehlerstelle“ (Fehlerzeile) markiert werden (siehe auch „unsere“ Funktion „fehlerGemeldet()“ – natürlich entsprechend angepaßt).
Wenn die Prüfung der Daten ohne Fehler geblieben ist, sind die Daten in einer “Randomdatei“ zu speichern, deren vollständiger Name (mit Laufwerksbuchstabe + Pfad + Dateityp) einer Variablen (Dim datenPaareDatei As String) zugewiesen wird. Der Dateityp dieser Datei soll „MOTE“ (Const dateiTyp = ".MOTE") heißen. Für die Datensätze der Datei sind die Definitionen:
Private Type datenPaareSatz
monat As String
temperatur As Single
End Type und
Dim datenPaar As datenPaareSatz zu verwenden.
Falls beim Schreiben der Datei Fehler auftreten, soll eine entsprechende Fehlermeldung den Anwender darüber informieren
Außerdem soll es möglich sein, daß der Anwender die in einer Datei gespeicherten Datenpaare wieder ins Programm ins Textfeld (txtDatenPaare) einlesen kann (Knopf: btnDtnRead), um die Daten anzusehen oder zu edieren.
Falls beim Lesen der Datei Fehler auftreten, soll eine entsprechende Fehlermeldung den Anwender darüber informieren
Die Steuerung zur Aktivierung/Deaktivierung der Knöpfe (btnSoundso.Enabled = false/true) soll folgendermaßen erfolgen:
Zu Anfang sind die Knöpfe „btnDtnSave“ + „btnDiagram“ nicht aktiv. Erst nach positiver Überprüfung der Datenpaare ist der Knopf „btnDtnSave“ frei zu geben und nach erfolgreicher Abspeicherung der Daten in einer Datei der Knopf „btnDiagram“.
Falls die Daten aus einer Datei eingelesen werden + der Anwender die eingelesenen Daten ändert/ediert, sollen die Knöpfe „btnDtnSave“ + „btnDiagram“ wieder gesperrt werden und erst wieder nach erfolgter (+erfolgreicher) Prüfung bzw. Speicherung frei gegeben werden - wie „zu Anfang“; werden die Daten nur aus einer Datei eingelesen (ohne Edierung), sollen nach erfolgreichem Lesen der Datei die Knöpfe „btnDtnSave“ + „btnDiagram“ frei gegeben werden.
Das Projekt „DatenPaare“ mit den Visual-Basic-Dateien: DatenPaare.vbp, DatenPaare.vbw sowie frmDatenPaare.frm und frmDiagram.frm ist – in der neuesten/letzten Version - für die Lösung der Aufgabe zu benutzen.
PS: Im Programm Ist die Klausel „Option Explicit“ zu benutzten, d.h. alle Daten/Parameter sind explizit mit einem Datentyp, mit dem die Daten/Parameter im Programm verwendet werden sollen, zu typisieren. - Daraus folgt, daß der Datentyp „Variant“ nicht benutzt werden darf!
soweit die theorie
ich hab nun hier mal eine lösung, allerdings erscheint mir die recht langatmig.
wer hätte einen anderen lösungsvorschlag??? oder könnte das programm hier vereinfacht schreiben??? bin für jede hilfe zu tiefst dankbar, hab nämlich nicht wirklich viel ahnung von VB
Lösung 1:
Option Explicit
Const dateiTyp = ".MOTE"
Const maxDatenPaare As Integer = 12
Const maxTemp As Single = 40
Const minTemp As Single = -30
Private Type datenPaareSatz
monat As String
temperatur As Single
End Type
Dim datenPaar(maxDatenPaare) As datenPaareSatz 'Google sei Dank: Datenfeld definiert mit maxDatenPaare-Anzahl als Größe
Dim datenPaareDatei As String
Dim errNr As Long
Dim anzSemis As Integer
Dim anzNewLines As Integer
Dim eingabeFehler As Boolean
Dim zeichenLaenge As Integer
'***********************************************************************************
Private Sub Form_Load()
lblHinweis.Caption = "Das Programm -DatenPaare- speichert Ihre eingegebenen Daten in Paaren in einer Randomdatei des Types -MOTE-" _
& ", die Sie benötigen, um sich Ihre Daten als Grafik anzeigen zu lassen. Dazu ist es notwendig, dass Sie folgende Regeln bei der Eingabe beachten: " _
+ vbNewLine + vbNewLine + " Sie können 12 Datenpaare eingeben (je eine Monat mit der dazugehörigen Temperatur). " _
+ vbNewLine + " Die Dateneingabe muss in diesem Format erfolgen: mmm;#0,000" + vbNewLine + " Die Monatsbezeichnung -mmm- muss min. drei Zeichen enthalten und darf sich nicht wiederholen." _
+ vbNewLine + " Monat und Temperatur muss mit einem -;- getrennt werden." + vbNewLine + " Die Temperatur muss im Intervall von 40 bis -30°C liegen und kann drei Nachkommastellen haben." _
+ vbNewLine + " Der Temperaturwert muss mit Komma statt Punkt geschrieben werden." + vbNewLine + " Jedes Paar muss in eine extra Zeile im Textfeld geschrieben werden." _
+ vbNewLine + " Jede Zeile muss mit -Return- beendet werden." + vbNewLine + " Überzählige Zeichen des Monats oder Nachkommastellen" _
+ "der Temperatur werden abgeschnitten." + vbNewLine + vbNewLine + " Haben Sie die Eingabe der 12 Datenpaare beendet, drücken Sie bitte den Knopf - Dateneingabe abschließen-." _
+ " Daraufhin führt das Programm eine Überprüfung der Eingabe durch und bittet Sie gegebenenfalls Fehler zu korrigieren. Ist die Prüfung erfolgreich verlaufen, wird der Knopf -Daten speichern- aktiviert." _
+ "Bei dessen Betätigung speichern Sie Ihre Daten in einer Randomdatei, die Sie im erscheinenden Fenster auswählen oder erstellen können. " + vbNewLine + " Nach erfolgreicher Speicherung aktiviert sich der Knopf -Diagramm- über" _
+ " den Sie zu der graphischen Darstellung Ihrer Daten gelangen. Ist bereits eine -MOTE--Datei vorhanden, können Sie diese über den Knopf -Daten lesen- suchen und aufrufen. Die Daten werden im Textfeld sichtbar," _
+ "und Sie haben die Möglichkeit, Änderungen durchzuführen. Diese müssen allerdings ebenfalls erst geprüft und neu abgespeichert werden, bevor Sie sie im Diagramm betrachten können. " + vbNewLine + _
vbNewLine + " Viel Erfolg mit -DatenPaare-!"
End Sub
Private Sub btnDtnCheck_Click()
Dim anzSemis As Integer
Dim anzNewLines As Integer
lblStatus.Caption = ""
If trennZchnOk(txtDatenPaare, anzSemis, anzNewLines) Then
If monatsEingabeOk(txtDatenPaare, datenPaar) Then
If numEingabeOk(txtDatenPaare, datenPaar) Then
btnDtnSave.Enabled = True
End If
End If
End If
End Sub
Private Sub btnDtnSave_Click() ' Btn Daten speichern
Dim i As Integer
'Debug.Print "dateiname: " + dateiName
If dateiName = "" Then 'falls keine Datei ausgewählt
Exit Sub
Else
datenPaareDatei = dateiName 'Pfad + name
Open datenPaareDatei For Random As #1 'Len = Len(data)
For i = 0 To maxDatenPaare - 1
Put #1, i + 1, datenPaar(i) 'zeilenweise abspeichern
Next
Close #1
btnDiagram.Enabled = True
lblStatus.Caption = "Datenspeicherung erfolgreich abgeschlossen!"
End If
End Sub
Private Sub btnDtnRead_Click() 'Btn Daten lesen
Dim i As Integer
lblStatus.Caption = ""
datenPaareDatei = dateiName 'Funktion für Dateiauswahlfenster
If datenPaareDatei = "" Then 'falls keine Datei ausgewählt
Exit Sub
Else
txtDatenPaare.Text = "" 'Textfeld löschen
Cls
Open datenPaareDatei For Random As #1 'Len = Len(data)
For i = 0 To maxDatenPaare - 1
Get #1, i + 1, datenPaar(i) 'zeilenweise lesen
txtDatenPaare.Text = txtDatenPaare.Text + datenPaar(i).monat + ";" + CStr(datenPaar(i).temperatur) + vbNewLine
Next 'als string wieder hinschreiben
Close #1
End If
btnDtnSave.Enabled = True
btnDiagram.Enabled = True
End Sub
Private Function monatsEingabeOk(ByVal txtDatenFeld As Object, ByRef datenPaar() As datenPaareSatz) As Boolean
Dim datenPaarZeile() As String
Dim monatsString As String
Dim posSemi As Integer
Dim monats As String
Dim monatDoppelt As Integer
Dim i As Integer
Dim j As Integer
Dim fehler As Boolean
monatsEingabeOk = True
posSemi = 1
zeichenLaenge = 0
datenPaarZeile = Split(txtDatenFeld.Text, vbNewLine) 'Lob an Google! spaltet Text in Zeilen am return
For i = 0 To maxDatenPaare - 1 'Schleife: zeilenweise spalten
Debug.Print datenPaarZeile(i)
zeichenLaenge = zeichenLaenge + Len(datenPaarZeile(i + 1)) + 2
If InStr(datenPaarZeile(i), ";") Then 'falls kein Semikolon in der Zeile
If InStr(posSemi, datenPaarZeile(i), ";") > 0 Then 'falls kein monat eingegeben
posSemi = InStr(posSemi, datenPaarZeile(i), ";") - 1 'findet ";" und merkt sich Position
monatsString = Left$(datenPaarZeile(i), posSemi) 'links neben ";" = monat
monats = Trim$(monatsString) 'monat ohne Leerzeichen
Debug.Print "-"; monats; "-"
Else
txtDatenPaare.SetFocus
monatsEingabeOk = False
fehler = datenFehlerGemeldet(txtDatenPaare, "Monatsbezeichnung fehlt!", ">>> min. 3 Zeichen eingeben!")
Exit Function
End If
Else
txtDatenPaare.SetFocus
monatsEingabeOk = False
fehler = datenFehlerGemeldet(txtDatenPaare, "Semikolon fehlt in dieser Zeile!", ">>> Datenpaar mit Semikolon trennen!")
Exit Function
End If
If Len(monats) < 3 Then 'meckern bei weniger als 3 Zeichen
txtDatenPaare.SetFocus
monatsEingabeOk = False
fehler = datenFehlerGemeldet(txtDatenPaare, "In der Zeile ist die Monatsbezeichnung zu kurz!", ">>> mind. drei Zeichen eingeben!")
Exit Function
End If
If Len(monats) > 3 Then 'nach 3 Zeichen abschneiden
monats = Left$(datenPaarZeile(i), 3)
End If
For j = 0 To i - 1 'Prüfung, ob Monat doppelt: Schleife in Schleife: erst vom Anfang bis jetzige Zeile
monatDoppelt = InStr(datenPaarZeile(j), monats)
If monatDoppelt > 0 Then
txtDatenPaare.SetFocus
monatsEingabeOk = False
fehler = datenFehlerGemeldet(txtDatenPaare, "Die Monatsbezeichnung ist doppelt!", ">>> andere Bezeichnung eingeben!")
Exit Function
End If
Next
For j = i + 1 To maxDatenPaare - 1 'Prüfung, ob Monat doppelt: dann von jetziger Zeile bis Ende Text
monatDoppelt = InStr(datenPaarZeile(j), monats)
If monatDoppelt > 0 Then
txtDatenPaare.SetFocus
monatsEingabeOk = False
fehler = datenFehlerGemeldet(txtDatenPaare, "Die Monatsbezeichnung ist doppelt!", ">>> andere Bezeichnung eingeben!")
Exit Function
End If
Next
datenPaar(i).monat = monats 'nach Prüfung in Datenfeld schreiben
Next 'Schleife zu ende
End Function
Private Function numEingabeOk(ByVal txtDatenFeld As Object, ByRef datenPaar() As datenPaareSatz) As Boolean
Dim datenPaarZeile() As String
Dim tempWert As String
Dim tempZahl As String
Dim tZahl As Single
Dim posNewLine As Integer
Dim posSemi As Integer
Dim tZahlLong As Long
Dim fehler As Boolean
Dim i As Integer
posNewLine = 1
posSemi = 1
zeichenLaenge = 0
datenPaarZeile = Split(txtDatenFeld.Text, vbNewLine) 'Lob an Google! spaltet Text in Zeilen am return
For i = 0 To maxDatenPaare - 1 'Schleife: zeilenweise spalten
posNewLine = InStr(posNewLine, txtDatenFeld.Text, Chr(Asc(vbNewLine))) + 1 'Position return
posSemi = InStr(posSemi, datenPaarZeile(i), ";") - 1 'Position ";"
tempWert = Mid$(datenPaarZeile(i), posSemi + 2, posNewLine - posSemi - 1) 'Temperatur = nach ";" und Position return minus Position ";" lang
zeichenLaenge = zeichenLaenge + Len(datenPaarZeile(i + 1)) + 2
tempZahl = Trim(tempWert) 'Leerzeichen weg
If Len(tempZahl) = 0 Then
txtDatenPaare.SetFocus
numEingabeOk = False 'meckern wenn nix geschrieben
fehler = datenFehlerGemeldet(txtDatenPaare, "Die Temperatureingabe fehlt!", ">>> Temperatur eingeben!")
Exit Function
ElseIf InStr(1, tempZahl, ".") Then 'EingabeOk
numEingabeOk = False
fehler = datenFehlerGemeldet(txtDatenPaare, "falsches Trennzeichen!", ">>> Bitte nur Trennzeichen """", """" eingeben!")
txtDatenPaare.SetFocus
numEingabeOk = False
Exit Function
ElseIf InStr(1, tempZahl, "(") Or InStr(1, tempZahl, ")") Then
fehler = datenFehlerGemeldet(txtDatenPaare, "falsche Temperatureingabe!", ">>> Bitte nur Ziffern 0-9 eingeben!")
txtDatenPaare.SetFocus
numEingabeOk = False
Exit Function
ElseIf Not IsNumeric(tempZahl) Then
fehler = datenFehlerGemeldet(txtDatenPaare, "falsche Temperatureingabe!", ">>> Bitte nur Ziffern 0-9 eingeben!")
txtDatenPaare.SetFocus
numEingabeOk = False
Exit Function
ElseIf InStr(1, tempZahl, ",") Then 'Komma intern ersetzen
tempZahl = Replace(tempZahl, ",", ".")
End If
On Error Resume Next
tZahl = Val(tempZahl) 'in Zahl umwandeln
errNr = Err.Number
On Error GoTo 0
If errNr <> 0 Then
Select Case errNr
Case 6
numEingabeOk = False
fehler = datenFehlerGemeldet(txtDatenPaare, "Zahl zu groß!", ">>> Temperaturen müssen zwischen 40 und -30°C liegen!")
Exit Function
Case Else
MsgBox "unbekannter Fehler!"
End Select
numEingabeOk = False
Exit Function
Else
numEingabeOk = True
End If
If tZahl > maxTemp Or tZahl < minTemp Then 'Prüfung, ob Temp im Intervall
fehler = datenFehlerGemeldet(txtDatenPaare, "Temperaturwert liegt nicht im Intervall!", ">>> Temperaturen müssen zwischen 40 und -30°C liegen!")
txtDatenPaare.SetFocus
numEingabeOk = False
Exit Function
Else
tZahl = tZahl * 1000 'irgendwie auf 3 Nachkommastellen trimmen
tZahlLong = CLng(tZahl)
tZahl = tZahlLong / 1000
End If
datenPaar(i).temperatur = tZahl 'nach Prüfung in Datenfeld schreiben
Debug.Print "-"; datenPaar(i).temperatur; "-"
Next 'Schleife zu ende
End Function
Private Function datenFehlerGemeldet(txtDatenPaare As Object, ByVal fehlerTxt As String, ByVal hinweisTxt As String) As Boolean
txtDatenPaare.SetFocus
txtDatenPaare.SelStart = zeichenLaenge
MsgBox fehlerTxt + vbNewLine + vbNewLine + hinweisTxt
datenFehlerGemeldet = True
End Function
Private Sub txtDatenPaare_Change()
btnDtnSave.Enabled = False 'wenn Textfeld geändert
btnDiagram.Enabled = False 'Btn ausschalten
lblStatus.Caption = "" 'u. Anzeige löschen
End Sub
Private Function dateiName() As String 'liefert Dateiname einschließlich Pfad + Laufwerk
On Error Resume Next
fdiaDateiAuswahl.CancelError = True 'fkt. kopiert aus ProSplit
fdiaDateiAuswahl.DialogTitle = "Datei auswählen"
fdiaDateiAuswahl.Filter = ".MOTE | *.MOTE"
fdiaDateiAuswahl.Flags = cdlOFNFileMustExist
fdiaDateiAuswahl.ShowOpen
If Err = 0 Then
dateiName = fdiaDateiAuswahl.FileName
Else
dateiName = ""
End If
On Error GoTo 0
End Function
'***********************************************************************************
Private Sub btnDiagram_Click()
frmDiagram.Visible = True
frmDatenPaare.Visible = False
End Sub
Private Sub btnEnde_Click()
End
End Sub
Private Function fehlerGemeldet(txtDatenPaare As Object, ByVal fehlerTxt As String, ByVal hinweisTxt As String, ByVal anfZle As Integer, ByVal endeZle As Integer) As Boolean
Dim posSemi As Integer
Dim posNewLine As Integer
Dim anzSemis As Integer
Dim anzNewLines As Integer
Debug.Print "anfZle " & anfZle
Debug.Print "endeZle " & endeZle
txtDatenPaare.SetFocus
txtDatenPaare.SelStart = anfZle
If anfZle > endeZle Then
txtDatenPaare.SelStart = endeZle
End If
MsgBox fehlerTxt + vbNewLine + vbNewLine + hinweisTxt
fehlerGemeldet = True
End Function
Private Function trennZchnOk(txtDatenFeld As Object, ByRef anzSemis As Integer, ByRef anzNewLines As Integer) As Boolean
Dim posSemi As Integer
Dim posNewLine As Integer
Dim anfZle As Integer
Dim endeZle As Integer
Dim fehler As Boolean
trennZchnOk = True
posSemi = 1
posNewLine = 1
anfZle = 0
endeZle = 1
anzSemis = 0
anzNewLines = 0
While (InStr(posSemi, txtDatenFeld.Text, ";") > 0) Or (InStr(posNewLine, txtDatenFeld.Text, vbNewLine) > 0)
If (InStr(posSemi, txtDatenFeld.Text, ";") > 0) Then
anzSemis = anzSemis + 1
posSemi = InStr(posSemi, txtDatenFeld.Text, ";") + 1
endeZle = posSemi
End If
If (InStr(posNewLine, txtDatenFeld.Text, Chr(Asc(vbNewLine))) > 0) Then
anzNewLines = anzNewLines + 1
posNewLine = InStr(posNewLine, txtDatenFeld.Text, Chr(Asc(vbNewLine))) + 1
' endeZle = posNewLine - 1 funktioniert nicht so recht1
endeZle = posNewLine - 2
End If
If (anzSemis < anzNewLines) Or ((posSemi > posNewLine) And (anzSemis = anzNewLines)) Then
fehler = fehlerGemeldet(txtDatenPaare, "in der Zeile fehlt ein Semikolon!", ">>> Semikolon eingeben!", anfZle, endeZle)
trennZchnOk = False
Exit Function
End If
If ((anzSemis > anzNewLines + 1) And (posNewLine < posSemi)) Or ((anzSemis > anzNewLines) And (posNewLine > posSemi)) Then
fehler = fehlerGemeldet(txtDatenPaare, "in der Zeile ist ein (oder mehrere) Semikolon zu viel!", ">>> Semikolon löschen!", anfZle, endeZle)
trennZchnOk = False
Exit Function
End If
If (anzSemis > maxDatenPaare) Or (anzNewLines > maxDatenPaare) Then
fehler = fehlerGemeldet(txtDatenPaare, "Zu viele Zeilen!", ">>> nur 12 Zeilen/ Datenpaare eingeben!", anfZle, endeZle)
trennZchnOk = False
Exit Function
End If
anfZle = posNewLine
endeZle = posNewLine
Wend
If (anzSemis < maxDatenPaare) Or (anzNewLines < maxDatenPaare) Then
fehler = fehlerGemeldet(txtDatenPaare, "Zeilen fehlen!", ">>> bitte 12 Zeilen/ Datenpaare eingeben!", anfZle, endeZle)
trennZchnOk = False
End If
If (anzSemis >= maxDatenPaare) Or (anzNewLines >= maxDatenPaare) Then
If Len(txtDatenFeld.Text) > endeZle Then
fehler = fehlerGemeldet(txtDatenPaare, "zu viele Daten!", ">>> nur 12 Zeilen/ Datenpaare eingeben!", anfZle, endeZle)
trennZchnOk = False
End If
End If
Debug.Print "anfZle " & anfZle
Debug.Print "nach while posSemi " & posSemi & " anzSemis " & anzSemis
Debug.Print "nach while posNL " & posNewLine & " anzNL " & anzNewLines
End Function
im anhang befindet sich das original programm..........dickes danke schonmal.
mfg alex