VBA - Variablen in Textdatei platzieren

Hallo zusammen,
ich versuche eine Textdatei zu erstellen, bei der exakt vordefiniert ist welche/s Variable/Zeichen in welcher Zeile und in welcher Spalte steht.
Dabei gibts leider Probleme, die ich anhand eines Beispiels aus dem Quellcode darstellen möchte.

Print #1, arrayA(j, k)",1,"; arrayA(j, k + 1)

Die Zeile steht in einer Schleife, mit den Laufvariablen gibts keine Probleme.

In der txt-Datei steht daraufhin beispielsweise:
" 5 ,1, 23"

Problem 1) Er beginnt mit der 5 in Spalte 2 und nicht in Spalte 1, so wie ich es brauche.
Problem 2) vor dem „,1,“ setzt er mir auch ein Leerzeichen, genau wie vor der 23.

Schreiben soll er mir ausschließlich „5,1,23“ beginnend in der ersten Spalte.

Ich bin da leider gerade absolut überfragt wie ich die Leerzeichen rausbekomme und bin extrem dankbar um jeden Lösungsvoschlag.

Danke im Voraus.

Viele Grüße,
DMay2000

Hallo DMay2000,

mit den VBA-Befehlen nachstehenden Befehlen kann man Leerzeichen entfernen:

Trimm ; LTrimm ; RTrimm

Alternativ kann auch anstelle von „STR“ der Befehl „CSTR“ verwendet werden, um eine Zahl in ein Textstring umzusetzen.

Notfalls kann auch über den VBA-Befehl „Replace“ ein beliebiges-Zeichen ersetzt werden.

Viele Grüße,
BigBen

setz doch den String vorher zusammen:

WriteString = Variable1 & chr (44) & Variable2 & chr(44) & Variable3
Print#1, WriteString

Falls die numerischen Variablen noch ein Leerzeichen voranstellen(??) dann mit Trim(Variable1) etc. arbeiten
Chr(44) ist das Komma!

Hallo DMay2000,
ich hab jetzt die Annahme getroffen, dass arrayA als ganzzahliger Datentyp definiert ist; dann wäre eine Lösung:
Print #1, Trim(Str(arrayA(J, K))); „,1,“; Trim(Str(arrayA(J, K + 1)))

Entfernt die Leerzeichen, die beim Umwandeln der Zahl in eine Zeichenkette entstehen (denn Print erzeugt zwanghaft Zeichenketten).

Viel Erfolg
Katharina

______________________________________________________

Vielen Dank schonmal BigBen,
das Trimmen konnte ich lösen!

Jetzt hätte ich nur noch eine kleine Frage, die mir einfällt, wenn du von der Funktion replace redest.
Ich lese das arrayA als double ein und will in der txt-Datei die Nachkommastellen durch einen Punkt getrennt haben. Das Komma entspricht in der txt nämlich einem Trennzeichen zwischen zwei Angaben.
Herauskommen soll demnach etwas in folgender Form „123,1,0.00456“
Die 123 und die 0,00465 lese ich als double im selben array ein, die „,1,“ ist als String vordefiniert.

Weißt du auch da, wie ich meinen Ausgabestring zusammenbasteln kann??

Danke nochmal!

______________________

Danke, Danke,
funktioniert soweit!

Weißt du auch wie ich bei den Variablen (bei mir double) das Komma durch einen Punkt ersetzte und dann als String zusammenpacke?

______________________________

Super!
So konnte ich das echt lösen.

Ein Problem hätte ich noch, wäre super wenns da auch so ne schnelle Lösung geben würde!
Hatte ja gesagt, dass alle Zeichen ihren genauen Platz haben. Wenn ich bei der Print #1 Funktion sage:
Print #1, arrayA(j, k); tab(10) „,1,“; arrayA(j, k + 1)
Dann beginnt der mir ab dem tab(10) immer in einer neuen Zeile. Das macht mich auch noch ein bisschen kirre.

Vielen Dank schonmal an dich Katharina.

Liebe Grüße
Dustin

