Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1360to1364
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Auslesen und in einem neuen Sheet einfügen

Auslesen und in einem neuen Sheet einfügen
12.05.2014 13:36:56
Common
Hallo Community,
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 Tabelleblatt einfügen und mit den "alten" Werten vergleichen und bei einer Änderung mit dem neuen Wert diese Änderung aktualisieren.
#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.
#25 = CARTESIAN_POINT('',(X,Y,Z)); 'Und die Werte die ich brauche, 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.
#7 = PRODUCT('Quader_1','Quader_1','',(#8)); 'Name des ersten Bauteils in dem die Werte sind.
Die Ersten 3 FIX-Werte ODER ggf. nur den ersten als FIX-Wert Name des Bauteils ist notwendig um zu wissen wie die Range ist. Also zwischen #7 und #355(Bauteil 2) stehen die Werte vom Bauteil 1
#25 = CART...
#46 = CART...
#161 = CART...
die Nächsten 3(1) Wert(e) mit dem folgenden Schema
#355 = PRODUCT('Quader_2','Quader_2','',(#356)); 'Bauteil 2
Hier genau wie Bauteil 1 stehen die Werte zwischen #355 und #699(Bauteil 3)
344+(#25 = CART...) = #369 = CART...
344+(#46 = CART...) = #390 = CART...
344+(#161 = CART...)= #505 = CART...
#699 = PRODUCT('Quader_3','Quader_3','',(#700)); 'Bauteil 3
344+(#369 = CART...)= #713 = CART...
344+(#390 = CART...)= #734 = CART...
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.
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: https://www.herber.de/bbs/user/90637.zip
Die zu suchenden Werte stehen im Tabellenblatt "FreeCAD_STEP"
Im Tabellenblatt "Ein_Ausgabe" werden die gesuchten Werte unter 'Positionskoordinaten FreeCAD' eingetragen.
JEDOCH der Vergleich bzw. die aktualisierung der alten Werte erfolgt unter 'Startkoordinaten Quader'.
D.h. Positionskoor. und Startkoord. werden verglichen und bei einer Änderung wird dann die Werte unter Startkoord. auf Positionskoor. gesetzt.
Im Modul: Modul_Button_FreeCAD_öffnen soll der Programmteil programmiert werden, da dieses Modul mit dem Button "FreeCAD-STEP Datei öffnen" verknüpft ist.
Gruß
CE

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Auslesen und in einem neuen Sheet einfügen
13.05.2014 09:00:17
Common
Guten Morgen! :)
Ich habe mal versucht ne Test-Schleife zu schreiben um zu überprüfen OB ich überhaupt die CARTESIAN_POINTS im Sheet "FreeCAD_STEP" finden kann.
Sub Test()
Dim wks As Worksheet
Set wks = Worksheets("FreeCAD_STEP")
Dim Zeile As Long
Const Zeile1 As Long = 36
With wks
For Zeile = 1 To Zeile1
If Cells(Zeile, 1).Value = "CARTESIAN_POINT" Then
MsgBox "Gefunden"
Else
MsgBox "Nicht gefunden"
End If
Next Zeile
End With
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

Anzeige
AW: Auslesen und in einem neuen Sheet einfügen
14.05.2014 11:35:41
Common
Ich stecke extem fest gerade...bzgl der Split-Funktion.
Das Problem ist, die Split-Funktion dürfte die Lösung meines Teilproblems sein, jedoch weiß ich leider nicht wie man diese richtig anwendet...und weiterhin, er durchläuft leider nur die Innere-Schleife also nur PRODUCT('Quader_1','Quader_1'), geht nie auf die äußere wieder um feststellen zu können PRODUCT('Quader_2','Quader_2') für die anderen CARTESIAN_POINTS-Werte Fall2 und Fall3.
Die MsgBox sollen nur dazu dienen ob ich die einzelnen x,y,z Werte auch richtig auslese...leider funktioniert es so nicht.
Um Unterstützung wäre ich sehr dankbar! :)
Sub Test3()
Dim wks As Worksheet
Dim ZeileP As Long, ZeileCP As Long, ZeileL As Long
Dim gefCP As String
Dim x() As String
Dim z() As String
Dim y() As String
Const Fall1 As Long = 37 'Bauteil 1 = PRODUCT('Quader_1','Quader_1'...
Const Fall2 As Long = Fall1 + 396 'Bauteil 2 = PRODUCT('Quader_2','Quader_2'...
Const Fall3 As Long = Fall2 + 396 'Bauteil 3 = PRODUCT('Quader_3','Quader_3'...
Set wks = Worksheets("FreeCAD_STEP")
ZeileL = Cells(Rows.Count, 1).End(xlUp).Row
With wks
For ZeileP = 1 To ZeileL
If Cells(ZeileP, 1).Value Like "[#]#* = PRODUCT(*" Then
For ZeileCP = 1 To ZeileL
'If Cells(ZeileP, 1).Value Like "[#]#* = PRODUCT(*" Then
If Cells(ZeileCP, 1).Value Like "[#]#? = CARTESIAN_POINT(*(*));" Then
gefCP = Cells(ZeileCP, 1).Value
'#25 = CARTESIAN_POINT('',(x.,y.,z.));
x = Split(gefCP)
y = Split(Split(gefCP, "(")(2), ",")
z = Split(Split(Split(gefCP, "(")(2), ")")(0), ",")
Select Case ZeileCP
Case Fall1
MsgBox x(UBound(x))
MsgBox y(UBound(y))
MsgBox z(UBound(z))
Case Fall2
MsgBox x(UBound(x))
MsgBox y(UBound(y))
MsgBox z(UBound(z))
Case Fall3
MsgBox x(UBound(x))
MsgBox y(UBound(y))
MsgBox z(UBound(z))
End Select
End If
Next ZeileCP
End If
Next ZeileP
End With
End Sub

Anzeige
Stelle doch mal eine Beispielmappe...
14.05.2014 12:47:55
EtoPHG
zur Verfügung CE,
Das würde eine Hilfestellung wesentlich vereinfachen. Aus deinem Text kann ich z.B. nicht genug genau ableiten, was in in einer Zelle stehen kann und in was es aufgelöst werden soll. Also sollte die Beispielmappe ein paar Beispiele (mögl. alle Varianten) von Rohdaten enthalten und ggf. auf einem 2ten Blatt den erwarteten Output(Zieldaten) der Quelldaten.
Gruess Hansueli

AW: Stelle doch mal eine Beispielmappe...
14.05.2014 13:20:18
Common
https://www.herber.de/bbs/user/90674.zip
Zitat Hansueli:
Das würde eine Hilfestellung wesentlich vereinfachen. Aus deinem Text kann ich z.B. nicht genug genau ableiten, was in in einer Zelle stehen kann und in was es aufgelöst werden soll. Also sollte die Beispielmappe ein paar Beispiele (mögl. alle Varianten) von Rohdaten enthalten und ggf. auf einem 2ten Blatt den erwarteten Output(Zieldaten) der Quelldaten.

DANKE für deine Antwort!!!
Die Zip-Datei enthält nun eine Arbeismappe und zwei Step-Dateien. Die Arbeitmappe ist die Aktuellsteversion. Die die ich am Anfang gepostet habe, kann man vernachlässigen :)
Rohrdaten: Tabellenblatt: FreeCAD_STEP
Zieldaten: Tabellenblatt: Ein_Ausgabe
Sub Test3() habe ich in Sub Test() umbenannt
findest du unter Modul:Modul_Button_FreeCAD_öffnen
Bei weiteren Fragen stehe ich natürlich zur Verfügung :)
MFG
CE

Anzeige
AW: Stelle doch mal eine Beispielmappe...
14.05.2014 16:08:23
EtoPHG
Hallo CE,
Ich hab dir mal eine ->Beispielmappe mit einer einfachen UDF (findCartesianPoint(Bezug;Dimension)) gebastelt. Du siehst im Blatt wie
a) mit einer einfachen ZÄHLENWENN-Formel die Produkt Nummer (Quader) bestimmt wird und
b) Die x,y (ggf. z) Koordinaten aus den Einträgen per UDF extrahiert werden.
Vielleicht hilft dir das weiter, oder auf die Sprünge (bei der Anwendung von Split) ;-)
Gruess Hansueli

