brauseklaus
Goto Top

Benötige Unterstützung in VBA (.txt-Import in .unv-Import umwandeln)

Habe leider das Problem immer noch nicht gelöst bekommen. Ich versuche schon seit Tagen mein vorhandenes Makro welches Daten aus *.txt-Dokumenten auslesen kann, so umzuschreiben, dass es *.unv-Dokumente auslesen kann. Leider scheint dieses Dateiformat nicht so verbreitet zu sein, intensive Foren- und Websuche brachte leider kein Ergebnis.

Hier der Ausgangscode (mit besten Dank an bastla ;)

Sub WEAR()
Datei = "C:\Dukument.txt"  
Von = "WEAR" 'ab Zeile mit diesem Inhalt importieren  
Bis = "-1" 'ab Zeile mit diesem Inhalt nicht mehr importieren  
Trenn = " " 'Leerzeichen als Trennzeichen zwischen den Feldern  
'Trenn = vbTab 'TAB als Trennzeichen zwischen den Feldern  

SpNr = 1 'Daten ab Spalte A ...  
ZNr = 3 'der Zeile 3 eintragen  


Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei, 1, 0, -1) 'Textdatei im Unicode-Format öffnen  
Fertig = False 'Schalter initialisieren  
IMport = False 'Schalter initialisieren  
Do While Not DateiEin.AtEndOfStream And Not Fertig
    Satz = DateiEin.ReadLine 'Datensatz aus Datei einlesen  
    Satz = Replace(Satz, ".", ",")  
    If IMport Then 'Satz ist zu importieren  
        If InStr(Satz, Bis) = 0 Then 'Ende des Datenbereiches noch nicht erreicht  
            SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
            ZNr = ZNr + 1 'nächste Tabellenzeile  
        Else
            Fertig = True 'Ende des vorgegebenen Bereiches - keine weiteren Daten einlesen  
        End If
    Else 'bisher wurde nicht importiert - ...  
        If InStr(Satz, Von) > 0 Then '... beginnt hier der Datenbereich?  
            IMport = True 'ja; ab jetzt Zeilen importieren  
            SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
            ZNr = ZNr + 1 'nächste Tabellenzeile  
        End If
    End If
Loop
DateiEin.Close 'Textdatei schließen  
MsgBox "Fertig."  
End Sub

Sub SatzEintragen(D, Z, S)
Do While InStr(D, "  ") > 0 'solange es noch zwei aufeinanderfolgende Leerzeichen im Satz gibt ...  
    D = Replace(D, "  ", " ") ' ... diese durch ein einzelnes ersetzen  
Loop
Felder = Split(D) 'Zeile in Felder zerlegen  
Cells(Z, S).Resize(1, UBound(Felder) + 1).Value = Felder 'in der Zeile Z die Spalten ab Spalte S mit den Feldwerten füllen  
End Sub

Excel sollte das eigentlich können, denn über manuelles Datenimportieren, wird folgender Code benutzt:

Sub Makro3()
'  
' Makro3 Makro  
'  

'  
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;C:\Dokument.unv" _  
        , Destination:=Range("$A$1"))  
        .Name = "inc0_1"  
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = True
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = True
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1)
        .TextFileDecimalSeparator = "."  
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End Sub

Da ich so gut wie keine VBA Kenntnisse habe ist es mir nicht gelungen den Zweiten Code so in den ersten einzufügen, dass dieser auch *.unv verarbeiten kann. Es müsste doch eigentlich nur Zeile 12 (in Code1) angepasst werden oder irre ich mich?

Hat jemand von euch vieleicht eine Idee?

Gruß Brauseklaus

Content-Key: 144507

Url: https://administrator.de/contentid/144507

Printed on: April 25, 2024 at 19:04 o'clock

Member: bastla
bastla Jun 09, 2010 at 21:37:37 (UTC)
Goto Top
Hallo Brauseklaus!

Da ich keine Testdatei zur Verfügung habe, bleibt eigentlich nur schrittweises Herantasten ...

