VBA Programmierung

Hallo BigBen,
nachdem du mir das letzte Mal mit dem Zusammenbau meiner txt Datei so gut helfen konntest, geht nun der Kampf gegen VBA in die nächste Runde.
Die Erstellung meines txt funktioniert super!
Jetzt brauche ich zwei weitere Funktionen mit den folgenden Arbeitsweisen.

  • gehe in Zeile xxx und lese die Zahl hinter dem zweiten Komma in Variable A ein
  • schreibe den Inhalt aus Variable B in Zeile xxx hinter das zweite Komma
    Das war jetzt nur ein Beispiel, aber mit der grundsätzlichen Vorgehensweise bekomme ich die Anpassung schon hin.
    Ich will also einzelne Ziffern im txt einlesen und überarbeitet wieder einfügen. Wäre super wenn du mir einen Hinweis geben kannst auf die gesuchte Funktionsart.

Eine weitere Frage noch:
Ich beginne mit VBA eine simple exe mit einzubinden, deren Quellcode nicht einsehbar ist. Diese braucht lediglich eine txt Datei als Input und gibt eine weiter txt als Output. Ich kann diese exe mit Shell öffnen, ich kann das erscheinende Browsingfenster mit Sendkeys ausfüllen und schließen.
Ein weiteres, nach dem Browsingfenster ersdcheinendes Fenster kann ich nicht mit
SendKeys ("%{F4}") schließen, jedoch wenn ich nach Macroende manuall ALT+F4 drücke. Kannst du dir darauf einen Reim machen? Oder hast du noch andere Funktionen parat mit denen ich in diesem Anwendungsfeld arbeiten könnte, wie Fensterwechsel (wobei ich nicht weiß wie ich das Fenster ansprechen soll, ist kein txt o.Ä. ist irgendwas selbst geschriebenes).

Sooo,
viel zu viel Text erstmal!
Ich danke dir für jede Antwort und hoffe ich konnte meine Probleme einigermaßen exakt beschreiben.

Viele Grüße

Hallo DMay2000,

das Vorhaben lässt sich auf zwei Wegen umsetzen:

VBA-Methode:

Um eine Zahl suchen zu können, muss der Text zeichenweise durchsucht werden.

Der Suchvorgang dauert je nach Umfang de Textes lange.

Lösungsansatz zum Suchen einer Zahl:

Private Function ExtractNumber(str As String) As Long
Dim i As Byte, ii As Byte

For i = 1 To Len(str)
If IsNumeric(Mid(str, i, 1)) Then Exit For
Next i
For ii = i To Len(str)
If Not IsNumeric(Mid(str, ii, 1)) Then Exit For
Next ii
ExtractNumber = Mid(str, i, Len(str) - (ii - i))
End Function

RegExpression-Lösung:

Diese Lösung greift auf die RegExpression-Bibliothek zurück:

’ Liest Zahlen aus einem String heraus
’ matchNr gibt an, welcher Treffer ausgelesen werden soll
Function getZahl(ByVal myStr As String, Optional ByVal matchNr As Integer = 1)
Dim regEx As Object
Dim Matches As Object

Hallo BigBen,
vielen Dank schonmal für die Hinweise. Das Wochenende wurde nicht mit VBA verbraten, aber jetzt gehts wieder los.

Ich glaube mit der RegExpression-Lösung könnte ich auf einen Gründen Zweig kommen. Die Sache ist nur, dass im diskutireten Beispiel auf Zellen in Excel zugegriffen werden kann.
Ich jedoch weiß von meiner einzulesenden Zahl folgendes:

  • Sie steht in einem Textfile mit dem Namen xxx.erg
    Ich müsste also im Besten Fall die .erg in eine .txt Datei umwandeln um darin zu arbeiten? Ist echt ne Frage, weil ich die .erg-Files auch mit dem Notepad ohne weiteres bearbeiten kann.
  • die Zahl steht immer in Ln33, Col26 in der Form 0.10000000E+01
    Die Zahl endet also immer in Ln33, Col40

Wenn ich also der RegExpression-Version den Startpunkt in Ln33 setzte, dann könnte ich aus der ganzen Zeile
" 0.15085928E+03 | 0.10000000E+01 | 0.00000000E+00 | 0.20000000E+01 | 0.40000000E+00"
sicherlich mit so mancher Anpassarbeit meinen gewünschten Wert (den zweiten) auslesen.

Diese Zahl soll in VBA in eine Iteration eingebunden werden (Das bekomme ich ohne Probleme hin, sobald ich die Zahl in einer Variable stehen habe :wink: ).
Die iterierte Zahl soll in ein weiteres File xxx.ein immer in Ln36, Col1 in der Form 1.0 geschrieben werden. (Auch hier die Frage, muss der Name erst in xxx.txt umgewandelt werden, wenn ja, haben Sie einen spontanen Lösungsansatz?)
Dieses zweite File xxx.ein wird dann der exe zugeführt und damit komme ich zu diesen gesuchten Funktionen.
Ich öffne die exe mit Shell, es öffnet sich das Browsingfenster (im Eingabefenster steht dann schon das gewünschte File xxx.ein) ich muss also nur bestätigen. Das funktioniert schon mit SendKeys ("{ENTER}") bisher zuverlässig. Das Browsingfenster schließt sich und die .exe rechnet kurz. Es öffnet sich ein Ergebnisfenster. Dieses will ich schließen (SendKeys „%{F4}“ funktioniert hier ganz und garnicht zuverlässig, obwohl das Ergebnisfenster eigentlich aktiv ist, manchmal schließt er mir mein Visual-Basic, manchmal nichts). Die Ergebnisse wurden nämlich bereits im xxx.erg-File gespeichert sind, mit dem ich weiterarbeiten möchte.
Ende des Hexenwerkes.

In einer Iterationsschleife wiederholt sich dann das ganze, bis ein Abbruchkriterium einsetzt.

Ich hoffe ich überlade Sie nicht mit Fragen und hoffe auf weitere Vorschläge zur Lösung des Problems.

Vielen Dank und Grüße,
DMay2000

Hallo DMay2000,

um eine Textdatei einlesen zu können, muss diese nicht umbenannt werden. Eine Textdatei kann einen beliebigen Dateinamen und -Erweiterung besitzen.

Im Beispiel-Code wird davon ausgegangen, dass die Datei xxx.ein im Pfad F:\temp\ gespeichert wurde:

Option Explicit

Sub Auslesen()
Dim strFileName As String
strFileName = „F:\Temp\xxx.ein“
Dim strLine As String
Dim iMc As Integer
Dim iLine As Integer
Dim iFreeFile As Integer

Dim m As Object 'VBScript_RegExp_55.Match
Dim mc As Object 'VBScript_RegExp_55.MatchCollection

iFreeFile = FreeFile()

If Dir(strFileName) „“ Then

Open strFileName For Input As #iFreeFile

Do Until EOF(iFreeFile)

Input #iFreeFile, strLine
iLine = iLine + 1

Debug.Print „> Zeile " & CStr(iLine) & „: " & strLine
Set mc = getMatchCollection(“([0-9|.]+e[+|-][0-9]+)+“, strLine)
If mc.Count > 0 Then
For iMc = 0 To mc.Count - 1
Set m = mc.Item(iMc)
Debug.Print " Zeile 1: 0.15085928E+03 | 0.1000000000000000000E+01 | 0.00000000E+00 | 0.2000000000E+01 | 0.400000000000E+00
Zeile 2: 1.15085928E+03 | 1.1000000000000000000E+01 | 1.00000000E+00 | 1.2000000000E+01 | 1.400000000000E+00
= Auszuwertende Textzeile