Messwerte aus einer Textdatei in Excel einlesen

  • Excel

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von joethebot.

    Messwerte aus einer Textdatei in Excel einlesen

    Hallo,

    ich bin neu hier und habe nicht sonderlich viel Erfahrung mit VBA.

    Ich schreibe grad meine Masterarbeit und habe von einem Diplomanden eine Exceldatei zur Verfügung gestellt bekommen.

    In dieser Datei ist ein Makro(?) mit Button, der aus einer Textdatei, welche von einem FEM-Programm ausgegeben wurde, Werte zur Verformung und Krafteinleitung einliest.

    Es werden verschiedene Lastschritte in Blöcken aufgezeichnet. Aus diesen Lastschritten liest das VBA-Programm die Werte ein. Manchmal kann es sein, dass in dem ersten dieser Lastschritte (Blöcke) keine Aufzeichnungen von dem FEM Programm gemacht werden und eine "Null" in die Textdatei geschrieben wird. An dieser Stelle, also in der ersten Zeile, liest das Programm eine Null ein und speichert sie unter der Variable Count. Später wird durch diesen Wert (Count) geteilt. Da man nicht durch null teilen kann gibt das Programm einen Debug Fehler aus.

    Hier Teile des Programms:

    Quellcode

    1. If typ Then Sum = Sum / Count * (-1) AddtRow Step, Sum, ExcelRowNr
    2. Else:
    3. Sum = Sum / (1000) AddfRow Step, Sum, ExcelRowNr End If End If Wend



    gerne schicke ich auch eine datei, welche eingelesen werden muss und den ganzen programm code per pn an einen netten forumsbesucher, der helfen will.

    ich danke euch schon mal allen im voraus und verzeiht mir, wenn ich mich nicht korrekt ausgedrückt habe bezüglich der fachsprache.

    meine frage (danke picoflop :) ) lautet:

    wie kann ich dem programm sagen, dass die Null überspringen werden soll, falls eine vorhanden ist in der Zeile. eine null schreibt das programm diana übrigens folgendermassen : 0.000E+00

    eine schnelle idee von mir war, dass ich eine if schleife einbaue, die eben abfragt, ob die zeile eine mull enthält oder nicht----??!!

    gruß

    hannes

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „joethebot“ ()

    hmmm
    was ist die FRAGE?

    dass ich eine if schleife einbaue

    Wenn du das tust, dann hauen wir dich ... Klick mich

    Aber sicherlich ist das Abfragen/Abfangen der 0 per if schon die richtige Lösung

    if count <> 0 then
    If typ Then Sum = Sum / Count * (-1) AddtRow Step, Sum, ExcelRowNr
    Else:
    Sum = Sum / (1000) AddfRow Step, Sum, ExcelRowNr End If End If
    endif

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „picoflop“ ()

    mußte gerade herzlichst lachen :D

    Visual Basic-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Try
    3. Dim c As Long = 0
    4. Dim a As Int32Dim b As Int32
    5. a = 4
    6. b = 0
    7. c = a / b
    8. Catch ex As OverflowException
    9. MessageBox.Show("Böser böser Datentypbereichsfehler")
    10. End Try
    11. End Sub


    war meine Idee ^^
    oh man...

    bin beeindruckt, wie schnell ihr antowrtet...

    vielen dank..

    ich muss jetzt eine berechnung abwarten, bis ich wieder eine datei habe, die ich einlesen kann...

    morgen werde ich dann berichten, ob es geklappt hat...

    danke danke danke

    gruß

    hannes
    nochmal hallo zusammen,

    leider ist das problem damit nicht behoben. ich werde euch einfach die txt datei anhängen und hoffe auf eure hilfe.

    vielen dank.


    Visual Basic-Quellcode

    1. Sub Makro1()
    2. Dim ExcelRowNr
    3. Dim Step
    4. Dim typ
    5. ExcelRowNr = 1
    6. Step = 0
    7. typ = False
    8. AddRow "Lastschritt", "Kraft [kN]", "Lastschritt", "Durchbiegung [mm]", ExcelRowNr
    9. AddRow 0, 0, 0, 0, ExcelRowNr
    10. Dim DLG
    11. DLG = Application.GetOpenFilename("Diana Dateien (*.txt), *.txt")
    12. Open DLG For Input As #1
    13. Dim Text
    14. Dim Sum
    15. Dim Count
    16. While Not EOF(1)
    17. Input #1, Text
    18. zaehler = zaehler + 1
    19. If Mid(Text, 1, 4) = "Step" Then
    20. Step = Mid(Text, 23)
    21. Sum = 0
    22. Count = 0
    23. Input #1, Text
    24. Input #1, Text
    25. Input #1, Text
    26. Input #1, Text
    27. Input #1, Text
    28. zaehler = zaehler + 5
    29. If Mid(Text, 13, 1) = "T" Then
    30. typ = True
    31. Else:
    32. typ = False
    33. End If
    34. Input #1, Text
    35. Input #1, Text
    36. While Not EOF(1) And Not Len(Trim(Text)) < 2 And Not IsEmpty(Trim(Text)) And IsNumeric(Text)
    37. Sum = Sum + CDbl(Text)
    38. Count = Count + 1
    39. Input #1, Text
    40. If Not EOF(1) Then
    41. Input #1, Text
    42. End If
    43. Wend
    44. If typ Then
    45. Sum = Sum / Count * (-1)
    46. AddtRow Step, Sum, ExcelRowNr
    47. Else:
    48. Sum = Sum / (1000)
    49. AddfRow Step, Sum, ExcelRowNr
    50. End If
    51. End If
    52. Wend
    53. Close #1
    54. If typ Then
    55. AddtRow "Ende", "", ExcelRowNr
    56. Else:
    57. AddfRow "Ende", "", ExcelRowNr
    58. End If
    59. End Sub
    60. Private Sub AddRow(t1, t2, t3, t4, Row)
    61. ActiveSheet.Cells(Row, 1) = t1
    62. ActiveSheet.Cells(Row, 2) = t2
    63. ActiveSheet.Cells(Row, 3) = t3
    64. ActiveSheet.Cells(Row, 4) = t4
    65. Row = Row + 1
    66. End Sub
    67. Private Sub AddfRow(t1, t2, Row)
    68. ActiveSheet.Cells(Row, 1) = t1
    69. ActiveSheet.Cells(Row, 2) = t2
    70. Row = Row + 1
    71. End Sub
    72. Private Sub AddtRow(t3, t4, Row)
    73. ActiveSheet.Cells(Row, 3) = t3
    74. ActiveSheet.Cells(Row, 4) = t4
    75. Row = Row
    76. End Sub



    in dieser textdatei von diana sind verschiedene blöcke. ein block sieht so aus...

    Quellcode

    1. Analysis type NONLIN
    2. Step nr. 1
    3. Load factor 1.060E+02
    4. Result DISPLA TOTAL TRANSL
    5. Axes GLOBAL
    6. Nodnr TDtZ
    7. 350 0.000E+00
    8. 353 0.000E+00
    9. 356 0.000E+00
    10. 361 0.000E+00
    11. 366 0.000E+00
    12. 454 0.000E+00
    13. 457 0.000E+00
    14. 460 0.000E+00
    15. 465 0.000E+00
    16. 498 0.000E+00
    17. 501 0.000E+00
    18. 504 0.000E+00
    19. 509 0.000E+00
    20. 2142 -2.169E-02
    21. 2145 -2.156E-02
    22. 2148 -2.149E-02
    23. 2153 -2.162E-02
    24. 2158 -2.152E-02
    25. 2246 -2.146E-02
    26. 2249 -2.148E-02
    27. 2252 -2.147E-02
    28. 2257 -2.147E-02
    29. 2290 -2.156E-02
    30. 2293 -2.168E-02
    31. 2296 -2.152E-02
    32. 2301 -2.161E-02



    es gibt 90 dieser blöcke...mein ziel ist es, die 0.000E+00 - Reihen zu übergehen und einfach nicht zu beachten. denn jetzt gibt excel immer ein debugger fehler aus. die knotennummer (nodnr) bleibt in allen blöcken immer die gleiche...

    der debugger fehler wird in zeile 61 angezeigt...

    könnt ihr mir nochmal helfen??

    vielen lieben dank im voraus


    gruß

    hannes
    Dateien
    • durchbiegung.txt

      (98,94 kB, 199 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „joethebot“ ()

    Visual Basic-Quellcode

    1. If typ and count <> 0 Then
    2. Sum = Sum / - cdbl(Count)
    3. AddtRow Step, Sum, ExcelRowNr
    4. ' Last-Ergebnisse
    5. Else:
    6. Sum = Sum / (1000)
    7. AddfRow Step, Sum, ExcelRowNr
    8. End If



    Der Punkt ist dein Counter kann 0 sein,

    2. Punkt kann der Datentyp sein

    dim sum as double

    dim count as integer
    vielen dank...

    das makro erstellt ja vier spalten.
    in der ersten und in der dritten werden nur die lastschritte ausgegeben.

    die zweite spalte gibt er nach den im post #8 aufgeführten veränderungen auch super aus (kraft). allerdings bleibt spalte 4 (verschiebung) komplett leer.

    habt ihr eine idee??
    hab euch mal die excel datei angehängt...einfach auf import klicken und die txt-datei, die ich in post#5 hochgeladen habe einlesen lassen
    gruß

    hannes

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „joethebot“ ()

    ich komm einfach nicht drauf...

    den logikfehler verstehe ich...aber wie kann ich das programm ändern??

    da ich das programm nicht selber geschrieben habe, ist es schwer, alles nachzuvollziehen.

    vielleicht würde mir eine helfen und mir ein kleinen programm schreiben, wenn es nicht zuviel aufwand ist.

    ich habe also folgendes problem:

    ich würde gerne aus dieser datei, die ich mit dem editor öffnen kann, folgende sachen in einer excel tabelle ausgeben lassen:

    Quellcode

    1. Durchbiegung Page 1
    2. Analysis type NONLIN
    3. Step nr. 1
    4. Load factor 1.060E+02
    5. Result DISPLA TOTAL TRANSL
    6. Axes GLOBAL
    7. Nodnr TDtZ
    8. 350 0.000E+00
    9. 353 0.000E+00
    10. 356 0.000E+00
    11. 361 0.000E+00
    12. 366 0.000E+00
    13. 454 0.000E+00
    14. 457 0.000E+00
    15. 460 0.000E+00
    16. 465 0.000E+00
    17. 498 0.000E+00
    18. 501 0.000E+00
    19. 504 0.000E+00
    20. 509 0.000E+00
    21. 2142 -2.169E-02
    22. 2145 -2.156E-02
    23. 2148 -2.149E-02
    24. 2153 -2.162E-02
    25. 2158 -2.152E-02
    26. 2246 -2.146E-02
    27. 2249 -2.148E-02
    28. 2252 -2.147E-02
    29. 2257 -2.147E-02
    30. 2290 -2.156E-02
    31. 2293 -2.168E-02
    32. 2296 -2.152E-02
    33. 2301 -2.161E-02
    34. Analysis type NONLIN
    35. Step nr. 1
    36. Load factor 1.060E+02
    37. Result FORCE REACTI TRANSL
    38. Axes GLOBAL
    39. Nodnr FBZ
    40. 350 -1.970E+01
    41. 353 -4.257E+01
    42. 356 -4.222E+01
    43. 361 -8.645E+01
    44. 366 -8.498E+01
    45. 454 -4.196E+01
    46. 457 -4.222E+01
    47. 460 -8.390E+01
    48. 465 -8.395E+01
    49. 498 -4.256E+01
    50. 501 -1.970E+01
    51. 504 -8.498E+01
    52. 509 -8.644E+01
    53. Analysis type NONLIN
    54. Step nr. 2
    55. Load factor 2.120E+02
    56. Result DISPLA TOTAL TRANSL
    57. Axes GLOBAL
    58. Nodnr TDtZ
    59. 350 0.000E+00
    60. 353 0.000E+00
    61. 356 0.000E+00
    62. 361 0.000E+00
    63. 366 0.000E+00
    64. 454 0.000E+00
    65. 457 0.000E+00
    66. 460 0.000E+00
    67. 465 0.000E+00
    68. 498 0.000E+00
    69. 501 0.000E+00
    70. 504 0.000E+00
    71. 509 0.000E+00
    72. 2142 -4.337E-02
    73. 2145 -4.312E-02
    74. 2148 -4.297E-02
    75. 2153 -4.323E-02
    76. 2158 -4.303E-02
    77. 2246 -4.292E-02
    78. 2249 -4.297E-02
    79. 2252 -4.293E-02
    80. 2257 -4.293E-02
    81. 2290 -4.312E-02
    82. 2293 -4.337E-02
    83. 2296 -4.303E-02
    84. 2301 -4.323E-02
    85. Analysis type NONLIN
    86. Step nr. 2
    87. Load factor 2.120E+02
    88. Result FORCE REACTI TRANSL
    89. Axes GLOBAL
    90. Nodnr FBZ
    91. 350 -3.939E+01
    92. 353 -8.514E+01
    93. 356 -8.443E+01
    94. 361 -1.729E+02
    95. 366 -1.700E+02
    96. 454 -8.392E+01
    97. 457 -8.444E+01
    98. 460 -1.678E+02
    99. 465 -1.679E+02
    100. 498 -8.513E+01
    101. 501 -3.939E+01
    102. 504 -1.700E+02
    103. 509 -1.729E+02
    104. Analysis type NONLIN
    105. Step nr. 3
    106. Load factor 3.180E+02
    107. Result DISPLA TOTAL TRANSL
    108. Axes GLOBAL
    109. Nodnr TDtZ
    110. 350 0.000E+00
    111. 353 0.000E+00
    112. 356 0.000E+00
    113. 361 0.000E+00
    114. 366 0.000E+00
    115. 454 0.000E+00
    116. 457 0.000E+00
    117. 460 0.000E+00
    118. 465 0.000E+00
    119. 498 0.000E+00
    120. 501 0.000E+00
    121. 504 0.000E+00
    122. 509 0.000E+00
    123. 2142 -6.506E-02
    124. 2145 -6.468E-02
    125. 2148 -6.446E-02
    126. 2153 -6.485E-02
    127. 2158 -6.455E-02
    128. 2246 -6.438E-02
    129. 2249 -6.446E-02
    130. 2252 -6.440E-02
    131. 2257 -6.440E-02
    132. 2290 -6.468E-02
    133. 2293 -6.505E-02
    134. 2296 -6.455E-02
    135. 2301 -6.484E-02
    136. Analysis type NONLIN
    137. Step nr. 3
    138. Load factor 3.180E+02
    139. Result FORCE REACTI TRANSL
    140. Axes GLOBAL
    141. Nodnr FBZ
    142. 350 -5.909E+01
    143. 353 -1.277E+02
    144. 356 -1.266E+02
    145. 361 -2.593E+02
    146. 366 -2.549E+02
    147. 454 -1.259E+02
    148. 457 -1.267E+02
    149. 460 -2.517E+02
    150. 465 -2.519E+02
    151. 498 -1.277E+02
    152. 501 -5.909E+01
    153. 504 -2.550E+02
    154. 509 -2.593E+02
    155. Analysis type NONLIN
    156. Step nr. 4
    157. Load factor 4.240E+02


    in der zeile 1 soll in spalte A "Stufe" stehen, in spalte B "Kraft" und in C soll "Verschiebung stehen.

    die tb-datei(hier eine txt datei, weil ich andere dateien nicht hochladen kann) würde ich gerne aussuchen können.

    in zeile 2 soll in den spalten 1-3 jeweils eine null geschrieben werden.
    jetzt soll aus der datei zunächst Step eingelesen werden und in die zelle A3 geschrieben werden.
    dann sollen die einzelnen zahlen unter TDtZ eingelesen werden und durch ihre anzahl geteilt werden.hierbei muss aber, wie in step 1 erkennbar, die nodnr 350-509 übersprungen werden, da sie null sind. die anzahl der nodnr kann sich aber ändern, also muss jede zeile eingelesen werden und geprüft werden. nodnr 2142-2301 soll der wert eingelesen werden und wie gesagt durch, in diesem fall 13, geteilt werden und in der spalte "Verschiebung2 geschrieben werden in der zeile von step 1.
    danach soll das gleiche mit der kraft geschehen (die werte unter FBZ)...diese werte sollen auch addiert werden und durch sich selber geteilt werden (mittelwert). dann soll diese zahl in der spalte "Kraft" in zeile 1 geschrieben werden.

    das soll dann so lange wiederholt werden, bis alle lastschritte(steps) abgearbeitet sind...

    im prinzip soll das gleiche geschehen wie in dem oben aufgeführtem programm, doch wie schon gesagt überspringt er die 0.000E+00 zeilen nicht und gibt einen fehler aus.




    vielen dank schonmal für eure hilfe...ihr würdet mir echt stunden von arbeit erleichtern......


    gruß

    hannes
    Dateien
    • durchbiegung.txt

      (111,29 kB, 194 mal heruntergeladen, zuletzt: )
    Ich hab' jetzt keine Lust mich durch deinen Code zu wühlen.
    Aber wenn es dir nur um die Zeilen mit »0.000E+00« geht, kannst eine temporäre Datei ohne die entsprechenden Zeilen erstellen.
    Einfach deinen Codeabschnitt:

    Visual Basic-Quellcode

    1. Dim DLG
    2. DLG = Application.GetOpenFilename("Diana Dateien (*.txt), *.txt")
    3. Open DLG For Input As #1


    durch folgenden ersetzen:

    Visual Basic-Quellcode

    1. DIM DLG AS STRING, t AS STRING
    2. DIM DLGtmp AS STRING
    3. DLG = Application.GetOpenFilename("Diana Dateien (*.txt), *.txt")
    4. DLGtmp ="DLGtmp.txt" '<--- evtl. noch LW:\Pfad\ angeben
    5. OPEN DLG FOR INPUT AS #1
    6. OPEN DLGtmp FOR OUTPUT AS #2
    7. WHILE NOT EOF(1)
    8. LINE INPUT #1, t
    9. IF INSTR(t, "0.000E+00") = 0 THEN
    10. PRINT #2, t
    11. END IF
    12. WEND
    13. CLOSE
    14. OPEN DLGtmp for input as #1 ' Jetzt mit der temporären Datei arbeiten