Werte auslesen und in einem Tabellenblatt einfügen

  • Excel

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von Common engineer.

    Common engineer schrieb:

    Bei der verschachtelte Split-Fkt von @petaod, was eleganter ist aber ich komme damit noch weniger klar
    Ich dachte, du könntest das Array selbst auflösen.
    Ich hab's noch etwas verfeinert:

    Visual Basic-Quellcode

    1. If gefCP Like "[#]#* = CARTESIAN_POINT(*(*,*,*));" Then
    2. v = Split(Split(Split(gefCP, "(")(2), ")")(0), ",")
    3. x = CDbl(v(0))
    4. y = CDbl(v(1))
    5. Z = CDbl(v(2))
    6. End If
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:

    Ich dachte, du könntest das Array selbst auflösen.

    OH MANN....die Anwort ist manchmal doch näher als es den Anscheind macht....sry...danke dir für die Hilfestellung :)

    Ich bekomme da ne blöde Fehlermehldung: INDEX AUSßERHALB DES GÜTLIGEN BEREICHS

    Ich weiß auch warum, weil es CP-Werte gibt die NUR x/y - Koordinaten haben....kann man das irgendwie abfangen? ich meine damit, dass es NUR nach 3 und nicht nach 2 Koordinaten sucht und diese ausgibt?

    Leider bei 10.5 gibt er 105 aus....wie kann ich den Punkt erzeugen?

    Gruß
    CE

    EDIT
    Fehlermeldung habe ich beseidigt

    Visual Basic-Quellcode

    1. If Cells(ZeileCP, 1).Value Like "[#]#? = CARTESIAN_POINT(*(*,*,*));" Then


    Aber das mit dem Komma....also 10.5 auch als 10.5 und nicht als 105 ausgibt....steht noch aus

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

    Common engineer schrieb:

    weil es CP-Werte gibt die NUR x/y - Koordinaten haben
    Werden die dann als leere Einträge angegeben? Und der fehlende soll als 0 interpretiert werden?
    (100,50,)


    Common engineer schrieb:

    wie kann ich den Punkt erzeugen?

    Ist dein Excel regionalisiert auf Deutsch :D

    Das sollte die beiden Probleme beheben.

    Visual Basic-Quellcode

    1. X = CDbl(Val(Replace(v(0), ".", Application.DecimalSeparator)))
    2. Y = CDbl(Val(Replace(v(1), ".", Application.DecimalSeparator)))
    3. Z = CDbl(Val(Replace(v(2), ".", Application.DecimalSeparator)))


    Falls auch echte zweielementige Einträge wie (20,40) vorkommen, musst du etwas modifizieren:

    Visual Basic-Quellcode

    1. ​If gefCP Like "[#]#* = CARTESIAN_POINT(*(*));" Then
    2. v = Split(Split(Split(gefCP, "(")(2), ")")(0), ",")
    3. X = CDbl(Replace(v(0), ".", Application.DecimalSeparator))
    4. If UBound(v) > 0 Then Y = CDbl(Replace(v(1), ".", Application.DecimalSeparator)) Else Y = 0
    5. If UBound(v) > 1 Then Z = CDbl(Replace(v(2), ".", Application.DecimalSeparator)) Else Z = 0
    6. End If
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    petaod schrieb:

    Werden die dann als leere Einträge angegeben? Und der fehlende soll als 0 interpretiert werden?

    bzgl. das ich meine er muss diese Überhaupt nicht überprüfen. es reicht wenn ich das so mache wie in der if-Anweisung if....(*,*,*)

    petaod schrieb:

    Ist dein Excel regionalisiert auf Deutsch

    jup :D


    Visual Basic-Quellcode

    1. ....
    2. a = Split(Split(Split(gefCP, "(")(2), ")")(0), ",")
    3. x = CDbl(Val(Replace(a(0), ".", Application.DecimalSeparator)))
    4. y = CDbl(Val(Replace(a(1), ".", Application.DecimalSeparator)))
    5. z = CDbl(Val(Replace(a(2), ".", Application.DecimalSeparator)))
    6. Select Case ZeileCP
    7. Case Fall1
    8. MsgBox x
    9. MsgBox y
    10. MsgBox z
    11. ....


    so gebe ich es momentan aus und wenn ich den Code von dir einfüge, dann gibt er mir jetzt nur 10 anstatt 10.5 oder 105 aus.


    Edit:
    Die zweielementige Einträge tauchen zwar auf, werden aber nicht benötigt, da wir nur Quader abgebildet haben wollen.
    Diese Elemente haben andere Bedeutung für die STEP-Datei. Diese müssen nicht immer direkt dem Aufbau eines Quaders widerspiegeln :) ABER DANKE DIR!!!
    Jap, beachte ich garnicht :)

    also wenn ich es debugger steht unter
    a(0) = 10.5
    a(1) = 20.2
    a(3) = 30.1
    und
    Application.DecimalSeparator = ","
    Application.DecimalSeparator = ","
    Application.DecimalSeparator = ","

    JEDOCH
    x = 10
    y = 20
    z = 30
    x,y,z als Double...ich kenne unter C++ float, für Kommawerte...könnte das, das Problem sein?
    float wäre in VBA Single
    double gibt's in C++ auch.

    Hast du X,Y,Z als Integer oder Long deklariert?
    Das würde die Ganzzahl erklären.

    Schau dir mal im Debugger die Datentypen an.

    Gib mal im Direktfenster (Debugger-Ausgabefenster)
    ?Replace(a(0), ".", Application.DecimalSeparator)
    ein
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich habe es auf Single gesetzt, hat sich jedoch nicht verbessert...

    und was ganz komisch ist, ist das der x-Wert beim ersten Durchlauf 10.5 unter a(0) gespeichert hat aber beim nächsten 0.E+000 und das wird auch angezeigt bzw. in der Spalt rein geschrieben....JEDOCH a(1) und a(2) also y und z zeigen die Werte richtig an.

    petaod schrieb:

    Gib mal im Direktfenster (Debugger-Ausgabefenster)
    ?Replace(a(0), ".", Application.DecimalSeparator)
    ein

    ich habe es reinkopiert aber es hat nichts angezeigt....

    soll ich mal den Code Hochladen?

    Gruß
    CE

    EDIT:
    NENE also das mit
    ​10.5 unter a(0) gespeichert hat aber beim nächsten 0.E+000
    passt schon....die Zellenformatierung war auf wissenschaftlich gestellt...k.A. warum. Aber das mit dem Komma ist immer noch nicht behoben....verstehe echt nicht warum.

    CDbl = steht Dbl für Double? Gibt es dafür auch in Single(float)?

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

    Es gibt auch ein CSng für Single.
    Aber davon verspreche ich mir wenig.

    Du kannst den Code mal hochladen, aber ich kann frühestens am Wochenende einen Rechner mit deutschen Office hochfahren.
    Und meine Arbeitsumgebung stelle ich ungern testweise um. Da ist mir die Gefahr von Dreckeffekten zu hoch.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Vollkommen normal! Würde ich anders auch nicht machen :)

    Ich versuche gerade noch das mit der automatisierte Suche nach dem anderen CP. Dafür ist ja das Komma nicht zwingend notwendig.

    Werde dann hochstellen wenn, ich das gelöst bekommen habe oder...vielleicht auch damit nicht weiter komme :(

    Danke habe für dein Angebot!!!!!

    Gruß
    CE

    Visual Basic-Quellcode

    1. werteCP = 37
    2. With wks
    3. For ZeileCP = 1 To ZeileL
    4. If .Cells(ZeileCP, 1).Value Like "[#]#? = CARTESIAN_POINT(*(*,*,*));" Then
    5. gefCP = .Cells(ZeileCP, 1).Value
    6. '#25 = CARTESIAN_POINT('',(x.,y.,z.));CSng CDbl
    7. a = Split(Split(Split(gefCP, "(")(2), ")")(0), ",")
    8. x = CDbl(Val(Replace(a(0), ".", Application.DecimalSeparator)))
    9. y = CDbl(Val(Replace(a(1), ".", Application.DecimalSeparator)))
    10. z = CDbl(Val(Replace(a(2), ".", Application.DecimalSeparator)))
    11. Select Case ZeileCP
    12. Case werteCP
    13. ' Zahl 11 gibt die Zeile an. Zahl 15,16,17 die jeweiligen Spalten
    14. wks1.Cells(11, 15).Value = x
    15. wks1.Cells(11, 16).Value = y
    16. wks1.Cells(11, 17).Value = z
    17. werteCP = werteCP + 396
    18. End Select
    19. End If
    20. Next ZeileCP
    21. End With


    Den Wert in der Zeile 37 übernimmt er und schreibt es dann unter wks1.Cells(11, 15).Value = ... rein. Perfekt.

    ABER wenn ich jetzt den nächsten Wert für den nächsten Quader suchen möchte, welches ist
    werteCP = werteCP + 396, also 433....er springt NIE ins select case rein. Warum?

    normalerweise sollte dann auch die Werte in der Zeile 433 auch unter
    wks1.Cells(12, 15).Value = x
    wks1.Cells(12, 16).Value = y
    wks1.Cells(12, 17).Value = z
    aber das ist jetzt erstmal irrelevant.

    EDIT: FATAL mit Excel-Zeilen zu arbeiten!!! Da ein #-Wert kann 2 oder mehere Excel-Zeilen haben.....
    D.h.

    Visual Basic-Quellcode

    1. werteCP = 25
    2. ...
    3. werteCP = werteCP + 344
    4. '344 heißt keine 344 ZEILEN später, sondern eigentlich
    5. '#25+#344=#369 //Quader_2
    6. '#369+#344=#713 //Quader_3 usw


    kann man das irgenwie auch noch hinzufügen oder besser mitbeachten?

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

    Das eine ist, die "#nnn" in Zahlen umzurechnen, das kann eine einfache Funktion erledigen.
    Das andere ist, die STEP-Lines in Excel-Lines umzurechnen.
    Dazu würde ich eine Property schreiben, die mir die Excel-Row einer gegebenen Step-Row zurückgibt.
    Sowas z.B.

    Visual Basic-Quellcode

    1. ​Private ExcelRows As New Collection
    2. Private Property Get ExcelRow(ByVal StepRow As Long) As Long
    3. Dim r As Long, c As String
    4. If ExcelRows.Count = 0 Then
    5. For r = 1 To Cells(Rows.Count, 1).End(xlUp).Row
    6. c = Cells(r, 1).Value
    7. If c Like "[#]#*" Then
    8. ExcelRows.Add r, CStr(Val(Mid(c, 2, 10)))
    9. End If
    10. Next
    11. End If
    12. On Error GoTo Done ' return 0 if not found
    13. ExcelRow = ExcelRows(CStr(StepRow))
    14. Done:
    15. End Property
    16. Sub Test()
    17. Debug.Print ExcelRow(369)
    18. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    HI SORRY das ich mich nicht mehr gemeldet habe!!

    Ich habe hier nun einen Code, dass zum Glück auch funz
    Ich wollte diesen Code Online stellen, sodass andere Benutzer, die vielleicht dasselbe Problem haben wie ich, ein mögliche Lösung haben.

    Visual Basic-Quellcode

    1. ' Sucht nach cProductSearch und ab dieser Fundstelle nach cCartesianSearch.
    2. ' Wandelt deren Koordinaten in Zahlen um und schreibt sie ins Zielblatt.
    3. ' Sucht den nächsten cProductSearch und wiederholt solange bis nichts mehr gefunden.
    4. Sub Auslesen_FreeCAD()
    5. Const cProductSearch As String = "*PRODUCT('*" ' Suchstring Produkt
    6. Const cCartesianSearch As String = "#? = CARTESIAN_POINT*" ' Suchstring (erster) Cartesian Point
    7. Const ciDStart As Integer = 86 ' Startsuche #86
    8. Const ciDOffset As Integer = 344 ' Add for each product
    9. Dim wsS As Worksheet, wsT As Worksheet ' Source und Target Worksheet
    10. Dim lRowS As Long, lRowSLast As Long, lRowT As Long ' Zeilenindex
    11. Dim iD As Integer ' SearchID
    12. Dim vTmp ' Temporärer Split Array
    13. Set wsS = ThisWorkbook.Worksheets("FreeCAD_STEP") ' Quelltabelle
    14. lRowS = 11 ' Ab dieser Zeile wird gesucht
    15. iD = ciDStart
    16. Set wsT = ThisWorkbook.Worksheets("Ein_Ausgabe") ' Zieltabelle
    17. lRowT = 11 ' Ab dieser Zeile wird geschrieben
    18. With wsS
    19. lRowSLast = .Cells(.Rows.Count, 1).End(xlUp).Row ' letzte beschriebene Zeile in der Quelle
    20. On Error Resume Next
    21. Do
    22. ' suche nach Product
    23. lRowS = lRowS + Application.WorksheetFunction.Match(cProductSearch, _
    24. .Range(.Cells(lRowS, 1), .Cells(lRowSLast, 1)), 0) - 1
    25. If Err.Number <> 0 Then Exit Do ' Abbruch: nichts mehr gefunden
    26. wsT.Cells(lRowT, 1) = Split(.Cells(lRowS, 1).Text, "'")(1) ' Product in Zieltabelle
    27. ' suche nach erstem CartesianPoint
    28. lRowS = lRowS + Application.WorksheetFunction.Match(Replace(cCartesianSearch, "?", iD), _
    29. .Range(.Cells(lRowS, 1), .Cells(lRowSLast, 1)), 0) - 1
    30. If Err.Number <> 0 Then Exit Do ' Abbruch: nichts mehr gefunden
    31. vTmp = Split(.Cells(lRowS, 1).Text, ",") ' Aufsplitten Text
    32. wsT.Cells(lRowT, 15) = Val(Replace(vTmp(1), "(", "")) ' X-Koordinate
    33. wsT.Cells(lRowT, 16) = Val(vTmp(2)) ' Y-Koordinate
    34. ' ...und falls vorhanden, Z-Koordinate
    35. If UBound(vTmp) > 2 Then wsT.Cells(lRowT, 17) = Val(Replace(vTmp(3), "));", ""))
    36. ' Erhöhung der Zeilenindex und der ID für den nächsten Suchvorgang
    37. lRowT = lRowT + 1
    38. lRowS = lRowS + 1
    39. iD = iD + ciDOffset
    40. Loop
    41. On Error GoTo 0
    42. End With
    43. End Sub