Ich habe den Code von oben so reduziert, dass jede Zeile gelesen und eingetragen werden sollte:
Sub WEAR()
Datei = "C:\Dokument.unv"  
Von = "WEAR" 'ab Zeile mit diesem Inhalt importieren  
Bis = "-1" 'ab Zeile mit diesem Inhalt nicht mehr importieren  
Trenn = " " 'Leerzeichen als Trennzeichen zwischen den Feldern  
'Trenn = vbTab 'TAB als Trennzeichen zwischen den Feldern  

SpNr = 1 'Daten ab Spalte A ...  
ZNr = 3 'der Zeile 3 eintragen  

Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei, 1, 0, -1) 'Textdatei im Unicode-Format öffnen  
Do While Not DateiEin.AtEndOfStream
    Satz = DateiEin.ReadLine 'Datensatz aus Datei einlesen  
    Satz = Replace(Satz, ".", ",") 'Punkt durch Komma ersetzen  
    SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
     ZNr = ZNr + 1 'nächste Tabellenzeile  
Loop
DateiEin.Close 'Textdatei schließen  
MsgBox "Fertig."  
End Sub

Sub SatzEintragen(D, Z, S)
Do While InStr(D, "  ") > 0 'solange es noch zwei aufeinanderfolgende Leerzeichen im Satz gibt ...  
    D = Replace(D, "  ", " ") ' ... diese durch ein einzelnes ersetzen  
Loop
Felder = Split(D) 'Zeile in Felder zerlegen  
Cells(Z, S).Resize(1, UBound(Felder) + 1).Value = Felder 'in der Zeile Z die Spalten ab Spalte S mit den Feldwerten füllen  
End Sub
Wenn das nicht funktioniert (BTW: wie sieht denn bisher das Ergebnis aus?), solltest Du prüfen, ob überhaupt eine Unicode-Datei vorliegt (dazu Zeile 12 auf
Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei, 1, 0)
ändern und dadurch die Textdatei wieder als ANSI interpretieren).

Noch einfacher (der gesamte Satz wird ohne Aufspaltung in einzelne Felder komplett in Spalte A eingetragen, Punkte werden nicht umgewandelt) sähe das so aus:
Sub WEAR()
Datei = "C:\Dokument.unv"  
Von = "WEAR" 'ab Zeile mit diesem Inhalt importieren  
Bis = "-1" 'ab Zeile mit diesem Inhalt nicht mehr importieren  
Trenn = " " 'Leerzeichen als Trennzeichen zwischen den Feldern  
'Trenn = vbTab 'TAB als Trennzeichen zwischen den Feldern  

SpNr = 1 'Daten ab Spalte A ...  
ZNr = 3 'der Zeile 3 eintragen  

Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei, 1, 0, -1) 'Textdatei im Unicode-Format öffnen  
Do While Not DateiEin.AtEndOfStream
    Satz = DateiEin.ReadLine 'Datensatz aus Datei einlesen  
    Cells(ZNr, SpNr) = Satz 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
     ZNr = ZNr + 1 'nächste Tabellenzeile  
Loop
DateiEin.Close 'Textdatei schließen  
MsgBox "Fertig."  
End Sub
Grüße
bastla
Member: Brauseklaus
Brauseklaus Jun 09, 2010 at 22:14:43 (UTC)
Goto Top
Hi bastla,
habe alle 3 Varianten getestet, leider immer das Gleiche: er rechnet und rechnet und rechnet bis ich ihn über Taskmanager kille. Die *.txt werden wunderbar genommen und die Aktion ist in wenigen Sekunden durch.
Wie gesagt, leider gibt das FEM-Programm mit dem ich arbeite nur *.unv's aus. Und alle manuell in *.txt zu konvertieren wäre Wahnsinn. Ich muss leider hunderte Auswerten ;(

Wenn es die Sache erleichtert, kann ich dir gerne eine Testdatei zukommen lassen (Größe ca.80kb).

Gruß Brauseklaus
Member: bastla
bastla Jun 09, 2010 at 22:21:33 (UTC)
Goto Top
Hallo Brauseklaus!

Wenn sich die ".unv"-Dateien in "normalen" Text konvertieren lassen, könnte auch folgendes (einzugeben in der CMD-Shell) funktionieren:
type C:\Dokument.unv>C:\Dokument.txt
Falls sich die so erstellte Textdatei einlesen lässt, können Deine hunderten Dateien mit einer einfachen Schleife umgewandelt werden ...
Testdatei ist natürlich auch keine schlechte Idee - meine Mail-Adresse folgt per PN.

Grüße
bastla
Member: Brauseklaus
Brauseklaus Jun 10, 2010 at 16:40:21 (UTC)
Goto Top
Hi bastla,

du hattest völlig recht, unv-Dokumente sollte man nicht als unicode öffnen oindern als ANSI.
Die Dateien lassen sich jetzt direkt einlesen.

Nur hab ich nun ein neues Problem, ab einer bestimmten Anzahl von Tabellenblättern (ich habe 71) mit dem entsprechenden (oft 30000 Zeilen) Inhalt, funktionieren die Markros generell nicht mehr . Einzig das 1. Makro, welches ich in einem Modul geschrieben habe, verrichtet nach wie vor seinen Dienst.
Jedes Tabellenblatt habe ich mit einem Makro versehen, welches 3 Parameter mit jeweils ca. 30000 Zeilen einlesen soll. Kann es sein das Excel da an seine Grenzen stößt? (sowohl Excel2003 als auch -2007).

Ich meine irgendwo gelesen zu habe, dass Excel 2007 mit 1GB Daten umgehen kann...

An meinem Rechner kann es auch nicht liegen 4x3,4Ghz; 8GB RAM, WIN7 x64

Gruß Brausklaus
Member: bastla
bastla Jun 10, 2010 at 17:48:35 (UTC)
Goto Top
Hallo Brauseklaus!

Da in Excel 2007 alleine schon über 1 Million Zeilen je Tabellenblatt möglich sind, würde ich bei den von Dir genannten Datenmengen nicht unbedingt an ein Kapazitätsproblem denken - getestet habe ich das aber auch noch nie, und einen sachdienlichen Hinweis kann ich leider auch nicht anbieten ...
Jedes Tabellenblatt habe ich mit einem Makro versehen
Das sollte eigentlich nicht nötig sein - im Makro gibt es keinen Bezug zu einer speziellen Tabelle, sodass eigentlich immer in die beim Start des Makros geöffnete Tabelle geschrieben werden sollte.

Grüße
bastla
Member: Brauseklaus
Brauseklaus Jun 10, 2010 at 22:45:10 (UTC)
Goto Top
Hi,

Also, jede einzelne Umformsimulation wird vom FEM-Programm in ca. 72 Schritten abgearbeitet. Jeder einzelne Schritt kann als *.unv mit diversen Prozessgrößen ausgeben werden. Also sind insgesamt 72 unv's pro Simulation auszuwerten.

Mein Excel-Ziel-Dokument hat insgesamt 73 Sheets, das 1. ist das Ziel an dem alles aus dem Dokument letztendlich für Berechnungen zusammenläuft (das funktioniert). Die restlichen 72 Sheets importieren Werte aus den unv's. Jedes Sheet Importiert 3 Werte (immer NORMALSTRESS, TEMPERATURE und WEAR) von einer unv und stellt diese nebeneinander da. Alles unv's sind gleich aufgebaut.

Dazu habe ich den Quellcode 72mal vervielfältigt, auf jede zu importierende unv angepasst (diese heißen inc0.unv; inc1.unv; inc2.unv;......inc72.unv) und einzeln in die 72 Tabellenblätter im Editor kopiert.

Hier ein Bsp:

Sub inc0()
Datei = "C:\Users\Brause\Documents\Dokumente Works\Nico FH\IPH\Excel\zwei_symetrien\inc0.unv"  
Von = "NORMALSTRESS" 'ab Zeile mit diesem Inhalt importieren  
Bis = "FLOWSTRESS" 'ab Zeile mit diesem Inhalt nicht mehr importieren  
Trenn = " " 'Leerzeichen als Trennzeichen zwischen den Feldern  
'Trenn = vbTab 'TAB als Trennzeichen zwischen den Feldern  

SpNr = 1 'Daten ab Spalte A ...  
ZNr = 3 'der Zeile 3 eintragen  


Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei, 1, 0) 'Textdatei im öffnen  
Fertig = False 'Schalter initialisieren  
Import = False 'Schalter initialisieren  
Do While Not DateiEin.AtEndOfStream And Not Fertig
    Satz = DateiEin.ReadLine 'Datensatz aus Datei einlesen  
    Satz = Replace(Satz, ".", ",")  
    If Import Then 'Satz ist zu importieren  
        If InStr(Satz, Bis) = 0 Then 'Ende des Datenbereiches noch nicht erreicht  
            SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
            ZNr = ZNr + 1 'nächste Tabellenzeile  
        Else
            Fertig = True 'Ende des vorgegebenen Bereiches - keine weiteren Daten einlesen  
        End If
    Else 'bisher wurde nicht importiert - ...  
        If InStr(Satz, Von) > 0 Then '... beginnt hier der Datenbereich?  
            Import = True 'ja; ab jetzt Zeilen importieren  
            SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
            ZNr = ZNr + 1 'nächste Tabellenzeile  
        End If
    End If
Loop

Von = "TEMPERATURE" 'ab Zeile mit diesem Inhalt importieren  
Bis = "32700" 'ab Zeile mit diesem Inhalt nicht mehr importieren  
Trenn = " " 'Leerzeichen als Trennzeichen zwischen den Feldern  
'Trenn = vbTab 'TAB als Trennzeichen zwischen den Feldern  

SpNr = 8 'Daten ab Spalte H ...  
ZNr = 3 'der Zeile 3 eintragen  


Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei, 1, 0) 'Textdatei öffnen  
Fertig = False 'Schalter initialisieren  
Import = False 'Schalter initialisieren  
Do While Not DateiEin.AtEndOfStream And Not Fertig
    Satz = DateiEin.ReadLine 'Datensatz aus Datei einlesen  
    Satz = Replace(Satz, ".", ",")  
    If Import Then 'Satz ist zu importieren  
        If InStr(Satz, Bis) = 0 Then 'Ende des Datenbereiches noch nicht erreicht  
            SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
            ZNr = ZNr + 1 'nächste Tabellenzeile  
        Else
            Fertig = True 'Ende des vorgegebenen Bereiches - keine weiteren Daten einlesen  
        End If
    Else 'bisher wurde nicht importiert - ...  
        If InStr(Satz, Von) > 0 Then '... beginnt hier der Datenbereich?  
            Import = True 'ja; ab jetzt Zeilen importieren  
            SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
            ZNr = ZNr + 1 'nächste Tabellenzeile  
        End If
    End If
Loop

Von = "WEAR" 'ab Zeile mit diesem Inhalt importieren  
Bis = "-1" 'ab Zeile mit diesem Inhalt nicht mehr importieren  
Trenn = " " 'Leerzeichen als Trennzeichen zwischen den Feldern  
'Trenn = vbTab 'TAB als Trennzeichen zwischen den Feldern  

SpNr = 12 'Daten ab Spalte L ...  
ZNr = 3 'der Zeile 3 eintragen  


Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei, 1, 0) 'Textdatei öffnen  
Fertig = False 'Schalter initialisieren  
Import = False 'Schalter initialisieren  
Do While Not DateiEin.AtEndOfStream And Not Fertig
    Satz = DateiEin.ReadLine 'Datensatz aus Datei einlesen  
    Satz = Replace(Satz, ".", ",")  
    If Import Then 'Satz ist zu importieren  
        If InStr(Satz, Bis) = 0 Then 'Ende des Datenbereiches noch nicht erreicht  
            SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
            ZNr = ZNr + 1 'nächste Tabellenzeile  
        Else
            Fertig = True 'Ende des vorgegebenen Bereiches - keine weiteren Daten einlesen  
        End If
    Else 'bisher wurde nicht importiert - ...  
        If InStr(Satz, Von) > 0 Then '... beginnt hier der Datenbereich?  
            Import = True 'ja; ab jetzt Zeilen importieren  
            SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
            ZNr = ZNr + 1 'nächste Tabellenzeile  
        End If
    End If
Loop
DateiEin.Close 'Textdatei schließen  
End Sub

Sub SatzEintragen(D, Z, S)
Do While InStr(D, "  ") > 0 'solange es noch zwei aufeinanderfolgende Leerzeichen im Satz gibt ...  
    D = Replace(D, "  ", " ") ' ... diese durch ein einzelnes ersetzen  