Hat geholfe auf die Sprünge zu kommen :-)
14.05.2014 20:07:35
Common
Hallo Hansueli,
YEAH danke dir es hat mir auf die Sprünge geholfen bzgl. der Split-Fkt. ^^
ABER ich stecke fest und hoffe du kannst mir hier auch weiterhelfen....
Die Funktion funktioniert soweit so gut ABER bei der Ausgabe will es nicht so richtig :(
Fall2 und 3 kann man zunächst vernachlässigen.
die gesuchten Werte haben im FreeCAD-STEP #25 = CARTESIAN_POINT('',(10.5,20.2,30.1));
Beim Übergeben der Werte in der Spalte ist x=10, y=20 und z=30
Es fehlen die Kommawerte...
Und mal so ne allgemeine Frage: wie du in meiner Excel-Datei gemerkt hast, ist der Button wo ich
1. FreeCAD-STEP Datei Öffne und
2. Test() während dessen aufrufen will
im Tabellenblatt: Ein_Ausgabe
ABER ich habe gemerkt, dass das Tabellenblatt: FreeCAD_STEP Aktiv sein muss um Test() aufrufen zu können...kann man das irgendwie umgehen.
Code bzgl des Kommas
Sub Test()
Dim wks As Worksheet, wks1 As Worksheet
Dim ZeileP As Long, ZeileCP As Long, ZeileL As Long
Dim gefCP As String
Dim a As Variant
Dim x As Single, y As Single, z As Single
Const Fall1 As Long = 37 'Bauteil 1 = PRODUCT('Quader_1','Quader_1'...
Const Fall2 As Long = Fall1 + 396 'Bauteil 2 = PRODUCT('Quader_2','Quader_2'...
Const Fall3 As Long = Fall2 + 396 'Bauteil 3 = PRODUCT('Quader_3','Quader_3'...
Set wks = Worksheets("FreeCAD_STEP")
Set wks1 = Worksheets("Ein_Ausgabe")
ZeileL = Cells(Rows.Count, 1).End(xlUp).Row
With wks
For ZeileP = 1 To ZeileL
For ZeileCP = 1 To ZeileL
If Cells(ZeileP, 1).Value Like "[#]#* = PRODUCT(*" Then
If Cells(ZeileCP, 1).Value Like "[#]#? = CARTESIAN_POINT(*(*,*,*));" Then
gefCP = Cells(ZeileCP, 1).Value
'#25 = CARTESIAN_POINT('',(x.,y.,z.));
a = Split(Split(Split(gefCP, "(")(2), ")")(0), ",")
x = CDbl(Val(Replace(a(0), ".", Application.DecimalSeparator)))
y = CDbl(Val(Replace(a(1), ".", Application.DecimalSeparator)))
z = CDbl(Val(Replace(a(2), ".", Application.DecimalSeparator)))
Select Case ZeileCP
Case Fall1
wks1.Cells(11, 15).Value = x
wks1.Cells(11, 16).Value = y
wks1.Cells(11, 17).Value = z
'Case Fall2
'MsgBox x
'MsgBox y
'MsgBox z
'Case Fall3
'MsgBox x
'MsgBox y
'MsgBox z
End Select
End If
End If
Next ZeileCP
Next ZeileP
End With
End Sub

Anzeige
Deine Anpassungen sind falsch,
15.05.2014 08:49:41
EtoPHG
CE,
Problem: Dezimalwerte im Split
Warum probierst du die Funktionen nicht erst so aus, wie ich sie vorgeschlagen habe?
Wer hat dir gesagt, Val durch CDbl und den . (Dezimalpunkt) durch den Application.DecimalSeparator zu ersetzen? Warum definierst du x,y,z als Single und lädst dann einen Double Wert? Definiere sie als Double! Versuch es mal mit genau den Konstrukten, die ich in der UDF vorgeschlagen habe, bzw. Ruf statt deinen Befehlen, die Funktion mal so auf:
                    If .Cells(ZeileCP, 1).Value Like "[#]#? = CARTESIAN_POINT(*(*,*,*));" Then
x = findCartesianPoint(.Cells(ZeileCP,1).Text,1)
y = findCartesianPoint(.Cells(ZeileCP,1).Text,2)
z = findCartesianPoint(.Cells(ZeileCP,1).Text,3)

Problem: FreeCAD_STEP muss aktiv sein
Wenn du ein With Konstrukt benutzt, musst du die Objekte des Parent-Objekts auch richtig addressieren:
With wks
Cells(row,column)...  ' Falsch: Addressiert eine Zelle im aktiven Blatt, nicht in wks
.Cells(row,column)...  ' Richtig: Addressiert eine Zelle im With-Objekt, d.h. hier wks
End With
wks.Cells(row,column)...  ' Addressierung mit vorgestelltem Parent.
'Zelle bezieht sich auf wks-Objekt

Gruess Hansueli

Anzeige
AW: Deine Anpassungen sind falsch,
15.05.2014 09:30:33
Common
Guten morgen Hansueli
...mann mann mann manchmal habe ich ne extrem lange Leitung, bei soviel Code verliert man echt den Überlick :p
Habe deine Funktion nun in meinem Button eingefügt und die x,y,z-Werte so umschrieben wie du es vorgeschlagen hast. Funktioniert soweit gut, die Kommawerte werden aber nicht angezeigt. 10.5 usw...
Wer hat dir gesagt, Val durch CDbl und den . (Dezimalpunkt) durch den Application.DecimalSeparator zu ersetzen?
Ein Kollege hat mir den Tipp gegeben...ich habe es mir schon gedacht dass das nicht so sein kann.
Ich kenne aus c++ float sind ja Fließkommazahlen und anscheinend unter VBA laut es single.
Müsste dann CSng...hat aber auch nicht funktionert.
Stehe jetzt gerade auch noch vor dem Problem wie ich das automatisiert machen kann.
D.h. für das nächste Produkt die nächsten CP-Werte.
Die ersten Werte müssen so sein, keine Frage aber dann muss ne Schleifenart her...und wie genau ich das Schreibe, da stecke ich gerade fest.
Gruß
CE

Anzeige
Und das letzte Beispiel...
15.05.2014 12:23:36
EtoPHG
Hallo CE,
Also ich mal alles auf den Kern zusammengedampft und in dieser ->Beispielmappe realisiert.
Ich habe einzig die Daten in der Zeile 24 (erste Fundstelle CARTESIAN_POINT) der Quelltabelle so geändert, das alle Zahlenmöglichkeiten in den Koordinaten-Daten vorkommen, um zu Überprüfen, ob die Umwandlung funktioniert. Zum Testen kannst du die Zelleinhalte auf dem Ein_Ausgabe-Blatt löschen und den Code per Button wieder ausführen.
Gruess Hansueli

AW: Und das letzte Beispiel...
15.05.2014 13:55:07
Common
Hi Hansueli,
DANKE DIR!!! sieht ja echt super aus!!
Der erste CP-Wert ist jedoch #25(KEINE ZEILEN ANGABE, als ZEILE wäre es 37 jedoch gefährlich, wie ich das jetzt gemerkt habe), wo kann ich das im Programm ändern.
ich habe das mal für 4 Quader gemacht, würde das dann auch funktionieren?
ich fragen deswegen, da ich leider nicht ganz verstehe wie du die nächsten 3 kooordinanten für Quader2,3,n suchst.
Für die nächsten n-Quader lautet es :
wertCP=25 //Quader_1'#25
wertCP = wertCP + 344
'344 heißt keine 344 ZEILEN später, sondern eigentlich
#25+#344=#369 //Quader_2
#369+#344=#713 //Quader_3 usw.
'Weil eine # kann 2 Zeilen oder mehr in Excel haben.
'Daher Gefährlich mit Zeilen zu arbeiten...s.o.
und
wsT.Cells(lRowT, 15) = Val(Replace(vTmp(1), "(", ""))   ' X-Koordinate
wsT.Cells(lRowT, 16) = Val(vTmp(2))                     ' Y-Koordinate
' ...und falls vorhanden, Z-Koordinate

falls vorhanden...heißt das jetzt es gibt etwas aus oder nicht oder wird es auf Null gesetzt wenn nichts drin steht.
Die CP-Werte nur mit 2 Koordinaten werte ich gar nicht, sondern NUR mit 3 Koordinaten.
Sry...das solche Infos jetzt erst kommen..aber mit den Versuche die ich mache, merke ich langsam was geht und nicht.
ABER DEIN PROGRAMM SCHEINT WIRKLICH DIE LÖSUNG ZU SEIN :)
Vielleicht berechnest du die nächten Quader so wie ich oben beschrieben habe nur ich finde es leider nicht.
Gruß
CE

