2 VBA Makro Probleme

Bitte bei folgenden Problemen um Unterstützung.
mit folgendem Makro werden Daten als .txt Datei ausgegeben.

Private Sub CommandButton1_Click()
'exportiert Biegemomente als .txt Datei für Focus

Dim i As Long, intHandle As Integer
intHandle = FreeFile
outFilename = Application.GetSaveAsFilename()
If outFilename = False Then
MsgBox „program termination“, vbOKOnly

End If
For i = 9 To 65
Print #intHandle, getString(Cells(i, „N“)); getString(Cells(i, „Ag“)); getString(Cells(i, „Aj“))
Next i

Welche Änderung im Makro muss vorgenommen werden, wenn nur die Werte größer Null (in Spalte N) ausgegeben werden sollen, wobwei trotzdem der ganze Wertesatz (N9 bis N65) durchsucht werden soll.

Das 2. problem habe ich mit der Formatierung der exportierten Daten.
Die Werte der Daten aus Spalte N; AG; AJ werden z.Z so Formatiert:
STATIC LOAD /MOMENT
0.0000E+00-9.9228E+031.8086E+03
1.2510E+00-9.9228E+031.8086E+03
3.2500E+00-9.2073E+031.6916E+03

STATIC LOAD /MOMENT
0.0000E+00-9.9228E+031.8086E+03
1.2510E+00-9.9228E+031.8086E+03
3.2500E+00-9.2073E+031.6916E+03

Die Formatierung in der Tab. ist ZAHL mit 2 Dez.-Stellen
und wird mit folgendem Makro in der .txt DAt. Formatiert:

Private Function getString(ByVal r As Range) As String
'legt das Format der zu exportierenden Daten fest

Dim S As String
getString = Format(Left(CStr(r.Value), 10), „!@@@@@@@@@@“)
S = Format$(r.Value, „0.0000E+00“)
If Len(S)

Hallo,

 For i = 9 To 65
 If getString(Cells(i, "Ag")) \> 0 Then
 Print #intHandle, getString(Cells(i, "N")); getString(Cells(i, "Ag")); getString(Cells(i, "Aj"))
 End If
 Next i
 'oder:
 For i = 9 To 65
 Print #intHandle, getString(Cells(i, "N")); IIf(getString(Cells(i, "Ag")) \> 0, getString(Cells(i, "Ag")), ""); getString(Cells(i, "Aj"))
 Next i

War’s das?

Gruß, Bernd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Bitte bei folgenden Problemen um Unterstützung.
mit folgendem Makro werden Daten als .txt Datei ausgegeben.

Hi Torre,

benutz bitte den pre-Tag, wird unterhalb des Eingabefesnters erläutert, dann bleiben die Einrückungen erhalten.

Von welchem Programm sprichst du? vba kennen ca. 20 Programme.

Welche Änderung im Makro muss vorgenommen werden, wenn nur die
Werte größer Null (in Spalte N) ausgegeben werden sollen,
wobwei trotzdem der ganze Wertesatz (N9 bis N65) durchsucht
werden soll.

Ich kenne "getsring nicht und weiß nicht was es zurückliefert, ggfs die If-Abfrage abändern.

Option Explicit
'
Private Sub CommandButton1\_Click()
'exportiert Biegemomente als .txt Datei für Focus
Dim i As Long, intHandle As Integer
intHandle = FreeFile
outFilename = Application.GetSaveAsFilename()
If outFilename = False Then
 MsgBox "program termination", vbOKOnly
 Exit Sub
End If
' Open ...
For i = 9 To 65
 If getString(Cells(i, "N")) \> 0 Then
 Print #intHandle, getString(Cells(i, "N")); getString(Cells(i, "Ag")); getString(Cells(i, "Aj"))
 End If
Next i
' Close
End Sub

Die Werte der Daten aus Spalte N; AG; AJ werden z.Z so
Formatiert:
STATIC LOAD /MOMENT
0.0000E+00-9.9228E+031.8086E+03
1.2510E+00-9.9228E+031.8086E+03
3.2500E+00-9.2073E+031.6916E+03