Loop
Felder = Split(D) 'Zeile in Felder zerlegen  
Cells(Z, S).Resize(1, UBound(Felder) + 1).Value = Felder 'in der Zeile Z die Spalten ab Spalte S mit den Feldwerten füllen  
End Sub

Zuerst lief es auch (mit ca. 10 Makros), aber irgendwann um so mehr Makros ich hineinkopierte und testete ging mit mal nichts mehr. (Habe ich öfter versucht.)

Ach ja, auf das 1. Sheet importiere ich eine Tabelle aus einem externen *.vtf-Dokument und ergänze diese dann mit einzelnen Werten aus den importierten unv's (Sheet 2-72). Das Makro für das erste Sheet sitz auf Modul1 im Editor, welches komischerweise als einziges noch funktioniert während die anderen schon nicht mehr gehen.

Hier der Code falls interesse besteht:

Sub ImportDatenAusQuelldatei()

'Zieldatei definieren und aktivieren  
Dim Ziel As String
Ziel = "Knoten500.xls"  
Workbooks(1).Activate

'Startzeile m in Ziel festlegen  
m = 1


'Quelldatei definieren und öffnen  
Dim Quelle As Workbook
Set Quelle = Workbooks.Open("C:\Users\Brause\Documents\Dokumente Works\Nico FH\IPH\Excel\gesenk.vtf")  

Sheets("gesenk").Select  


'Setzen der Startzeile i der Tabelle gesenk  
i = 8

'Ermitteln der letzten Zeile in gesenk, die Daten enthält  
Dim LZ As Long
LZ = IIf(IsEmpty(Sheets("gesenk").Range("A65536")), Sheets("gesenk").Range("A65536").End(xlUp).Row, 65536)  

'Das zeilenweise einlesen von Quelle nach Ziel soll bis zur letzten Zeile von Quelle erfolgen  
Do Until i > LZ

'Definition der Spalten in Quelle  
A = Quelle.Sheets("gesenk").Cells(i, 1).Text  
B = Quelle.Sheets("gesenk").Cells(i, 2).Text  
C = Quelle.Sheets("gesenk").Cells(i, 3).Text  
D = Quelle.Sheets("gesenk").Cells(i, 4).Text  
E = Quelle.Sheets("gesenk").Cells(i, 5).Text  

'Zieltabelle aktivieren  
Workbooks(1).Activate
Sheets("ziel").Select  

'Schreiben der Spalten in neue Spaltenposition A nach A, B nach B, C nach C, D nach D, E nach D  
Workbooks(1).Sheets("ziel").Cells(m, 1) = A  
Workbooks(1).Sheets("ziel").Cells(m, 2) = B  
Workbooks(1).Sheets("ziel").Cells(m, 3) = C  
Workbooks(1).Sheets("ziel").Cells(m, 4) = D  
'Workbooks(1).Sheets("ziel").Cells(m, 5) = E  

m = m + 1
i = i + 1

Loop

Quelle.Close 'Quelldatei schließen  

Call Tabelle2.inc0
Call Tabelle46.inc1
'Call Tabelle45.inc2  
'Call Tabelle44.inc3  
'Call Tabelle43.inc4  
'Call Tabelle42.inc5  
'Call Tabelle41.inc6  
'Call Tabelle40.inc7  
'Call Tabelle39.inc8  
'Call Tabelle38.inc9  
'Call Tabelle37.inc10  
'Call Tabelle63.inc61  

MsgBox "Fertig."  

End Sub
Dieses sollte mein Haupt-Markro werden, welches beim ausführen die anderen Makros callt (es stehen noch nicht alle drin..).

Wahrscheinlich alles viel zu konfus, aber ich hoffe man kann mir so einigermaßen folgen.

Gruß Brause
Member: bastla
bastla Jun 11, 2010 at 23:46:18 (UTC)
Goto Top
Hallo Brauseklaus!

Du könntest es so versuchen:
Sub Alle()
Datei = "C:\Users\Brause\Documents\Dokumente Works\Nico FH\IPH\Excel\zwei_symetrien\inc"  
Typ = ".unv"  
Trenn = " " 'Leerzeichen als Trennzeichen zwischen den Feldern  
'Trenn = vbTab 'TAB als Trennzeichen zwischen den Feldern  