Anzeige
AW: Und das letzte Beispiel...
15.05.2014 14:32:26
Common
Ich habe es mal näher angeschaut und außer Quader_1 also das erste Proukt(kann auch anders heißen),
ist es IMMER der zweite CP-Wert. Produkt_1 ist es der dritte CP-Wert.
Es ist desshalb so wichtig, weil der zweite Wert CP-Wert von Proukt_2...n das DELTA zwischen STEP-Excel und STEP-FreeCAD.
https://www.herber.de/bbs/user/90693.xlsx
ich habe es einmal hier zusammengestellt- von einem bis 3 Quader. (manipulator+greifer+logistik=3 Quader)
Und ich glaube so sind wir auch unabhängig von der Zeile, ich brauche ja "nur" den zweiten CP_Wert von Produk_2...n, oder?
PS. deine Kommentare sind perfekt, das was ich nicht verstehe sind wesentliche VBA-Syntax...dafür gibt es aber das internet :)
Gruß
CE

Anzeige
Jetzt sollte es sitzen...
15.05.2014 14:46:07
EtoPHG
Hallo CE,
Jetzt wird es klarer mit den Regeln.
Hier also die Lösung.
Und ja, es können 'beliebig' viel Quader vorkommen, es wird einfach weitergesucht, bis keine mehr gefunden werden.
Gruess Hansueli

AW: Jetzt sollte es sitzen...
18.05.2014 12:31:48
Common
Hi Hansueli
DANKE DIR und SORRY DAS ICH MICH JETZT ERST MELDE...
Super funktioniert perfekt!!! DANKE DIR NOCHMALS!!!
Gruß
CE

AW: Jetzt sollte es sitzen...
18.05.2014 17:45:32
Hajo_Zi
was ist noch offen, da Du den Beitrag als offen markiert hast?
Gruß Hajo
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige