Werte auslesen und in einem Tabellenblatt einfügen

  • Excel

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

    Werte auslesen und in einem Tabellenblatt einfügen

    Hallo Community,

    ich bin neu hier, bzw. als angemeldetes Mitglied, jedoch hat das Forum bei Problem mir super helfen können...bis jetzt ^^

    ich habe folgendes Problem und benötige unbedingt hilfe...

    Es wird jetzt relativ viel Text kommen also BITTE nicht abschrecken, aber die Erfahrung zeigt, wenn man jemanden etwas erklären möchte....sollte man das auch gründlich machen :)

    #+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#

    Ich würde gerne aus einem bestimmten Tabellenblatt, Werte auslesen, diese Werte in einem anderem Tabellenblatt einfügen und mit den "alten" Werten vergleichen. Wenn eine Änderung gibt, soll diese dann überschrieben werden.

    Quellcode

    1. #25 = CARTESIAN_POINT('',(0.E+000,0.E+000,100.)); //Das ist z.B. eine Zeile dessen Werte ich benötige, es gibt mehrere Zeilen die immer mit #ZAHL beginnen.
    2. #25 = CARTESIAN_POINT('',(X,Y,Z)); //Und die Werte die ich benötige, stehen in der Klammer


    Ich werde die Datei-Hochladen, sodass Ihr eine Vorstellung bekommt wie das aussieht und wo man diese Werte speichert.

    Ich habe mir natürlich auch schon gedanken gemacht, wie das aussehen könnte.

    Quellcode

    1. #7 = PRODUCT('Quader_1','Quader_1','',(#8)); //Name des ersten Bauteils in dem die Werte sind. Notwendig für den benötigen Range je Bauteil

    Die Ersten 3 FIX-Werte ODER ggf. nur den ersten als FIX-Wert ist der Name des Bauteils und notwendig zu wissen wie die Range ist. Also zwischen #7 und #355(Bauteil 2) stehen die Werte vom Bauteil 1

    Quellcode

    1. #25 = CART...
    2. #46 = CART...
    3. #161 = CART...


    die Nächsten 3(1) Wert(e) mit dem folgenden Schema

    Quellcode

    1. #355 = PRODUCT('Quader_2','Quader_2','',(#356)); //Bauteil 2

    Hier genau wie Bauteil 1 stehen die Werte zwischen #355 und #699(Bauteil 3)

    Quellcode

    1. 344+(#25 = CART...) = #369 = CART...
    2. 344+(#46 = CART...) = #390 = CART...
    3. 344+(#161 = CART...)= #505 = CART...


    die Nächsten 3(1) Wert(e) mit dem folgenden Schema

    Quellcode

    1. #699 = PRODUCT('Quader_3','Quader_3','',(#700)); //Bauteil 3

    Quellcode

    1. 344+(#369 = CART...)= #713 = CART...
    2. 344+(#390 = CART...)= #734 = CART...
    3. 344+(#505 = CART...)= #849 = CART...


    usw. mit Bauteil 4,5,6,n

    Wie man erkennt, sind die ersten Werte FIX und dann folgt eine Addition zwischen dem Ergebnis von vorherigem Wert und dem Basiswert von 344 und man erhält dann ein neues Ergebnis, usw,.

    Warum pro Bauteil 3 Werte gesucht werden soll? Soll als Plausibilisierungscheck dienen.
    FALLS das zu umständlich SEIN SOLLTE, dann reicht auch NUR ein Wert pro Bauteil!!!

    #+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#

    Angaben zur Datei: STEP.zip
    Die zu suchenden Werte stehen im Tabellenblatt "FreeCAD_STEP"
    Im Tabellenblatt "Ein_Ausgabe" werden die gesuchten Werte unter 'Positionskoordinaten FreeCAD' eingetragen.
    Der Vergleich bzw. die Aktualisierung der alten Werte erfolgt unter 'Startkoordinaten Quader' im selben Tabellenblatt "Ein_Ausgabe".
    D.h. Positionskoor. und Startkoord. werden verglichen und bei einer Änderung wird dann die Werte unter Startkoord. auf Positionskoor. gesetzt.

    Die Name (Quader_1, Quader_2....) stehen im Tabellenblatt "Ein_Ausgabe" unter 'Baugruppen-Namen'

    Im Modul: Modul_Button_FreeCAD_öffnen soll der Programmteil programmiert werden, da dieses Modul mit dem Button "FreeCAD-STEP Datei öffnen" verknüpft ist.


    Ich hoffe, dass ich mein Problem relativ verständlich beschreiben konnte.

    Bei Frage, was sicherlich auftauchen wird, nur HER DAMIT =)


    Gruß
    CE
    Dateien
    • STEP.zip

      (142,18 kB, 192 mal heruntergeladen, zuletzt: )
    Ich habe die Fragen nicht gefunden.

    HAHAHAHAHAHHAHAHA shit :P ja ok sry

    Wo ist das Problem?

    Das Problem ist, das ich kaum VBA Kenntnisse habe.
    Ich weiß nicht wie man spezifische Zellen ausliest und wenn man die Zelle gefunden hat, dann NUR die Werte in der Klammer entnimmt (Für meinen Fall jetzt) und das dann mit vorhandenen Werten vergleicht und ersetzt.
    Klar bevor ich geschrieben habe, habe ich in Foren gesucht usw., aber man benötigt VBA-Kenntnisse um das, was gefunden wurde, für meinen Fall anzupassen....

    Die Frage beruht eher auf ob jemand mir hier unterstützen kann.
    Deine angehängte Excel-Datei beinhaltet doch schon einiges an Code.
    Wenn du dir nicht klar darüber bist, was da drin passiert, dann nimm den Debugger, setze Breakpoints und gehe Schritt für Schritt durch uns schaue wie sich die Variablen verändern.

    Wenn du trotzdem etwas nicht verstehst, stelle spezifische Fragen.

    Ganz ohne VBA-Kenntnisse oder zumindest dem Willen, dich tief in die Materie einzuarbeiten, wirst du vermutlich nicht glücklich werden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Guten morgen!!

    petaod schrieb:

    Wenn du trotzdem etwas nicht verstehst, stelle spezifische Fragen.



    Visual Basic-Quellcode

    1. Sub Test()
    2. Dim wks As Worksheet
    3. Set wks = Worksheets("FreeCAD_STEP")
    4. Dim Zeile As Long
    5. Const ZeileL As Long = 36
    6. With wks
    7. For Zeile = 1 To ZeileL
    8. If Cells(Zeile, 1).Value = "CARTESIAN_POINT" Then
    9. MsgBox "Gefunden"
    10. Else
    11. MsgBox "Nicht gefunden"
    12. End If
    13. Next Zeile
    14. End With
    15. End Sub


    Bis zur Zeile 36 habe ich die Schleife gesetzt.
    Zeile 35 sollte die MsgBox "Gefunden" auftauchen...tuts leider nicht. Vielleicht fehlt bei mir die Umwandlung von String, da die Werte im Tabellenblatt "FreeCAD_STEP" mit #-Anfangen und vielleicht deswegen NIE reinspringt.

    Ich dachte, dass ich ersteinmal Schritt für Schritt das Programm erstelle. Daher sieht es momentan so klein aus ^^.

    Gruß
    CE

    Common engineer schrieb:

    fehlt bei mir die Umwandlung von String
    Nein, dir fehlt die "ungefähre Abfrage".
    If Cells(Zeile, 1).Value Like "[#]#* = CARTESIAN_POINT(*" Then

    Common engineer schrieb:

    Const ZeileL As Long = 36
    Ist das tatsächlich eine Konstante?
    Oder willst du eigentlich das:

    Visual Basic-Quellcode

    1. Dim ZeileL As Long
    2. ZeileL=Cells(Rows.Count,1).End(xlUp).Row

    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Hi,

    danke es hat funktioniert mit der "ungefähren Abfrage" doch muss ich jetzt wissen....was ist denn der Unterschied?

    petaod schrieb:

    Ist das tatsächlich eine Konstante?

    Nein ist keine, ich wollte NUR bis Zeile 36 die Schleife machen ^^ hätte glaub ich auch als Zahl schreiben können.

    So jetzt kommt die Arbeit :P genau die bestimmte Zeilen auslesen und abspeichern...kann ich das speichern der gesamt Zeile als Variant machen und die bestimmte Zeile auslesen, schwebt mir im Kopf als CASE durchzuführen...würde das gehen?

    Visual Basic-Quellcode

    1. CASE 25:
    2. 'Werte in der Klammer (X/Y/Z) speichern als Variant
    3. CASE 46:
    4. CASE 161:

    Visual Basic-Quellcode

    1. ​Sub Test2()
    2. Dim wks As Worksheet
    3. Dim ZeileP As Long, ZeileCP As Long, ZeileL As Long
    4. Dim gefCP As Variant
    5. Const Fall1 As Long = 37 'Bauteil 1 = PRODUCT('Quader_1','Quader_1'...
    6. Const Fall2 As Long = 37 + 396 'Bauteil 2 = PRODUCT('Quader_2','Quader_2'...
    7. Const Fall3 As Long = Fall2 + 396 'Bauteil 3 = PRODUCT('Quader_3','Quader_3'...
    8. Set wks = Worksheets("FreeCAD_STEP")
    9. ZeileL = Cells(Rows.Count, 1).End(xlUp).Row
    10. With wks
    11. For ZeileP = 1 To ZeileL
    12. For ZeileCP = 1 To ZeileL
    13. If Cells(ZeileP, 1).Value Like "[#]#* = PRODUCT(*" Then
    14. If Cells(ZeileCP, 1).Value Like "[#]#* = CARTESIAN_POINT(*" Then
    15. gefCP = Cells(ZeileCP, 1).Value
    16. Else
    17. End If
    18. End If
    19. Select Case ZeileCP
    20. Case Fall1
    21. MsgBox gefCP
    22. Case Fall2
    23. MsgBox gefCP
    24. Case Fall3
    25. MsgBox gefCP
    26. End Select
    27. Next ZeileCP
    28. Next ZeileP
    29. End With
    30. End Sub


    Wenn du das Programm starten solltest, dann taucht immer MessageBoxen auf und leider auch nicht die Werte, die ich als Fall abgespeichert habe :/

    Fall2 und Fall3 sind Testzwecke ABER Fall1 sollte so sein :)

    Common engineer schrieb:

    was ist denn der Unterschied?
    = erfordert dass die beide Vergleichskompenten exakt gleich sind.
    Bei LIKE kannst du Wildcards verwenden.

    Common engineer schrieb:

    kann ich das speichern der gesamt Zeile als Variant machen
    Ich verstehe dich nicht.
    Jede Zelle an sich ist zunächst Variant.
    Wenn da, wie in deinem Beispiel, ein String drin steht, wird die Variant zum String.

    Wo willst du das Zeug speichern?
    In einer Variablen?
    Nimm erst eine String-Variable und Wandle das dann in ein Double um.
    In dem Fall würde ich aber die Basisprüfung der Zelle genauer gestalten.
    Schau dir mal an, was im Array a drin steht

    Visual Basic-Quellcode

    1. c = Cells(Zeile, 1).Value
    2. If c Like "[#]#? = CARTESIAN_POINT(*(*));" Then
    3. a = Split(Split(Split(c, "(")(2), ")")(0), ",")
    4. End If
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ohne jetzt alles durchgelesen zu haben: Du versuchst, eine Step-Datei zu erstellen/manipulieren, sehe ich das richtig? Ich habe mal selbst in die Richtung gesucht. Ich glaube, es müsste irgendwoe im Web fertige Dll's dazu geben...

    EDIT: Oh, ja. Du hast ja auch die Datei so benannt. Dann schau' ich mir das mal bei Gelegenheit mal näher an. ^^

    Higlav schrieb:

    Ohne jetzt alles durchgelesen zu haben: Du versuchst, eine Step-Datei zu erstellen/manipulieren, sehe ich das richtig? I


    HI =)
    eine STEP-Datei erstellen via Excel das geht soweit, wusste gar nicht das es fertige dll's dazu gibt... X/

    meine Aufgabe jetzt sind Werte zu vergleichen aus einem anderem STEP-System (z.B. FreeCAD).
    Diesen STEP im Excel hochzuladen CP-Werte auslesen und die X-Y-Z-Werte in einem Tabellenblatt einfügen.

    DANKE DIR FÜR DEINE ZEIT, wenn du dir die Datei anschaust :)!!

    @petaod

    Visual Basic-Quellcode

    1. ​Sub Test3()
    2. Dim wks As Worksheet
    3. Dim ZeileP As Long, ZeileCP As Long, ZeileL As Long
    4. Dim gefCP As Variant
    5. 'Dim a As String
    6. Dim test As Double
    7. Const Fall1 As Long = 37 'Bauteil 1 = PRODUCT('Quader_1','Quader_1'...
    8. Const Fall2 As Long = 37 + 396 'Bauteil 2 = PRODUCT('Quader_2','Quader_2'...
    9. Const Fall3 As Long = Fall2 + 396 'Bauteil 3 = PRODUCT('Quader_3','Quader_3'...
    10. Set wks = Worksheets("FreeCAD_STEP")
    11. ZeileL = Cells(Rows.Count, 1).End(xlUp).Row
    12. With wks
    13. 'For ZeileP = 1 To ZeileL
    14. For ZeileCP = 1 To ZeileL
    15. 'If Cells(ZeileP, 1).Value Like "[#]#* = PRODUCT(*" Then
    16. gefCP = Cells(ZeileCP, 1).Value
    17. If gefCP Like "[#]#? = CARTESIAN_POINT(*(*));" Then
    18. a = Split(Split(Split(gefCP, "(")(2), ")")(0), ",")
    19. test = CDbl(a.Text.Replace(" ", " ", " "))
    20. End If
    21. 'End If
    22. Select Case gefCP
    23. Case Fall1
    24. MsgBox test
    25. ...


    Als Fehlermeldung kommt: Objekt erforderlich....
    ABER GENAU so ne Split-Funktion ist perfekt! Sodass ich die Werte in der Klammer nutzen kann! :)

    Gruß
    CE
    Jup. In der Zwischenzeit kannst du dir mal mein Versuch von damals zu Gemüte führen. Siehe Anahng. ;)
    Dateien
    • MyStep.rar

      (40,65 kB, 114 mal heruntergeladen, zuletzt: )
    hahahha classic :) sauber, so gehts auch =)
    bei meiner Excel was du sicherlich merken wirst, kannst du mehrere Quaders erzeugen.

    Was ich nicht so ganz verstehe ist,

    Visual Basic-Quellcode

    1. ​Sub CreateFile(Pfad As String) 'Code von Internet geladen
    2. Dim i As Long
    3. Dim fso As New FileSystemObject
    4. Dim Ts As TextStream
    5. Set Ts = fso.CreateTextFile(Pfad, True)
    6. For i = 1 To Tabelle2.UsedRange.Rows.Count
    7. Ts.WriteLine (Tabelle2.Cells(i, 1))
    8. Next
    9. Ts.Close
    10. End Sub

    Ist das der ganze Code aus dem Internet, welche man eine STEP-Datei erstellen kann?
    Oh. Ist das mein Code von damals? =O
    Also eine Step-Datei ist nichts anderes als im Klartext abgespeicherte Anweisungsliste, deren Datei die Endung .stp hat. Feddich. Ich war damals leider erfolglos bei der Suche nach Hilfs-DLL's, also ist der Code nur für das Erstellen einer Textdatei, die die Anweisungsliste enthält.
    Musst du das Ganze unbedingt mit VBA machen, oder ist es dir auch möglich, dir z.B. VB-Express 2013 zu installieren? Denn mit einer gescheiten IDE und VB.NET kannst du so viel mehr machen. Und dort können dir auch mehr helfen. Am Schluss hättest du eine Excel-Mappe, die mit einer DLL gekoppelt ist. Beim Bedienen ändert sich nichts für den User, aber du hast so viel mehr Möglichkeiten.

    Higlav schrieb:

    Oh. Ist das mein Code von damals?

    Das was ich hier upgeloadet habe? unter dem Modul: Modul_STEP_Liste?
    Ich habe das auch mit Forenhilfen zusammengestellt. Kann sein, dass es deiner ist....musstest du auch meherere Quaders erzeugen?

    Higlav schrieb:

    Musst du das Ganze unbedingt mit VBA machen

    Leider ja...die Erstellung einer STEP geht ja soweit mit VBA. Nur wenn ich eine anderes STEP-Hochlade aus einem anderem System(Für die Aufgabe reicht es NUR aus FreeCAD) muss ich die CPs auslesen um die Positionsunterschiede, die man im FreeCAD gemacht hat, feststellen.
    Ich weiß auch welche Zeilen genau betroffen sind im FreeCAD-STEP und die weiterführenden ebenso....nur programmtechnisch, wie du merkst, hänge ich gerade.

    EDIT: :P ACHSOOOOO du hast mein Beitrag gemeint mit deinem Code....langsam verliere ich den Überblick ^^
    Ja, da sind wir schon zu Zweit. :D Darf ich noch kurz genau nachfragen, was du tun willst?

    -Exceldatei ist geöffnet
    -Es wird ein Pfad zu einer STEP-Datei ausgewählt.
    -Die Stepdatei wird nun nach den CartesainPoints durchsucht
    -Die gefundenen Punkte werden mit den gespeicherten Punkten verglichen und bei Unstimmigkeiten auf die gespeicherten Punkte übertragen(eigentlich könntest du auch direkt überschrieben, da die Abfrage ja redundant wäre)
    -...Dann was?
    Das wars ^^

    Natürlich hat es einen größeren Sinn dahinter.
    Bei veränderter Position, kann dann via Datenbank ein anderen Quader verwendet werden. Was aber jetzt nicht wichtig ist. Dient nur als DEMO-Zweck.

    Higlav schrieb:

    (eigentlich könntest du auch direkt überschrieben, da die Abfrage ja redundant wäre)

    ja vollkommen richtig, ist auch mein Gedanke, dass per VBA die Suche und das Auslesen und die gefundenen Werte gemacht wird, dann unter Tabellenblatt: Ein_Ausgabe unter 'Positionskoordinaten FreeCAD' die gefundenen x-y-z-Werte einfügt, jedoch der Vergleich Direkt gemacht werden kann.

    Unter 'Delta(Start-Ursprung)' müsste der Vergleich gemacht werden.

    Visual Basic-Quellcode

    1. =[@[Delta-X_FreeCAD]]-[@[x-start]] 'zum Beispiel


    Gruß
    CE

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

    Visual Basic-Quellcode

    1. Sub Test3()
    2. Dim wks As Worksheet
    3. Dim ZeileP As Long, ZeileCP As Long, ZeileL As Long
    4. Dim gefCP As Variant
    5. Dim x As Variant, y As Variant, z As Variant
    6. Dim testX As Double
    7. Const Fall1 As Long = 37 'Bauteil 1 = PRODUCT('Quader_1','Quader_1'...
    8. Const Fall2 As Long = Fall1 + 396 'Bauteil 2 = PRODUCT('Quader_2','Quader_2'...
    9. Const Fall3 As Long = Fall2 + 396 'Bauteil 3 = PRODUCT('Quader_3','Quader_3'...
    10. Set wks = Worksheets("FreeCAD_STEP")
    11. ZeileL = Cells(Rows.Count, 1).End(xlUp).Row
    12. With wks
    13. For ZeileP = 1 To ZeileL
    14. For ZeileCP = 1 To ZeileL
    15. If Cells(ZeileP, 1).Value Like "[#]#* = PRODUCT(*" Then
    16. If Cells(ZeileCP, 1).Value Like "[#]#? = CARTESIAN_POINT(*(*));" Then
    17. gefCP = Cells(ZeileCP, 1).Value
    18. '#25 = CARTESIAN_POINT('',(0.E+000,0.E+000,100.)); Die Werte in der Klammer versuche ich über die Split-Funktion zu erhalten. Jeweils einzeln x,y,z; Bei der verschachtelte Split-Fkt von @petaod, was eleganter ist aber ich komme damit noch weniger klar :)
    19. 'x = Split(gefCP,.... DAS ist der Grund, ich weiß nicht was ich in der Klammer schreiben soll bzw. wie(Syntax).
    20. 'testX = CDbl(x.Text.Replace(" ", " ", " ")) Den String Wert als Double umwandeln....wenn die Syntax so überhaupt richtig ist
    21. End If
    22. End If
    23. Select Case ZeileCP
    24. Case Fall1
    25. MsgBox testX
    26. Case n ' eine Schleife für die anderen mit der Basis +396 Werte. War so meine Idee hier
    27. MsgBox n
    28. End Select
    29. Next ZeileCP
    30. Next ZeileP
    31. End With
    32. End Sub


    ich glaube die Kommentare beschreiben mein momentanes Problem :)