Juergens-Workshops.de Forum
VBA, Fragen dazu - Druckversion

+- Juergens-Workshops.de Forum (https://forum.juergens-workshops.de)
+-- Forum: Corel Grafik Forum (https://forum.juergens-workshops.de/forumdisplay.php?fid=65)
+--- Forum: Corel Draw (https://forum.juergens-workshops.de/forumdisplay.php?fid=93)
+--- Thema: VBA, Fragen dazu (/showthread.php?tid=38122)

Seiten: 1 2


VBA, Fragen dazu - Olaf - 15.09.2020

Hallo Koter,

ich bin jetzt seit 2 Tagen dabei mich mit VBA auseinanderzusetzen, ich hoffe mal das ich mich da nach und nach durchbeiße.

Ich hätte ich Fragen bei denen es toll wäre wenn ich Deine Hilfe erhalten könnte.

Im Code steht vor den Objektnamen immer ein kleines o, z.B. "oSeite", leider verstehe ich nicht wozu es dort steht.

Mir ist auch nicht ganz klar ob es einen festen Platz für Variablen gibt. Ich finde Variablen unter  "Option Explicit" und auch unter Private Sub VarINI(), warum das so ist kann ich nciht erkennen.

Im Code gibt es eine Variable die glaube ich aussagt das oBoden ="Boden" im Corel ist ( Set oBoden = oPlattenEbeben.Shapes("Boden"), gibt es dafür einen bestimmten Grund?

Initialisierts du mit  Call VarINI 'Variablen initalieren" nur die Variablen aus Private Sub VarINI() bzw. müssenin Private Sub VarINI() alle Variablen.

Sorry für die vielen Fragen aber für einen Anfänger ist das echt eine harte Nuss, selbst mit Hilfe von Google und Youtube usw.. Mit fehlt tatsächlich auch noch der "Klick" um das ganz vom Grundsatz her zu verstehen, damit ich den Code später komplett selber erstellen kann.

Ich Danke Dir für Deine Hilfe.

Gruß

Olaf


RE: Hilfe: Skalieren aber Gruppierungen Proportional beibehalten - koter - 15.09.2020

Hallo Olaf,

Olaf schrieb:...Sorry für die vielen Fragen aber für einen Anfänger ist das echt eine harte Nuss, selbst mit Hilfe von Google und Youtube usw...

Du gibst ja richtig Gas!

Du musst Dich nicht für Fragen entschuldigen, dafür ist ein Forum wie dieses ja da. Google und Youtube sind gute Seiten. Um das Makro zu verstehen sollten aber das Tutorial, das Forum und die F1-Taste genügen. Ich will Dich natürlich nicht davon abhalten, Dich auch woanders umzusehen, man kann sich aber schnell verlaufen.

Olaf schrieb:...Im Code steht vor den Objektnamen immer ein kleines o, z.B. "oSeite", leider verstehe ich nicht wozu es dort steht...

Am Anfang des Codes im Plattenmodul werden einige Variablen deklariert. Beim Deklarieren legt man fest welchen Datentyp die Variablen haben sollen.

Die Variablen, deren Namen ich mit einem kleinen o beginnen lasse, sind Objektvariablen. Objektvariablen sind im Gegensatz zu einfachen Variablen ziemlich mächtige Dinger. Sie enthalten nicht nur einen einzelnen Wert, sondern komplexe Objekte, die wiederum andere Objekte enthalten können.

Die Variable oSeite enthält ein Objekt vom Typ „Page“ das eine Seite in einem CorelDRAW-Dokument repräsentiert. Objekte haben Eigenschaften und Methoden. Eigenschaften und Methoden werden angesprochen, indem man sie (durch einen Punkt getrennt) an den Variablenamen anhängt.

Eine Eigenschaft von oSeite wäre z.B. der Name der Seite.  Also mit oSeite.Name = "Plattenseite" würde die Seite mit einem Namen versehen werden.

Die Methode oSeite.Delete würde die Seite löschen.

Du musst also kein o vor den Variablennamen schreiben, Du kannst sie auch „Adelheid“ oder „Willibald“ oder sonstwie nennen.

Objekte haben im Tutorial ein eigenes Kapitel.

Olaf schrieb:...Im Code gibt es eine Variable die glaube ich aussagt das oBoden ="Boden" im Corel ist ( Set oBoden = oPlattenEbeben.Shapes("Boden"), gibt es dafür einen bestimmten Grund?...

Mit dem Befehl Set wird Objektvariablen ein konkretes Objekt zugewiesen. Ich habe die Kurve im Objektmanager „Boden“ genannt. Über diesen Namen wird das Objekt identifiziert. „Boden“ ist ein Unterobjekt der Ebene „Platten“. Die Ebene „Platten“ ist ein Unterobjekt der Seite:
[Bild: zwischenablage0196j16.jpg]
Du musst keine Variable für den Boden anlegen da dieser ja ein Unterobjekt der Seite ist. Es ginge also mit oSeite.Layers("Platten").Shapes("Boden"). Das wäre mir aber zu lang. Die Variable oBoden ist viel handlicher.

Olaf schrieb:...Initialisierts du mit  Call VarINI 'Variablen initalieren" nur die Variablen aus Private Sub VarINI() bzw. müssenin Private Sub VarINI() alle Variablen...

Die Sub-Prozedur VarINI hat gar keine eigenen Variablen. Eine Variable die nur in dieser Sub gelten soll, müsste innerhalb dieser Sub deklariert werden werden (Sichtbarkeit). Die Sub versieht nur zuvor deklarierte Variablen mit Werten. Das Objekt ActiveDocument muss (und kann) nicht deklariert werden. Es ist ein Objekt der Applikation (CorelDRAW) und repräsentiert die aktuelle Seite. Unit ist eine Eigenschaft von ActiveDocument. Die Konstante cdrMillimeter gehört auch zur Applikation und hat den Wert 3. Weil sich keine Sau solche Werte merken kann, hat Corel netterweise diese Konstanten zur Verfügung gestellt.

Olaf schrieb:...Mit fehlt tatsächlich auch noch der "Klick" um das ganz vom Grundsatz her zu verstehen...

Ich befürchte diesen „Klick“ gibt es nicht. Falls Du noch keine Programmierkenntnisse hast, wirst Du wohl Schritt für Schritt vorgehen müssen. Vielleicht solltest Du einen Gang zurückschalten, damit der Spaß sich nicht in Frust verwandelt.

Viel Spaß und viel Erfolg!

Gruß

Koter


RE: VBA, Fragen dazu - Olaf - 17.09.2020

Hallo Koter,

nochmals ganz vielen Dank das Du Dir die Zeit für mich genommen hast, ich weiss das wirklich sehr zu schätzen. Ich habe Gestern und werde mich weiterhin mit dem Tutorial befassen, mal schauen wie weit ich komme.

Ich hatte eigentlich gehofft das ich mir, irgendwann mal, komplett eigenen Makros erstellen kann, werde aber nun erstmal Deine tollen Codes benutzen und auf diesen aufbauen, vielleicht kommt dadurch ja auch ein bisschen Routine.

Für "nebenbei" sind die Möglichkeiten die VBA beieet echt gewaltig.

Ich melde mich sobald ich Fragen habe bzw. auch sobald ich am Ziel  bin und es für unsere Wünsche, die glaube ich nicht ganz ohne sind, alles passt.

Vielen Dank

Gruß

Olaf


RE: VBA, Fragen dazu - Olaf - 18.09.2020

Hallo Koter,

es läuft wirklich gut, ich baue bzw. Ergänze Deinen Code zwar nur und ich brauche dafür auch wirkloch sehr viel Zeit, ich kriege langsam aber zumindestens einen Hauch von einem Gefühl für Makros.

Was für mich eine große Herausforderung darstellt ist folgendes:

Du hast mir ja nettwerweise den Code zum platzieren der Plattenteile (auf dem Bild gelb markiert) gebaut.
Das funktioniert super.

Es ist aber so das ich wie im Bild für den Deckel 2 Zeichnungen habe, für den Boden auch 2, für die Front und Rückwand sogar 6 und für die Seitenteile links und rechts 3.

Welche Zeichnung verwendet werden soll, bzw. von welcher Zeichnung die Teile platziert werden sollen hängt von den im Dialogfenster eingegebenen Maßen ab.

Bei einer Breite von 50-250mm sollen die Teile der linken Deckelzeichnung angedockt werden, bei einer Breite von 251-500mm die Teile der rechten Deckelzeichnung.

Bei den anderen Plattenteilen ist es das gleiche bzw. ähnlich, da ergibt sich die richtige Zeichnung teilweise aus 2 Werten aus dem Dialog .

Hast Du eine Idee wie man das bestimmen könnten? Ich vermute das ich das mit Wenn dann sonst lösen muss, ich weiss allerdings nicht wie. Wenn es geht, wäre es toll "Wenn dann sonst" nicht für jedes einzelne Teil zu vergeben sondern eventuell schon vorher einzugrenzen durch " Wenn der Wert in dem Feld Breite kleiner ist als 251mm dann nehme nur die Teile aus linken Zeichnung des Deckels....

Ich wünsche Dir und allen anderen ein schönes Wochenende.

Gruß

Olaf


RE: VBA, Fragen dazu - koter - 18.09.2020

Hallo Olaf,

ich habe eine ungefähre Ahnung von dem was Du planst, aber eine genaue Vorstellung habe ich noch nicht.
Ich möchte mich Norres Bitte aus dem ersten (abgetrennten) Teil des Themas anschließen:

(10.09.2020, 11:04)norre schrieb: ...Wenn es nicht zu groß ist vielleicht wäre es gut wenn du die CDR direkt (als Version X6) hochlädst. Dann müßte man oder Frau das nicht nachbauen. Parameter

Wenn Du noch eine neue Ebene einfügen könntest, auf der Du einen kurzen Text unter jedes Teil schreibst, der aussagt wo es unter welchen Bedingungen hin soll, wäre das super!

Die Dateiversion sollte nicht über X7 liegen, sonst kann ich sie nicht öffnen.
Bitte keine Schriften oder Farbprofile einbinden, die Datei würde dann zu groß.

Falls Du die Datei hier nicht anhängen möchtest, findet sich bestimmt eine anderer Weg sie mir zukommen zu lassen.

Ich benutze für so etwas gerne Filehorst.

Gruß

Koter


RE: VBA, Fragen dazu - Olaf - 02.10.2020

Hallo Koter,

wie bereits geschrieben ein riesiges Dankeschön für Deine Hilfe.

Ich habe ein paar Allgemeine Fragen zu VBA. Teilweise sicherlich lächerlich Dinge aber für mich wichtig, da ich wirklich noch am Anfang stehe.

Was ist der Unterschied zwischen einem Modul in das ich Code eingebe und z.B. This Macro Storage oder This Document. Ist es wichtig Wo ich welchen Code eintrage oder könnte ich, übertrieben gefragt, den Code reinschrieben wo ich möchte? Kann ich, wenn ich möchte, jede "Funktion" für mich zur Übersicht in viele einzelne Module hineinschreiben um den Code schön sauber zu separieren? 

Gibt es irgendwo eine Art Übersicht über alle Befehle in Form einer Liste die z.B. in verschiedene Bereiche aufgeteilt ist und wo eventuell auch eine Kurzerklärung steht was der Befehl bewirkt?

Das wäre für mich persönlich eine große Hilfe. 

Gruß

Olaf


RE: VBA, Fragen dazu - koter - 03.10.2020

Hallo Olaf,

(02.10.2020, 21:09)Olaf schrieb: ...Ich habe ein paar Allgemeine Fragen zu VBA. Teilweise sicherlich lächerlich Dinge aber für mich wichtig, da ich wirklich noch am Anfang stehe...

Bisher war keine Deiner Fragen lächerlich, auch in diesem Beitrag kann ich keine lächerliche Frage finden.

(02.10.2020, 21:09)Olaf schrieb: Was ist der Unterschied zwischen einem Modul in das ich Code eingebe und z.B. This Macro Storage oder This Document. Ist es wichtig Wo ich welchen Code eintrage oder könnte ich, übertrieben gefragt, den Code reinschrieben wo ich möchte? Kann ich, wenn ich möchte, jede "Funktion" für mich zur Übersicht in viele einzelne Module hineinschreiben um den Code schön sauber zu separieren?

Grundsätzlich kannst Du den Code hineinschreiben wo Du möchtest. Makros, die mit einem Dokument weitergegeben werden sollen, musst Du natürlich im Dokument platzieren. Makros, die nicht an ein bestimmtes Dokument gebunden sind und auf dem lokalen Rechner bleiben sollen, kannst Du in die (von Corel angelegte) GMS-Datei „GlobalMakros“ schreiben. Weil das schnell unübersichtlich werden kann, solltest Du Deine Projekte aber in eigenen GMS-Dateien ablegen.

Innerhalb von Dokumenten oder GMS-Dateien kannst Du so viele Module anlegen, wie Du willst. Neben einfachen Codemodulen gibt es noch Klassenmodule, UserForm-Module (für Benutzerdialoge) und Module die Ereignisse durch Ereignisprozeduren verarbeiten können. Zu letzteren gehören „ThisMacroStorage“ in GMS-Dateien und „ThisDocument“ in Dokumenten.

[Bild: neuesdokument-1mvj9u.jpg]

Das öffnen eines Dokuments wäre ein Ereignis, das durch die Ereignisprozedur „Document_Open“ verarbeitet werden kann. Steht die Ereignisprozedur in „ThisDocument“ wird das Öffnen dieses Dokuments verarbeitet, steht sie in „ThisMacroStorage“ wird sie bei jedem Öffnen irgendeines Dokuments verarbeitet. Auch in Deinen eigenen GMS-Dateien findest Du „ThisMacroStorage“, Du musst also die „GlobalMakros“ nicht verwenden.
In diesen speziellen Modulen sind die möglichen Ereignisse vorgegeben. Du kannst ein Ereignis über ein Dropdown auswählen und die Ereignisprozedur wird automatisch angelegt.

[Bild: docopenh0kwy.gif]

Prozeduren, die von Ereignisprozeduren aufgerufen werden, können auch in anderen Modulen stehen.

Klassenmodule werden im Tutorial gut erklärt, darauf möchte ich jetzt nicht eingehen.

(02.10.2020, 21:09)Olaf schrieb: ...Gibt es irgendwo eine Art Übersicht über alle Befehle in Form einer Liste die z.B. in verschiedene Bereiche aufgeteilt ist und wo eventuell auch eine Kurzerklärung steht was der Befehl bewirkt?...

Eine Liste der Befehle, die Bestandteil der Programmiersprache VBA sind, findest Du in der Funktionsreferenz des Tutorials. Diese ist thematisch geordnet und für jeden Befehl gibt es dort eine Kurzerklärung.

Die Befehle der Wirtsanwendung (also des Programms in das VBA integriert ist wie CorelDRAW, Word, AutoCAD usw.) findet man in der Hilfe des entsprechenden Programms. Die Befehle des Programms sind als Methoden von Objekten und deren Unterobjekten angelegt. Die oberste Ebene ist dabei das Application-Objekt, also das Programm selber. Objekte und Unterobjekte bilden das Objektmodell. Dieses Objektmodell wird oft (so übersichtlich wie möglich) in einer Grafik beschrieben. Das Objektmodell für CorelDRAW X7 findest Du z.B. hier.

Die Befehle (Methoden) wird man aber kaum verstehen, wenn man sich nicht vorher mit dem Programm selber und den Objekten des Programms befasst hat. Solche Listen haben eine einschüchternde Länge. Eine solche Liste durchzugehen ist (meiner Meinung nach) keine sinnvolle Lernmethode.

Zusätzliche Hinweise:

Damit ein Objekt zur Verfügung steht, muss ein Verweis auf die Objektbibliothek gesetzt sein.
Einen Verweis kann man unter Extras/Verweise setzen:

[Bild: verweise1nk9k.jpg]

Wenn Du z.B. von Coreldraw auf Microsoft-Word-Objekte zugreifen willst, kannst Du einen Verweis auf die Word-Objektbibliothek setzen.

Ein kleines Beispiel bei dem der erste Absatz eines geöffneten Word-Dokuments in den dritten Absatz eines CorelDraw-Mengentextes kopiert wird:

[Bild: vonword3djux.gif]

Code:
Sub AbsatzAusWordEinfügen()
   Dim WordAbsatz As String
   WordAbsatz = Word.ActiveDocument.Paragraphs(1).Range
   ActiveLayer.Shapes("MText1").Text.Story.Paragraphs(3) = WordAbsatz
End Sub

Das Objekt „Word“ würde es ohne den Verweis nicht geben.
(tolles Beispiel, sowas braucht man täglich!) MrGreen

Wenn Du sehen willst, welche Objekte zur Verfügung stehen ist der Objektkatalog (F2) nützlich.

Gruß

Koter


RE: VBA, Fragen dazu - Olaf - 08.10.2020

Hallo Koter,

ganz vielen Dank für Deine Hilfe.

Ich habe eine neues Problem und finde dazu keine Lösung.

Ich kann das Dialogfenster nach dem schliessen nicht direkt nochmals öffnen und den nächsten Artikel zu bemaßen, da sich die Ecken nicht mehr an der roten Form "orientieren". Dies geht erst wenn ich Corel schließe und nochmals öffne.

Hast Du dazu eventuell eine Idee?

Gruß

Olaf


RE: VBA, Fragen dazu - koter - 08.10.2020

Hallo Olaf,
(08.10.2020, 14:19)Olaf schrieb: Hast Du dazu eventuell eine Idee?

leider nicht. Ich habe versucht, diesen Fehler bei mir zu provozieren - ohne Erfolg.
Du wirst manches geändert haben, die Datei, die ich Dir gesendet habe, funktionierte ja noch nicht richtig.
Lass mir doch bitte die aktuelle Version auf dem üblichen Weg zukommen.

Meine Testversion ist leider abgelaufen. Ich brauche die Datei also unbedingt in der Version 17.
Ich hoffe, dass der Fehler nicht durch Inkompatibilitäten des Makros mit Deiner Version verursacht wird, dann wird es für mich schwierig, den Grund zu finden.

Gruß

Koter


RE: VBA, Fragen dazu - Olaf - 09.10.2020

Hallo Koter,

versuche es mal bitte mit dem Link

Datei von filehorst.de laden

oder


https://filehorst.de/d/dAafFbmn

Wenn ich die Datei in der Version 17 Speicher sagt Corel mir das das VBA Projelt verloren geht... ich hoffe es funktioniert trotzdem.
Es ist nicht die Datei die Du mir zuletzt gesendet hast , es ist eine wesentlich einfachere für ein anders Produkt, die wir auch schon produktiv einsetzen.....

An die Datei mit den vielen Platten und den von Dir gesetzten Fixpunkten traue ich noch nicht ran bzw. wird das für mich, mit meinem VBA Kenntnisstand, eine schwierige Nummer, da habe ich mich erstmal mit den einfachern befasst, ich hoffe das ich in den nächsten Tagen zu der komplexeren Datei komme.

Ich wünsche Dir ein schönes Wochenende.

Gruß

Olaf