| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Turbocad |
Autor
|
Thema: VBA-Schleifen? (2592 mal gelesen)
|
defekt Mitglied fashion design
Beiträge: 50 Registriert: 03.05.2004
|
erstellt am: 03. Jun. 2005 23:49 <-- editieren / zitieren --> Unities abgeben:
Hallo! Weiß jemand von euch, wie man eine Schleife in VBA macht? Ich hab es hier versucht, aus irgendeinem Grund funktioniert sie aber nicht. Es ist eine Abwandlung des Rechteck-Macros aus dem Forum, das einwandfrei funktioniert hat- an dieser Stelle vielen Dank an denjenigen, von dem es stammt! Option Explicit
Dim xOrigin Dim yOrigin Dim zOrigin xOrigin = 0 yOrigin = 0 zOrigin = 0 Dim gxLayer Dim gxURec Dim gxPlayList Dim gxSelList On Error Resume Next Set gxPlayList = ActiveDrawing.GraphicSets("PlayList") if (Err.Number <> 0) then Set gxPlayList = ActiveDrawing.GraphicSets.Add("PlayList", false) else gxPlayList.Clear End If On Error GoTo 0 On Error Resume Next Set gxSelList = ActiveDrawing.GraphicSets("SelectionList") if (Err.Number <> 0) then Set gxSelList = ActiveDrawing.GraphicSets.Add("SelectionList", false) else gxSelList.Clear End If On Error GoTo 0
Properties("$SNAPMODE") = "-2147479488" Properties("$SNAPMODE") = "-2147479551" Dim gxChild Set gxURec = ActiveDrawing.AddUndoRecord("Script Play Add Graphic Entity") Set gxChild = gxPlayList.Add(11,,false,"normal lines") 'bis hierher unverändert 'Es soll die Kurve einer mathematischen Gleichung dargestellt werden, die Gleichung lautert x=y² 'Die Kurve ist nicht rund, sondern die Richtung ändert sich bei jedem neuen Wert, den y annimmt 'Der Einfachheit halber hier mal ein fixer Wert für y, der bei jedem Schleifendurchlauf um 1 höher wird '**************************************************************************************************************************** dim y y = 1 dim x
'**************************************************************************************************************************** Do Until y = 10 x = y*y With gxChild.Vertices .Clear Dim gxVrt Set gxVrt = .Add(xOrigin + x, yOrigin + y, zOrigin + 0.0000000000000000, true, true, true, true, true, false) End With y = y + 1 Loop Set gxChild = gxPlayList(0) ActiveDrawing.Graphics.AddGraphic gxChild gxURec.AddGraphic gxChild gxChild.Draw gxURec.Close gxPlayList.Delete Set gxPlayList = Nothing gxSelList.Delete Set gxSelList = Nothing
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
defekt Mitglied fashion design
Beiträge: 50 Registriert: 03.05.2004
|
erstellt am: 04. Jun. 2005 16:41 <-- editieren / zitieren --> Unities abgeben:
oK also wirklich rausgefunden, wieso es nicht funktioniert, hab ich nicht, aber es funktioniert, wenn man anstatt des Rechteck-Makros ein Makro "aufzeichnet" also recordet, und dieses dann abändert. Dieses hier ist auch insofern anders, als statt "Linien" Bezierkurven gezeichnet werden, und das Ergebnis dann eine richtige Kurve (Parabel) ist und kein aus Teillinien zusammengestückeltes Etwas. Das Ergebnis sieht dann so aus und funktioniert (zumindest bei mir): Option Explicit Dim gxLayer Dim gxURec Dim gxPlayList On Error Resume Next Set gxPlayList = ActiveDrawing.GraphicSets("PlayList") if (Err.Number <> 0) then Set gxPlayList = ActiveDrawing.GraphicSets.Add("PlayList", false) else gxPlayList.Clear End If On Error GoTo 0 Start "Insert|Curve|Bezier" On Error Resume Next ActiveDrawing.Styles("Normal Curves").Activate if Err.Number <> 0 then MsgBox Err.Description,,"Playback error" End If Dim min min = InputBox("Ende der Parabel im Minusbereich:", "Dateneingabe") Dim x x= -min Dim max max = InputBox("Ende der Parabel im Plusbereich:", "Dateneingabe") MsgBox(max) Dim y Do Until x=max+1 y = x*x/10 'Parabel: x²=10y Click x, y, 0.000000000000000, 1 x = x+1 Loop On Error GoTo 0 DoLocalMenu 101, 0, 2.9952293581086886, 8.9858416410855622, 0.0000000000000000 gxPlayList.Delete Set gxPlayList = Nothing Einfach in TC rechts den MakroRecorder-Reiter anklicken, dort hineinkopieren und auf die Schaltfläche "Play Script" (wie das in der deutschen Version heisst, kann ich leider nicht sagen) klicken, und ausprobieren. Beim Ablauf des Makros werden zwei Werte abgefragt. Dies dient nur dazu, damit das Makro nicht ewig weiterläuft und eine endlose Kurve herauskommt, sondern die Schleife auch mal ein Ende hat. Es ist egal, was man da eingibt, irgendwas zwischen 10 und 20 oder was auch immer. Wenn man beide Male denselben Wert eingibt, sind die Parabelschenkel gleich lang. Es reicht beide Male ein positiver Wert. Die erzeugte Kurve ist eine Parabel. Wer möchte, kann die Parabelgleichung (hier: y=x*x/10) abändern und ausprobieren, was dann für Parabeln rauskommen. Es würde mich interessieren, ob es in der deutschen Version 10 bzw. 10.1 auch funktioniert, würde mich diesbezüglich über Rückmeldungen freuen! Wenn es funktioniert, könnte ich für Makro-Anfänger ein Tutorial machen, wie man solch ein Makro macht (also ein aufgezeichnetes abändert). Viele Grüße Andrea [Diese Nachricht wurde von defekt am 04. Jun. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
defekt Mitglied fashion design
Beiträge: 50 Registriert: 03.05.2004
|
erstellt am: 10. Jun. 2005 19:05 <-- editieren / zitieren --> Unities abgeben:
|
H. Scheurich Mitglied
Beiträge: 161 Registriert: 21.06.2002
|
erstellt am: 10. Jun. 2005 21:40 <-- editieren / zitieren --> Unities abgeben: Nur für defekt
Hallo Andrea, ich habe dein Script mal so probiert wie du es beschrieben hast. Die Wiedergabe bleibt bei folgender Zeile stehen: Start "Insert|Curve|Bezier" Du arbeitest mit der englischen Version. Getestet habe ich es mit der deutschen V10.1 pro. Für die deutsche Version muß das Script angepast werden. Ansonsten ist deine Idee mit dem Tutorial gut. Auf der Strecke gibt es immer noch viel zu tun. Konntest du deine Programmierprobleme aus deiner TC-Startzeit lösen? Gruss, H. Scheurich.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
defekt Mitglied fashion design
Beiträge: 50 Registriert: 03.05.2004
|
erstellt am: 10. Jun. 2005 21:55 <-- editieren / zitieren --> Unities abgeben:
Hallo! Oje, also funktioniert es nicht. Leider habe ich die deutsche Version nicht, nur die V6, in dieser gabs aber noch kein VBA oder MacroRecorder. Jetzt müsste mal jemand, der die deutsche V10 hat, eine neues Formular/neue Datei aufmachen, dann auf den Startbutton des Makrorecorders klicken, mit der Maus im Werkzeugmenü Bezierkurven anklicken und schauen, was da im Recorder kommt. Dann könnte man die Zeile, wo es hängenbleibt, ersetzen. Vielleicht kann das ja mal wer machen? Wenn sich das Skript dann nur in dieser einen Zeile unterscheidet, dann braucht man diese ja nur auszutauschen. Schwierig wirds, wenn der Recordercode der 10erVersion ganz anders aussieht, das wär dann blöd, denn dafür kann ich dann keine Tutorials schreiben, die hab ich ja nicht. Und ausser mir arbeitet kaum wer mit einer englischen Version nehme ich mal an. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
defekt Mitglied fashion design
Beiträge: 50 Registriert: 03.05.2004
|
erstellt am: 10. Jun. 2005 22:05 <-- editieren / zitieren --> Unities abgeben:
@ H. Scheurich Ja die Anfangsprobleme... das war schwierig. Damals hatte ich glaube ich noch eine Probeversion, jetzt wo ich die 9er gekauft habe, bin ich wesentlich entspannter. Ich bin noch am Einarbeiten und versuche mir möglichst viel Wissen anzulesen. Mit VBA komme ich noch nicht klar, die Entwicklungsumgebung ist sehr komplex. Aber ich finde den Makrorecorder super, und damit probiere ich viel herum, ersetze Punkteingaben durch Variable, jetzt wo ich MsgBox und InputBox kenne, geht alles schon ein bisschen leichter. An dem, was ich mir vorgestellt habe, bin ich noch lange nicht dran, aber ich lerne dazu. Ich finds auf alle Fälle toll, hier Fragen stellen zu können und lese natürlich viel mit, auch wenn mir manches noch zu hoch ist. Ich finde es halt sehr schade, dass das Programmieren in TC im Handbuch nur periphär behandelt wird, es könnte schon aufschlussreicher sein. Klar gibts keine Bücher wie "VBA lernen mit MSWord" für TurboCAD, aber man hätte da schon sehr viel mehr schreiben können. So muss man sich alles zusammensuchen und viel herumexperimentieren, was eben sehr mühsam ist. Grade als Anfänger ist das besonders schwer, wenn man vorher noch nie was mit VBA gemacht hat. Und ich glaube auch nicht, dass es sehr viel bringen würde, gezielt Word-VBA zu lernen, weil die beiden Anwendungen grundsätzlich ganz verschieden sind. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
H. Scheurich Mitglied
Beiträge: 161 Registriert: 21.06.2002
|
erstellt am: 10. Jun. 2005 22:06 <-- editieren / zitieren --> Unities abgeben: Nur für defekt
Hallo Andrea, genau so ist es. Habe das mal gemacht und bis auf eine Fehlermeldung MsgBox Err.Description,,"Playback error" (ähnliche Ursache wie erster Fehler) läuft dein Script. Also, dann mal los. Schreib mal Tutorials. Die Übersetzung in die deutscher Version können wir gemeinsam machen. Es werden sich bestimmt noch mehr Leute finden die mit helfen. Gruss, H. Scheurich. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|