Hallo Frank
die Funktion MsgBox() hab ich mittlerweile gefunden. Auch ein kleines Script, dass ein Filehandle benutzt, bei mir aber noch Fragen hinterlässt. Vielleicht hättest Du ja das ein oder andere Stichwort?
Sub TextDateiErstellen()
Dim exportfile$, TB As Worksheet, z%, TMP$
' Kommentare leitet man in Visual Basic mit einem Hochkomma ein :-)
' >> haben das "$" und das "%" eine Bedeutung?
' Ja, sie kennzeichnen den Datentyp der Variablen. Wären die Typkennzeichen nicht
' angehängt, so wären beide Variablen vom Typ Variant (der auf alles passt)
' % ist das Kennzeichen für eine 16-Byte-Integer
' $ ist das Kennzeichen für einen String
' Der Datentyp für z ist ungünstig gewählt, da er nicht ausreichend ist:
' Ein Excel-Sheet bis zur Version Excel 2003 kann 65536 Zeilen haben, bereits in
' diesem Fall benötigt man eine Long Integer
' >> As Worksheet bedeutet, dass TB ein Worksheet=Tabellenblatt ist (werden soll)?
' Ja, TB kann ein Worksheet-Objekt speichern.
exportfile = "C:\test.txt"
' typischer Fall für einen Parameter Deiner Prozedur
Dateinummer = FreeFile
' >> gibt ein Dateihandle. Ich weiß zwar nicht wirklich, was das macht, ist aber so wohl.
' Ein Dateihandle ist einfach eine Zahl. In VB eine zwischen 1 und 511. Du könntest Dir
' eine beliebig wählen (wie vorher die 1) und hoffen, dass es klappt.
' Bei anderen Sprachen liefert die entsprechende Funktion zum Öffnen das Dateihandle,
' eine Zahl, zurück. Auch die Verbindungskennung zu einer DB ist nichts anderes als eine
' Zahl.
Set TB = ThisWorkbook.Worksheets(1)
' >> nimm Worksheet Nummer 1
' Nimm das erste Worksheet in der aktuellen Mappe :-)
' Dieser Index ist glücklicherweise unabhängig von der Einstellung Option Base :-)
'Die folgende Zeile erzeugt eine neue Datei mit dem angegebenen Namen
'im angegebenen Pfad
Open exportfile For Output As #Dateinummerist ja kommentiert. Was aber genau meint "For Output"? Eine Funktion ist es ja nicht, immerhin wurde hier wohl kaum geplenkt (;-).
wieso eine Raute vor "Dateinummer"?
Die Syntax von Open lautet :-)
Open Pfadname For Modus [Access Zugriff] [Sperre] As [#]Dateinummer [Len=Satzlänge]
In der VBA-IDE (Alt+F11) einfach Open eingeben und F1 drücken :-)
Du möchtest schreiben, d.h. eine Ausgabe in die Datei machen.
Du befürchtest keinen konkurrierenden Zugriff auf Deine neue Datei, deswegen brauchst Du sie
auch nicht zu sperren. Ansonsten gelten hier die Ausführungen von Christian Seiler.
'Die beiden Schleifen beziehen alle belegten Zellen in die zu erstellende Textdatei ein
For z = 1 To TB.UsedRange.Rows.Count
For s = 1 To TB.UsedRange.Columns.Count
'Das Semikolon ist durch jedes beliebige Feldtrennzeichen ersetzbar
TMP = TMP & CStr(TB.Cells(z, s).Text) & ";"
Next s
'Damit am Ende jeder Zeile, also nach der letzten Zelle kein Strichpunkt mehr gesetzt wird,
'muss das letzte Zeichen wieder abgezogen werden
TMP = Left(TMP, Len(TMP) - 1)
'Print fügt hier immer eine Zeile zur bestehenden Textdatei hinzu
Print #Dateinummer, TMPDruck in die Datei, die das Dateihandle (mit der Raute) bezeichnet - egal wie der Dateinamen ist, und zwar schubse da TMP rein.
'Die Variable TMP muss vor der Aufnahme der nächsten Zeile wieder geleert werden
TMP = ""
Next z
Ich würde das heute (da Speicher kein Problem darstellt) anders lösen:
Klassisches EVA-Prinzip:
Eingabe:
Lies den Inhalt Deiner Excelliste in eine geeignete Datenstruktur ein.
Ein zweidimensionales Array bietet sich an.
Verarbeitung:
Maskiere die Einträge, die das Trennzeichen enthalten
Verbinde die Einträge jeder Zeile zu einer Textzeile
Ausgabe:
Schreibe zeilenweise weg.
Alternativ kannst Du natürlich auch alle Zeilen mit einem Zeilenende joinen
und dann die ganze Datei in einem Rutsch wegschreiben.
Noch eine Anmerkung: Ein Filehandle besorgt man sich mit der Funktion FreeFile().
warum fehlen da oben die Klammern "()" bei Freefile?
Weil in diesem Fall der einzige und dazu optionale Aufrufparameter der Funktion weggelassen wurde.
Nebenbei vielleicht noch eine kurze Anregung, mit welchem Zauberwort eine test.bat losgetreten werden könnte? Irgendwie kommt mir das alles etwas amorph vor. In der Hilfe sind so wenig Querverweise. Bei InputMessagebox wird zB. nicht wie im PHP-Manual auf andere verwandte Funktionen verwiesen, wie MsgBox oder so.
Shell(pathname[,windowstyle])
Bitte in der Onlinehilfe nachsehen, was Du damit alles anstellen kannst.
Die Batchdatei würdest übrigens nicht direkt starten, sondern eine Instanz
des Kommandozeileninterpreters, der Du die Batchdatei als Parameter übergibst.
Noch etwas zu Funktionen:
' Standardmäßig werden Parameter by Reference übergeben, willst Du nur Werte übergeben
' so verwende ByVal. Der Rückgabewert erfolgt über die implizit angelegte Variable, die
' den gleichen Namen wie die Funktion selbst trägt:
' Beispiel:
Function beispiel(ByVal arg1 As Integer, ByRef arg2 As String) As String
' Implizit enthalten:
' Dim beispiel As String
' Baue den Rückgabewert zusammen
' Ein _ am Ende der Zeile leitet eine Zeilenfortsetzung ein
' Die Konstante vbCrLf ist ein Zeilenende (Windows-Style)
' arg1 wird implizit zu einer Zeichenkette umgewandelt
beispiel = "Hallo Welt!" & vbCrLf & _
arg2 & vbCrLf & arg1
End Function
Aufruf:
Dim myString As String
myString = beispiel(7, "Beispieltext")
' Erzeuge eine Ausgabe ins Direktfenster (in der VBA-IDE über Ansicht->Direktfenster einblenden)
debug.pring myString
Im Überwachungsfenster kannst Du Dir den Inhalt von Variablen anzeigen lassen,
im Code Break- und Watchpoints setzen. Die VBA-IDE bietet schon einiges an Debugkomfort.
Freundliche Grüße
Vinzenz