Sorry, verstehe/kenne ich nicht aus Excl-Vba.

Gruß
Reinhard

Hallo Reinhard
-Pre-Tag hinweis zur Kenntnis genommen, werde dieses in Zukunft beachten.
-Es handelt sich um VBA für Excel 2003
-Bei der Formatierten Datei handelt es sich bereits um die .txt Datei, die so wie sie jetzt ist von einem weiteren externen Programm nicht gelesen werden kann. Dazu müssen die die ersten 10 Zeichen einer Zeile (Maße in [mm]) als Zahlenformat ohne Dezimalstelle ausgegeben werden)
Gruß Torre

[MOD] - Zitat entfernt.

Hallo, nochmal
kann ich die „If“ Abfrage gleichzeitig auf alle 3 Spalten beziehen?
(Wenn alle Spalten 0.00 dan nicht export.)
Habe es probiert, klappt aber irgendwie nicht.
Gruß torre

Hallo,

For i = 9 To 65
If getString(Cells(i, „Ag“)) > 0 Then
Print #intHandle, getString(Cells(i, „N“));
getString(Cells(i, „Ag“)); getString(Cells(i, „Aj“))
End If
Next i
'oder:
For i = 9 To 65
Print #intHandle, getString(Cells(i, „N“));
IIf(getString(Cells(i, „Ag“)) > 0, getString(Cells(i,
„Ag“)), „“); getString(Cells(i, „Aj“))
Next i

War’s das?

Gruß, Bernd

kann ich die „If“ Abfrage gleichzeitig auf alle 3 Spalten
beziehen?
(Wenn alle Spalten 0.00 dan nicht export.)

Hi Torre,

vielleicht so:

For i = 9 To 65
 If Cells(i, "N") 0 And Cells(i, "AG") 0 And Cells(i, "AJ") 0 Then
 Print #intHandle, getString(Cells(i, "N")); getString(Cells(i, "Ag")); getString(Cells(i, "Aj"))
 End If
Next i

Gruß
Reinhard

kann ich die „If“ Abfrage gleichzeitig auf alle 3 Spalten
beziehen?
(Wenn alle Spalten 0.00 dan nicht export.)

Hi Torre,

vielleicht so:

For i = 9 To 65
If Cells(i, „N“) 0 And Cells(i, „AG“) 0
And Cells(i, „AJ“) 0 Then
Print #intHandle, getString(Cells(i, „N“));
getString(Cells(i, „Ag“)); getString(Cells(i, „Aj“))
End If
Next i

Gruß
Reinhard

Ja fast,
in Deiner Lösung:
Wenn in einer der Spalten o.oo, dann nicht export.
ich hätte gern wenn in allen 3 Spalten 0.00 steht, nicht export.

>Wenn „N“;„AG“ und"AJ" 0.00, dann nicht export.,
wenn einer der Spalten Wert > 0.00, deann export.
Soweit trotzdem schon mal Danke.
lg Torre

-Es handelt sich um VBA für Excel 2003
-Bei der Formatierten Datei handelt es sich bereits um die
.txt Datei, die so wie sie jetzt ist von einem weiteren
externen Programm nicht gelesen werden kann. Dazu müssen die
die ersten 10 Zeichen einer Zeile (Maße in [mm]) als
Zahlenformat ohne Dezimalstelle ausgegeben werden)
Gruß Torre

Hi Torre,

irgendwie hab ich da was überlesen und hielt getString für eine eingbaute Funktion.

Es geht doch um drei Spalten, was hat das nun mit
"die ersten 10 Zeichen einer Zeile " zu tun?

Wenn du Spalte N als Tahl ohne Nachkomme haben willst so formatiere das doch so:

Print intHandle, format(cells(i,„n“),„0“) & getstring(…) & getstring(…)

Gruß
Reinhard

Ja fast,
in Deiner Lösung:
Wenn in einer der Spalten o.oo, dann nicht export.
ich hätte gern wenn in allen 3 Spalten 0.00 steht, nicht
export.