For i = 2 To Worksheets.Count
    Worksheets(i).Activate

    Von = "NORMALSTRESS" 'ab Zeile mit diesem Inhalt importieren  
    Bis = "FLOWSTRESS" 'ab Zeile mit diesem Inhalt nicht mehr importieren  

    SpNr = 1 'Daten ab Spalte A ...  
    ZNr = 3 'der Zeile 3 eintragen  


    Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei & CStr(i-2) & Typ, 1, 0) 'Textdatei im öffnen  
    Fertig = False 'Schalter initialisieren  
    Import = False 'Schalter initialisieren  
    Do While Not DateiEin.AtEndOfStream And Not Fertig
       Satz = DateiEin.ReadLine 'Datensatz aus Datei einlesen  
        Satz = Replace(Satz, ".", ",")  
        If Import Then 'Satz ist zu importieren  
            If InStr(Satz, Bis) = 0 Then 'Ende des Datenbereiches noch nicht erreicht  
                SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
                ZNr = ZNr + 1 'nächste Tabellenzeile  
            Else
                Fertig = True 'Ende des vorgegebenen Bereiches - keine weiteren Daten einlesen  
            End If
        Else 'bisher wurde nicht importiert - ...  
            If InStr(Satz, Von) > 0 Then '... beginnt hier der Datenbereich?  
                Import = True 'ja; ab jetzt Zeilen importieren  
                SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
                ZNr = ZNr + 1 'nächste Tabellenzeile  
            End If
        End If
    Loop

    Von = "TEMPERATURE" 'ab Zeile mit diesem Inhalt importieren  
    Bis = "32700" 'ab Zeile mit diesem Inhalt nicht mehr importieren  

    SpNr = 8 'Daten ab Spalte H ...  
    ZNr = 3 'der Zeile 3 eintragen  


    Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei & CStr(i-2) & Typ, 1, 0) 'Textdatei im öffnen  
    Fertig = False 'Schalter initialisieren  
    Import = False 'Schalter initialisieren  
    Do While Not DateiEin.AtEndOfStream And Not Fertig
        Satz = DateiEin.ReadLine 'Datensatz aus Datei einlesen  
        Satz = Replace(Satz, ".", ",")  
        If Import Then 'Satz ist zu importieren  
            If InStr(Satz, Bis) = 0 Then 'Ende des Datenbereiches noch nicht erreicht  
                SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
                ZNr = ZNr + 1 'nächste Tabellenzeile  
            Else
                Fertig = True 'Ende des vorgegebenen Bereiches - keine weiteren Daten einlesen  
            End If
        Else 'bisher wurde nicht importiert - ...  
            If InStr(Satz, Von) > 0 Then '... beginnt hier der Datenbereich?  
                Import = True 'ja; ab jetzt Zeilen importieren  
                SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
                ZNr = ZNr + 1 'nächste Tabellenzeile  
            End If
        End If
    Loop

    Von = "WEAR" 'ab Zeile mit diesem Inhalt importieren  
    Bis = "-1" 'ab Zeile mit diesem Inhalt nicht mehr importieren  

    SpNr = 12 'Daten ab Spalte L ...  
    ZNr = 3 'der Zeile 3 eintragen  


    Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei & CStr(i-2) & Typ, 1, 0) 'Textdatei im öffnen  
    Fertig = False 'Schalter initialisieren  
    Import = False 'Schalter initialisieren  
    Do While Not DateiEin.AtEndOfStream And Not Fertig
        Satz = DateiEin.ReadLine 'Datensatz aus Datei einlesen  
        Satz = Replace(Satz, ".", ",")  
        If Import Then 'Satz ist zu importieren  
            If InStr(Satz, Bis) = 0 Then 'Ende des Datenbereiches noch nicht erreicht  
                SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
                ZNr = ZNr + 1 'nächste Tabellenzeile  
            Else
                Fertig = True 'Ende des vorgegebenen Bereiches - keine weiteren Daten einlesen  
            End If
        Else 'bisher wurde nicht importiert - ...  
            If InStr(Satz, Von) > 0 Then '... beginnt hier der Datenbereich?  
                Import = True 'ja; ab jetzt Zeilen importieren  
                SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen  
                ZNr = ZNr + 1 'nächste Tabellenzeile  
            End If
        End If
    Loop
    DateiEin.Close 'Textdatei schließen  