Hallo DMay2000,

wenn mit einem VBA-Befehl eine Zahl in ein String umgewandelt wird, erfolgt dies immer gemnächst den internationalen Einstellungen:

. = Trennungungszeichen zwischen Zahl und Nachkommstellen

, = Tausendertrennungzeichen (falls einer vorhanden sein sollte. (wird interessant in Verbindung mit dem VBA-Befehl Format(…)

Um eine Ausgabe nach dem Format [Zahl1],1,[Zahl2] zu bekommen, kann z.B. wie folgtvorgegangen werden:

Out = cstr(Zahl1) & „,1,“ & cstr(Zahl2)

Hierbei ist es unerheblich, ob die Zahl als Double, oder Long vorliegt.

Ich habe derzeit leider kein Office-Produkt in der Nähe, um den Befehl auszuführen. Falls wider Erwarten der Befehl CSTR ausschließlich INTEGER-Werte verarbeiten kann, sollte der Format-Befehlanstelle von cstr-Befehlen eingesetzt werden.

Viele GRüße,
BigBen

Ja mit einer Function im Bereich der Module (nicht bei den Tabellen, DieseArbeitsmappe…, ggf. ein Modul einfügen)

Function Eng\_Numbers(Zahl As Double)
Dim Lang\_Zahl As Double
Dim I As Double
Dim CheckChar As String

Lang\_Zahl = Len(Zahl)
For I = 1 To Lang\_Zahl
 CheckChar = Mid(Str(Zahl), I, 1)
 If CheckChar = "," Then
 CheckChar = "."
 End If
 Eng\_Numbers = Eng\_Numbers & CheckChar
Next I
Eng\_Numbers = Trim(Eng\_Numbers)
End Function

Du, da hat’s was mit den Satzzeichen - so
Print #1, arrayA(j, k); tab(10) „,1,“; arrayA(j, k + 1)
KANN das gar nicht aussehen; VBA macht da automatisch
Print #1, arrayA(j, k); tab(10); „,1,“; arrayA(j, k + 1)
draus - du siehst den Strichpunkt?

Also: Was hast du wirklich getippt und ausgeführt :smile: ?

lg
Katharina

__________________________________-

Guten Morgen Katharina,

da hast du recht, da habe ich dir leider Käse geschrieben, sorry. Also jetzt die direkte kopie aus dem Quellcode so wie er gerade durchgelaufen ist:
Print #1, Gasbestandteile(j, k); „,1,“, Tab(10); Gasbestandteile(j, k + 1)
Im txt ergibt das z.B.:
125 ,1,
0,214
12 ,1,
0,256
Er schreibt mir zwar die 0,214 und die 0,256 in Spalte 10 (also 11 weil hier das Trimmen noch nicht drin ist), aber eben in die neue Zeile.
Liegt das auch an der Umwandlung von einem Double in einen String?

LG
Dustin

_______________

Ich sehe gerade, dass der Auszug aus meinem txt nicht funktioniert hat.
Also die 0,214 und die 0,256 stehen einfach in der nächsten Spalte (wie gezeigt), aber echt in Spalte 10.

____________________

Hi BigBen,

ich habe gerade eine Lösung gefunden! Ich nutze nun hauptsächlich die Funktionen Replace und Format und baue mir dann den String über &-Verknüpfungen zusammen.
Mit dem cstr habe ich es leider nicht hinbekommen, liegt aber sicherlich an mir, nicht an der Funktion.

Vielen Dank für deine Hilfe!

Grüße,
Dustin

______________________

Absolut genial,
läuft super!

Die Idee, den String einfach vor der Ausgabe schon zusammenzubauen hat mich auch extrem weiter gebracht und zieht sich jetzt schon durch meinen gesamten Quellcode.

Vielen Dank und Grüße,
Dustin

Hallo Dustin,
es ist halt nicht wurscht, ob Strichpunkt oder Beistrich …
und wegen des Double-Datentypen empefhl’ ich auch noch die Format-Funktion statt der Trim(str(xxx))-Kombi. Also:
Print #1, Format(arrayA(J, K)); Tab(10); „,1,“; Format(arrayA(J, K + 1))

Passts?
lg
Katharina

_____________________

Zusammen mit der Formatfunktion hat es funktioniert :smile:
Vielen Dank!!

Hallo,

was für ein Variablentyp ist j und k?
Text, Zahl, Variant?
Eventuell haben Sie noch die Zeile für mich, wo Sie das Array deklarieren. Sie können mir gerne auch den Fall per Email detailierter schildern. Bitte an [email protected] mailen.

Danke und viele Grüße,
Andreas Fastner
ASFAST-EDV
Weinberger Strasse 60a
92318 Neumarkt

Hallo A.Fastner,

die Variablen j und k habe ich ganz einfach als
dim j as integer und
dim k as integer deklariert.
Zur Ausgabe der Zahlenwerte an meine vordefinierten Zeilen und Spalten im txt file habe ich zwei Arrays benötigt.
Ich lese die Zahlen in einer input Box ein und schreibe sie in das array
dim arrayA (15,5) as double.
Um die Zahlen im txt auszugeben baue ich mir meine Werteketten als String, also praktisch als Text, zusammen.
Das ist dann
dim arrayAString (15,5) as string.
Vorgehensweise also erst Zahlen als double einlesen, Wertekennen als String zusammenbauen und dann ausgeben.

Hoffe ich konnte helfen, wenn nicht, dann nochmal melden.

Viele Grüße
Dustin

Hallo,

ich würde das ganze gerne mal nachbauen.
Im welchen Programm haben Sie den VBA-Code erstellt?
Word, Excel, Powerpoint, Access?
Evtl. schicken Sie mir auch mal einen Codeausschnitt.
Danke!
Grüße
Andreas Fastner

Guten Morgen,
ich habe das Programm in Excel geschrieben. Wobei keinerlei Verknüpfungen zu Zellen bestehen. Ist also wirklich nur VBA Basis.

Die Kernpunkte meines Codes sind die folgenden.

  1. Ich befülle meine Arrays mit input-boxen
    bsp. ArrayA(j, 3) = InputBox(vbCr & vbCr & vbCr & „Geben Sie irgendwas ein.“)

  2. Ich muss meine Eingabe in eine bestimmte Form bringen (war ein individueller Wunsch von mir, der für meine Anwendung wichtig ist)
    bsp.Stringarray(j, 0) = ArrayA(j, 0)
    Stringarray(j, 0) = Replace(Stringarray(j,0), „,“, „“)
    Stringarray(j, 0) = Format(Stringarray(j, 0), „0000“)

  3. ich baue mir jeweils eine Zeile aus meinem Stringarray in einen String in der gewünschten Form zusammen.
    bsp. Ausgabestring(j) = „.“ & Stringarray(j, 0) & „, 0.“ & Stringarray(j, 1) & „, 0.“ & Stringarray(j, 2) & „, 0.“ & Stringarray(j, 3) & ", " & Stringarray(j, 4) & ", " & Stringarray(j, 5) & ", " & Stringarray(j, 6) & „,“ & Stringarray(j, 7) & ", " & Stringarray(j, 8)

  4. diesen String gebe ich dann zeile für zeile in der txt aus. Mit Erstellung des Files sieht das dann so aus.

Ordnerpfad = InputBox(vbCr & vbCr & vbCr & „Geben Sie den Pfad des Ordners in der Form ein, wo Ihre txt-Datei erstellt werden soll. Bsp.: M:\persönlicherOrdner.“, „Explorerpfad“)
Set fs = CreateObject(„Scripting.FileSystemObject“)
Set a = fs.CreateTextFile(Ordnerpfad & „\inputfile.txt“, True)
a.Close

Open Ordnerpfad & „\inputfile.txt“ For Output As #1

und dann in Schleifen zeilenweise ausgegeben.

For I = 1 To Waermetauscher Print #1, Ausgabestring(j)
j = j + 1
Next

Hoffe ich konnte dir helfen!

Grüße