>Wenn „N“;„AG“ und"AJ" 0.00, dann nicht export.,
wenn einer der Spalten Wert > 0.00, deann export.

Hi Torre,
dann halt so:
If Cells(i, „N“) 0 Or Cells(i, „AG“) 0 Or Cells(i, „AJ“) 0 Then

Gruß
Reinhard

Hi Torre,
dann halt so:
If Cells(i, „N“) 0 Or Cells(i, „AG“) 0 Or
Cells(i, „AJ“) 0 Then

Gruß
Reinhard

Super, haut hin.
Danke,
möchte aber noch eine Frage stellen dürfen:
Wie oder Was mus sein, damit bei folgendem Code (Formatiert werden Daten aus Spalte „N“; „AG“ und „AJ“ von „Zahl“ in „Wissenschaft“ mit je 10 Zeichen) nur "AG und „AJ“ Formatiert werden.
Alles zu einer Ausgabe von Daten in eine .txt Datei, was bis auf das Formatierungsproblem auch gemacht wird.

Private Function getString(ByVal r As Range) As String
'legt das Format der zu exportierenden Daten fest
 Dim S As String
 getString = Format(Left(CStr(r.Value), 10), "!@@@@@@@@@@")
 S = Format$(r.Value, "0.0000E+00")
 If Len(S) 

Gruß Torre

Wie oder Was mus sein, damit bei folgendem Code (Formatiert
werden Daten aus Spalte „N“; „AG“ und „AJ“ von „Zahl“ in
„Wissenschaft“ mit je 10 Zeichen) nur "AG und „AJ“ Formatiert
werden.
Alles zu einer Ausgabe von Daten in eine .txt Datei, was bis
auf das Formatierungsproblem auch gemacht wird.

Private Function getString(ByVal r As Range) As
String
'legt das Format der zu exportierenden Daten fest
Dim S As String
getString = Format(Left(CStr(r.Value), 10), „!@@@@@@@@@@“)
S = Format$(r.Value, „0.0000E+00“)
If Len(S)

Hi Torre,

dann lass doch getString bei der Spalte N einfach weg.

und zum Code,
getString = Format(Left(CStr(r.Value), 10), „!@@@@@@@@@@“)
kannste auch weglassen, ist im Endergebnis sowieso wirkungslos da
getString = Replace(S, „,“, „.“)
es wieder überschreibt.

Und Range(„b4“).Select in der Funktion muß auch raus. Wenn überhaupt Select dann am Ende der Prozedur die die Funktion getString aufruft.

Gruß
Reinhard

Wie oder Was mus sein, damit bei folgendem Code (Formatiert
werden Daten aus Spalte „N“; „AG“ und „AJ“ von „Zahl“ in
„Wissenschaft“ mit je 10 Zeichen) nur "AG und „AJ“ Formatiert
werden.
Alles zu einer Ausgabe von Daten in eine .txt Datei, was bis
auf das Formatierungsproblem auch gemacht wird.

Private Function getString(ByVal r As Range) As
String
'legt das Format der zu exportierenden Daten fest
Dim S As String
getString = Format(Left(CStr(r.Value), 10), „!@@@@@@@@@@“)
S = Format$(r.Value, „0.0000E+00“)
If Len(S)

Hi Torre,

dann lass doch getString bei der Spalte N einfach weg.

Gruß
Reinhard

OK danke,
aber
ich brauche die 10 Zeichen für jede Spalte,
die sind damit auch weg.
So soll eine Reihe aussehen:

11259"""""-6.3407E+031.2227E+03
"= Leerzeichen

so sah sie vor Deinem Tip aus:

1.125E+033.6369E+09-2.0997E+09

und so sieht sie momentan aus:

11.259 3.6369E+09-2.0997E+09

und ich habe gerade noch einen fehler festgestellt, und zwar das bei der festlegung der Zeichen auf 10 je Spalte das „-“ nicht mit berücksichtigt wird, so das es in dem Fall dann zu 11 zeichen kommt.
Wäre auch zu schön wenn mal alles klappt. :frowning:
Wenn Du eine Lösung kennst, werde ich mich erst morgen wieder melden, aber trotzdem schon einmal Danke für alles!!!
schönen feierabend
Gruß Torre

Hi Torre,

probieren wirs mal anders, du erstellst eine Beispieldatei wo nur die drei Spalten gefüllt sind mit allen Konstellationen, also alle drei Spalten leer (oder 0 drin oder o,00, halt so wie im Original) sind, oder nur eine Spalte gefüllt ist oder zwei oder drei.

Die lädst du hoch mittels FAQ:2861 o.ä.

dann zeigst du entweder hier direkt oder durch das Hochladen einer Textdatei, wie denn die Zeilen der Textdatei aussehen sollen, bezogen auf die Beispieldatei.

Logo muß die beispieldatei nicht alle Zeilen von 9 bis 65 enthalten,
es langen Beispieleinträge in Zeilen 9 - 30 oder so, mußt du abwägen.

ich brauche die 10 Zeichen für jede Spalte,

Für die leeren bzw mit 0 gefüllten zellen auch?

Ich hab jetzt verstanden, du willst zeilenweise drei Spalten in eine Textdatei einlesen, in der Textdatei soll jede Zeile 30 Bytes haben.

Was hat das nun mit dem „-“ Zeichen auf sich?

Das sind so die Dinge die mich verwirren und von einer Lösung abhalten :frowning:

Gruß
Reinhard

Guten morgen Reinhard,
erst einmal sollte ich erklären was es damit alles auf sich hat.
Ich berechne Lasten für ein Bauteil um statische tests durchführen zu können, und das im Rahmen meiner Dipl.-Arb. Nebenbei soll ich ein Sheet aufbauen, wodurch diese Berechnungen automatisiert werden.
In diesem ersten Teil werden die Daten um die es hier geht Länge (als Radius) und Biegemomente als .txt Dat. in ein externes Programm gegeben, welches dann aufgrund dieser und der anderen notwendigen Daten (kennt das Programm bereits) die Verbiegungen berechnet.
Eben dieses Progr. benötigt eine ganz bestimmte Formatierung der .txt Dat. inclusive der einzelnen Kommandos, welche als Text im Makro mit auftauchen.
Da das Bauteil in 4 Richtungen (KO-System) verformt wird, habe ich positive als auch negative Vorzeichen.
Dazu kommt, dass es Bauteile Verschiedener Längen gibt, was dazu führt, dass Zellen mit 0.00 gefüllt sin.
Ich hoffe ich kann damit schon etwas Licht ins Dunkel bringen und hoffe das ich die Bsp. Dat geladen bekomme.
So, hier die links der Dateien.

http://www.badongo.com/file/10609709
http://www.badongo.com/file/10609858

Zur Erläuterung:
Die Daten der Excel Tabelle sind in einem Tab.-Blatt 4x vorhanden
(X; Y; -X; -Y).
Der Aufbau ist gleich, Die Spalten N; AP; AR (AP,AR da Einheiten hier in Nmm)
die zeilen 9-65; 70-123; 128-181; 186-239
Die .txt Dat zeigt die soll Form. der erste Datensatz der .txt Dat ist jener aus der Bsp.-Tabelle.
Zu Beachten ist da, dass bei negativen Vorzeichen der Wert mit 3 Nachkommastellen angezeigt werden muss und bei posit. Vorz. mit 4 Nachkommast.
auch kannst Du erkennen, dass jede Spalte 10 Zeichen hat.
Ich hoffe ich konnte Dir mein Problem damit verdäutlichen, es ist zwar etwas viel Information, Hilft aber Denke Ich.
Gruß Torre

PS: sollte das mit den Dateien nicht geklappt haben, schicke ich sie Dir bei Einverständnis per mail!

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

http://www.badongo.com/file/10609709
http://www.badongo.com/file/10609858

Die .txt Dat zeigt die soll Form. der erste Datensatz der .txt
Dat ist jener aus der Bsp.-Tabelle.
Zu Beachten ist da, dass bei negativen Vorzeichen der Wert mit
3 Nachkommastellen angezeigt werden muss und bei posit. Vorz.
mit 4 Nachkommast.
auch kannst Du erkennen, dass jede Spalte 10 Zeichen hat.

Nein, das kann ich nicht erkennen, je nach Vorzeichen sinds auch 11.
Nimm mal meinen nachfolgenden Code, dann sind es überall 10 Zeichen.

Aus dieser tabelle wird dann die drunterstehende Textausgabe in eine txtdatei.

Tabellenblatt: C:\DOKUME~1\ICHALS~1\LOKALE~1\Temp\[Bspl.\_Mappe.xls]!Tabelle1
 │ B │ C │ D │
───┼────────┼─────────────┼────────────┤
 4 │ [m] │ [Nmm] │ [Nmm] │
───┼────────┼─────────────┼────────────┤
 5 │ 0 │ -6340746033 │ 1222708332 │
───┼────────┼─────────────┼────────────┤
 6 │ 11,259 │ -6340746033 │ 1222708332 │
───┼────────┼─────────────┼────────────┤
 7 │ 3,25 │ -9207322890 │ 1691601335 │
───┼────────┼─────────────┼────────────┤
 8 │ 5,25 │ -8491483995 │ 1574509813 │
───┼────────┼─────────────┼────────────┤
 9 │ 7,25 │ -7775645099 │ 1457418290 │
───┼────────┼─────────────┼────────────┤
10 │ 9,25 │ -7059806204 │ 1340326767 │
───┼────────┼─────────────┼────────────┤
11 │ 11,25 │ 0 │ 0 │
───┴────────┴─────────────┴────────────┘

Tabellendarstellung erreicht mit dem Code in FAQ:2363

0000 -6.341E+031.2227E+03
11259 -6.341E+031.2227E+03
3250 -9.207E+031.6916E+03
5250 -8.491E+031.5745E+03
7250 -7.776E+031.4574E+03
9250 -7.060E+031.3403E+03
11250 0.0000E+000.0000E+00

Gruß
Reinhard

Option Explicit
'
Sub Makro1()
Dim Zei As Long, Satz As String, intFree As Integer
If Dir("H:\test.txt") "" Then
 ' hier noch ggfs. abfragen ob bestehende Datei überschrieben werden soll
End If
intFree = FreeFile
Open "H:\test.txt" For Output As #intFree
For Zei = 5 To 61
 If Range("B" & Zei) 0 Or Range("C" & Zei) 0 Or Range("C" & Zei) 0 Then
 Satz = getText(Range("B" & Zei)) & getWiss(Range("C" & Zei)) & getWiss(Range("D" & Zei))
 Print #intFree, Satz
 End If
Next Zei
Close
End Sub
'
Function getText(ByVal Wert) As String
getText = Wert \* 1000
If getText = "0" Then getText = "0000"
getText = Left(getText & Space(10), 10)
End Function
'
Function getWiss(ByVal Wert) As String
getWiss = Format(Wert / 10 ^ 6, IIf(Wert 

Nein, das kann ich nicht erkennen, je nach Vorzeichen sinds
auch 11.

Hallo,
so, nun erst mal 1000 Dank
deine Lösung klappt prima, bin echt beeindruckt!!!
Das mit den Vorzeichen war auch eins meiner Probleme, dass ebend diese nicht berücksichtigt wurden.

Zwei kleine Fragen hätte ich noch:
kann die Datei in zwei Ordner gleichzeitig gespeichert werden, wobei die eine mit .txt Endung in den Ordner gespeichert wird, in dem sich das Excel Sheet befindet
und die andere in einem Ordner in dem das ext. Programm arbeitet mit der endung .frb.
Wobei ich nur den Dateinamen festlegen muss (msgBox).
Es geht mir hier nur um die Machbarkeit!!

Und, dieses alles läuft unter Office 2003,
Privat nutze ich Office 2007. Ist Excel 2003 kompatibel mit Excel 2007?
Nochmal herzlichen Dank für Deine Mühen
Gruß Torre

Hallo Torre,

so, nun erst mal 1000 Dank

dankeschön.

kann die Datei in zwei Ordner gleichzeitig gespeichert werden,
wobei die eine mit .txt Endung in den Ordner gespeichert wird,
in dem sich das Excel Sheet befindet

Sicher, man könnte das Verzeichnis der Arbeitsmappe ermitteln, aber wahrscheinlich langt da auch Curdir.

Also vielleicht so:

Sub Makro1()
Dim Zei As Long, Satz As String, intFree As Integer
If Dir(curdir & "\test.txt") "" Then
 ' hier noch ggfs. abfragen ob bestehende Datei überschrieben werden soll
End If
intFree = FreeFile
Open curdir & "\test.txt" For Output As #intFree

und die andere in einem Ordner in dem das ext. Programm
arbeitet mit der endung .frb.

probiers mal so, am Ende des Codes, nach dem Close:

filecopy curdir & „\test.txt“, „andrerPdad\test.frb“

Wobei ich nur den Dateinamen festlegen muss (msgBox).

Du meinst InbutBox?
Anderer Vorschlag, bei jedem Start des Makros wird ein einzigartiger aus Name + Datum + Uhrzeit + Endung erzeugt

Oder es wird hochgezählt, bei jedem Aufruf startet das Makro mit einem höheren Index, erst wird Test0001.txt erzeugt, beim zweiten Mal Test0002.txt, usw.

Es geht mir hier nur um die Machbarkeit!!

Geht.

Und, dieses alles läuft unter Office 2003,
Privat nutze ich Office 2007. Ist Excel 2003 kompatibel mit
Excel 2007?

Von Kompatibel kann man schon anhand der Bedienoberfläche nicht sprechen. Ich krieg nur ganz am Rande mit daß 2003er Makros in 2007 nicht mehr klappen, wieviel Prozent der 2003er Makros in 2007 laufen kann ich nicht beurteilen, liegen ja wohl auch an den eingestzten Befehlen.

Und ich hatte noch nicht das Vergnügen mit 2007.

Gruß
Reinhard

Danke, hast mir sehr geholfen!
Gruß Torre

Guten Tag,
muss leider nochmal was fragen,
um meine daten als txt Dat zu Speichern, bekomme ich es nicht hin das es mir möglich ist den Speicherort zu wählen, da ich die datei unter mehreren (3) Ordnern unter versch. Dateinamen abspeichern muss.
lg Torre

(vorhandener Code:smile:

If Dir(curdir & "\test.txt") "" Then
 ' hier noch ggfs. abfragen ob bestehende Datei überschrieben werden soll
End If
intFree = FreeFile
Open curdir & "\test.txt" For Output As #intFree

Hallo,

um meine daten als txt Dat zu Speichern, bekomme ich es nicht
hin das es mir möglich ist den Speicherort zu wählen, da ich
die datei unter mehreren (3) Ordnern unter versch. Dateinamen
abspeichern muss.
lg Torre

(vorhandener Code:smile:

If Dir(curdir & „\test.txt“) „“ Then
’ hier noch ggfs. abfragen ob bestehende Datei
überschrieben werden soll
End If
intFree = FreeFile
Open curdir & „\test.txt“ For Output As #intFree

erst mal: Die Verwendung von CurDir ist eine wacklige Angelegenheit, das kann sich zu leicht ändern. Besser ist in Vb6: App.Path

App.Path und auch CurDir haben eine Eigenheit. Ist der Pfad ein Laufwerk, wird bereits ein ‚‘ mit zurückgegeben. Du hängst immer ein Backslash an. Wenn CurDir z.B. ‚C:‘ ist, wird der Pfad falsch, lautet dann ‚C:\Test.txt‘

Aber Du möchtest ja drei feste Pfade verwenden, dann würde ich das so schreiben:

Dim Pfad(2) As String
Dim i As Integer
Dim intFree As Integer

Pfad(0) = "DerErstePfad\"
Pfad(1) = "DerZweitePfad\"
Pfad(2) = "DerDrittePfad\"

For i = 0 To 2
 intFree = FreeFile
 Open Pfad(i) & "test.txt" For Output As #intFree
 Print #intFree, Daten
 Close #IntFree
Next

Gruß Rainer