Next
End Sub

Sub SatzEintragen(D, Z, S)
Do While InStr(D, "  ") > 0 'solange es noch zwei aufeinanderfolgende Leerzeichen im Satz gibt ...  
    D = Replace(D, "  ", " ") ' ... diese durch ein einzelnes ersetzen  
Loop
Felder = Split(D) 'Zeile in Felder zerlegen  
Cells(Z, S).Resize(1, UBound(Felder) + 1).Value = Felder 'in der Zeile Z die Spalten ab Spalte S mit den Feldwerten füllen  
End Sub
Die Schleife durchläuft die Tabellenblätter ab dem zweiten Blatt (der Blattname ist jeweils egal).

Da sich in den 3 Bereichen eigentlich nur "Von", "Bis" und die "SpNr" unterscheiden, gibt es da noch weiteres Optimierungpotenzial (können wir in Angriff nehmen, sobald es mit dieser Version geklappt hat) ...

Grüße
bastla
Member: Brauseklaus
Brauseklaus Jun 13, 2010 at 13:18:20 (UTC)
Goto Top
Hi bastla,

was soll ich sagen, du bist ein Genie. Das Programm läuft super, ich kann jetzt alle 71 unv's in ein Dokument einlesen (Excel 2007). Mit Excel 2003 muss ich Montag testen. Es kommt mir auch so vor als ob die einzelnen Quelldateien jetzt schneller ausgelesen werden, aber das ist vielleicht nur Einbildung.

Wenn die Optimierungen einzig den Vorteil der Verkleinerung des Quellcodes haben, ist es denke ich nicht notwendig.

Tausend Dank nochmal dafür.

Btw: Hast du schon mit Excel 2010 (beta) Erfahrung gemacht? Bringt es möglicherweise Geschwindigkeits-, Bedienungs-, Kompatibilitäts- oder andere Vorteile?
Ich denke gerade über die Anschaffung nach.

Gruß Brause
Member: bastla
bastla Jun 13, 2010 at 13:28:00 (UTC)
Goto Top
Hallo Brauseklaus!

Freut mich, wenn's für Dich passt. face-smile

Zu Excel 2010 kann ich leider nix sagen ...

Grüße
bastla
Member: Brauseklaus
Brauseklaus Jul 04, 2010 at 19:49:37 (UTC)
Goto Top
Hi bastla,

habe neulich vor lauter Euphorie nicht bemerkt (oder verdrängt), dass nachdem das Programm die vorhandenen .unv’s ausgelesen hat, eine Fehlermeldung „Laufzeitfehler 53-Datei nicht gefunden“ kommt. Ich nehme an, dass das Programm nach weiteren .unv-Datein vergeblich weiter sucht. Ich habe es sonst einfach "Beenden" gedrückt, da der Import ja schon abgeschlossen war. Nun habe ich dieses Makro aber in einer Kette von anderen eingebunden und da es nicht ordentlich beendet wird, starten die Folgenden nicht. Habe schon versucht selbst eine Zählschleife einzubauen, was mir aber nicht gelang.
Vielleicht hast du ja noch einen Tipp für mich.

Gruß Brause
Member: bastla
bastla Jul 04, 2010 at 20:49:14 (UTC)
Goto Top
Hallo Brauseklaus!

Nur zur Sicherheit solltest Du einmal vorweg nach den "Loop"-Zeilen 38 und 67 jeweils die Datei schließen:
DateiEin.Close 'Textdatei schließen
Ich nehme an, dass das Programm nach weiteren .unv-Datein vergeblich weiter sucht.
Es wird versucht, für jedes Tabellenblatt (außer dem ersten) eine Datei zu öffnen - demnach ist die Anzahl der Dateien vorgegeben ...

Zum Testen könntest Du einfach vor die Zeile 18 (und ev auch 47 und 76) den Befehl
Debug.Print Datei & CStr(i-2) & Typ
setzen und Dir damit im "Direktbereich" (Aufruf mit Strg+G) des VBA-Editors jeweils die zu öffnende Datei anzeigen lassen - so sollte sich feststellen lassen, welche Datei denn nun nicht gefunden wird.

Als Alternative könnte natürlich auch mit
If fso.FileExists(Datei & CStr(i-2) & Typ) Then
(ebenfalls unmittelbar vor der Zeile 18) geprüft werden, ob die Datei vorhanden ist - allerdings müsste dann natürlich eine Fehlerbehandlung (und sei es ein Abbruch mit dem Hinweis auf die fehlende Datei) integriert werden.

Grüße
bastla
Member: Brauseklaus
Brauseklaus Jul 04, 2010 at 23:10:12 (UTC)
Goto Top
Hi bastla,
cool das du nochmal hilfst.

Beim Anzeigen der bearbeiteten Dateien im Direktbereich stellte sich heraus, dass das Programm nicht wie die von erhoffte Reihenfolge 0.unv; 1.unv;…….; 70.unv ausliest, sondern bei 1.unv beginnt und somit versucht 71.unv zu finden. Das ist sicherlich die Fehlerursache.
Hast du eine Idee wie man das Programm überreden könnte bei 0.unv zu starten? Ein weiterer Punkt ist, da ich das Dokument vielfach duplizieren möchte und es vorkommen kann, dass auch mal 71-unv’s auszulesen sind, ob man dieses berücksichtigen könnte.

Gruß Brause
Member: bastla
bastla Jul 05, 2010 at 06:52:26 (UTC)
Goto Top
Hallo Brauseklaus!

Der Dateiname wird mit "Datei & CStr(i-2) & Typ" festgelegt - wenn Du daher anstelle von "-2" den Wert "-3" verwendest, könnte die Nummerierung passen.
Ein weiterer Punkt ist, da ich das Dokument vielfach duplizieren möchte und es vorkommen kann, dass auch mal 71-unv’s auszulesen sind, ob man dieses berücksichtigen könnte.
Wie erwähnt wird das Einlesen durch die Anzahl der Tabellenblätter gesteuert (siehe "For i = 2 To Worksheets.Count") ...

Grüße
bastla
Member: Brauseklaus
Brauseklaus Jul 05, 2010 at 12:22:53 (UTC)
Goto Top
Hi bastla,

Perfekt! ;)
Das Programm (und die Folgenden) läuft jetzt sauber durch. Was mir allerdings erst jetzt auffällt, ist das alle Werte in Textformat importiert werden.
Müsste das nicht durch Zeile 106 (.Value) verhindert werden?

Gruß Brause
Member: bastla
bastla Jul 06, 2010 at 12:30:38 (UTC)
Goto Top
Hallo Brauseklaus!

Mit ".Value" hat das nix zu tun (damit wird nur angegeben, dass als "Wert" und nicht als "Formel" eingetragen wird und könnte, da Default, sogar weggelassen werden) - das kommt eher daher, dass der Satz als String gelesen und dann in Teilstrings gesplittet wird ...

Als (langsamere) Alternative könntest Du es mit folgendem "Sub" versuchen:
Sub SatzEintragen(D, Z, S)
Do While InStr(D, "  ") > 0 'solange es noch zwei aufeinanderfolgende Leerzeichen im Satz gibt ...  
    D = Replace(D, "  ", " ") ' ... diese durch ein einzelnes ersetzen  
Loop
Felder = Split(D) 'Zeile in Felder zerlegen  
For j = 0 To UBound(Felder)
    Cells(Z, S + j).Value = Felder(j) 'in der Zeile Z die Spalten ab Spalte S mit den Feldwerten füllen  
Next
End Sub
Grüße
bastla
Member: Brauseklaus
Brauseklaus Jul 06, 2010 at 19:36:24 (UTC)
Goto Top
Hi bastla,

habe deinen Quelltext mal getestet. Die Werte werden jetzt zwar richtig konvertiert aber gleichzeitig mit 10^4 multipliziert. Dieses gleiche Phänomen hatte ich gestern beim testen eines anderen Codes schon einmal ^^

Bin noch auf eine andere Lösungsmöglichkeit gestoßen:

Range("I8:I15000").Select  
    Do Until ActiveCell.Value = ""  
         ActiveCell.Value = ActiveCell.Value * 1
         ActiveCell.Offset(1, 0).Select
      Loop

(vor dem "Next" platziert)

Da es eigentlich nur wichtig war diese Spalte umzuwandeln, reicht mir das (vorläufig ;).


Gruß und Danke!

der Brause