VBA relative Objekt Position
#1
Hi ich bin neu hier und habe folgendes Problem.

Ich möchte via VBA ein Objekt (Tabelle) erstellen.

Das funktioniert leidlich.  Er legt die Tabelle an, aber ich weiß zwar noch nicht genau welcher Parameter was bedeutet. Das bekomme ich irgendwie raus. Wink. Hab sie einfach mal per Makro erstellt und den Code gelesen.

ABER Corel nimmt als Punkt immer den Mittelpunkt des Objekt.

Damit komme ich überhaupt nicht zurecht.

Und in der Markoaufzeichnung zeichnet er das irgendwie nicht auf, oder ich übersehe den Befehl, was unwahrscheinlich ist.

Gibt es eine Möglichkeit via VBA-Befehl Corel zu sagen das es bei JEDEN Objekt oder für das Objekt immer OBEN LINKS den Punkt nimmt, und dabei direkte Koordinaten nimmt.  Global wäre mir lieber, aber wenn es sein muss dann meinetwegen auch für jedes Objekt.

Normal im Corel klicke das Objekt an, nehme den Haken bei "relative Position" raus und klicke den Punkt nach Links oben.

Aber wie geht das via VBA-Befehl ??

Vielen Dankt für eure Hilfe

Gruß

   Pucki
Zitieren
#2
Hallo Pucki,

willkommen im Forum!

Der Befehl lautet:
Code:
ActiveDocument.ReferencePoint = cdrTopLeft

Gruß

Koter
[-] 1 Benutzer bedankt sich bei koter für diesen Beitrag:
  • Pucki
Zitieren
#3
Perfekt.

Um eine berühmte Dame aus der Werbung zu zitieren. "Hier werden Sie geholfen"

Vielen herzlichen Dank.

Ich hab sogar heraus gefunden was cdrTopLeft für ein Wert hat, nämlich 3.

Der Grund warum ich das wissen muss ist, das ich nicht in VBA direkt schreibe, sondern in VB via Interop.

Es geht bei den Projekt darum aus einer Datenbank gewisse Felder in einer Tabelle über mehre Seiten aufzubauen die alle gleich aussehen. Ich könnte das zwar alles von Hand programmieren aber Corel hat da viel mehr Möglichkeiten.


Das Problem ist, ich kenne die Befehlssatz von Corel-VBA noch nicht so gut. Da muss ich mich gerade reinfuchsen. Wink

Nochmal vielen Dank

Gruß

   Pucki.
Zitieren
#4
Jetzt brauche ich noch 3 Befehle dann müsste das Projekt laufen.

Befehl 1. :  Erweitere das Tabellen-Objekt um 1 Zeile.

Befehl 2 : Gib mir die Höhe des Tabellen Objekt an

Befehl 3 : Die Höhe einer bestimmten Zeile in der Tabelle.

Dann nerve ich auch hoffentlich nicht mehr, weil ich denke das ich dann alles habe.

Ich hoffe ich kann das hier schreiben ansonsten mache ich ein neuen Thread auf.

Vielen Dank für eure Hilfe.

Gruß

  Pucki
Zitieren
#5
Hallo Pucki,

(27.07.2021, 17:42)Pucki schrieb: ...Dann nerve ich auch hoffentlich nicht mehr...

Du nervst nicht, das Forum existiert ja zum klären solcher und anderer Fragen!

Ich antworte wieder mit Code:

Code:
Sub Tab1()
   Dim Tabelle1 As Shape
   Dim Tabelle1C As CustomShape
   Dim TH As Double, ZH As Double
   
   ActiveDocument.Unit = cdrMillimeter ' Maßeinheit setzen
   
   Set Tabelle1 = ActivePage.Shapes("Tabelle1")
   Set Tabelle1C = Tabelle1.Custom
   
   Tabelle1C.AddRow Tabelle1C.Rows.Count + 1 'Zeile am Ende hinzufügen
   TH = Tabelle1.SizeHeight 'Tabellenhöhe
   ZH = Tabelle1C.Rows(3).Height  'Zeilenhöhe (Zeile 3)
End Sub

Eine Frage aus Neugier:
Gibt es keinen Reportgenerator oder ähnliches für Deine Datenbank?
So etwas mit einem Vektorgrafikprogramm zu machen ist schon ein bisschen schräg.

Hoffentlich programmierst Du dich nicht in eine Sackgasse!

Gruß

Koter
[-] 1 Benutzer bedankt sich bei koter für diesen Beitrag:
  • Pucki
Zitieren
#6
Ups.  Mein Fehler :

Ich brauche den Befehl wie ICH die Höhe einer bestimmten Zeile setze.

Und wie ich die VERTIKALE Ausrichtung in der Tabelle auf zentriert setze, per Programm.

Zitat:Eine Frage aus Neugier:
Gibt es keinen Reportgenerator oder ähnliches für Deine Datenbank?
So etwas mit einem Vektorgrafikprogramm zu machen ist schon ein bisschen schräg.


Antwort : Das Datenbank-Programm habe ich selbst geschrieben. Im Prinzip ist es eine bisschen Code und eine SQL-Datei. Darin werden Daten aus unterschiedlichen Quellen (Excel/CSV, andere Datenbankformate) in eine gewisse Ordnung gebracht. Preise aufgrund des Hersteller-Rabatt kalkuliert, Texte Angepasst, Eigene Artikel-Nr. vergeben etc. Danach wird eine Datanorm erstellt und was man sonst so alles braucht.

Normalerweise wäre die Ausgabe in Excel einfacher. Was ich zur Kontrolle und als Kalkulationshilfe für den Chef eh machen. Auch per INTEROP.

Das Problem ist der Ausdruck. Unter Excel bekommt man keinen gescheiten Ausdruck hin. Besonders nicht wenn man noch Grafiken und alles einfügen will ja nach Bedarf. Was nicht bedeutet das Excel nicht drucken kann. Aber die Skalierung zwischen 2 gleichen Seiten ist ein Graus. Davon abgesehen haut ein jede Druckerei das um die Ohren bzw. schreibt eine große Rechnung, weil sie es neu aufbereiten müssen.

In meinen Fall habe ich Artikel-Daten drin, und will eine Preisliste daraus machen. Sinn und Zweck der Übung ist es also eine für eine Druckerei geeignete Preisliste mit 1 Klick zu ersten.

Meine Software fragt die DB nach relevanten Artikeln ab, und erstellt dann automatisch eine Preisliste, mit Firmenlogo, Einigen Textfelder , z.b. 1 mit den Wort : "Preisliste : " in Arial 18 , ein nächstes mit den Feld :"Stand : 2021" in Arial 12. Dazu noch das Firmenlogo reinkopieren u.s.w.

Nun so ab Höhe 200 nach unten die Tabelle mit den Bauteilen.

Es gibt eigentlich 2 Möglichkeiten das was ich vor habe zu machen.

Möglichkeit 1 : Viel weniger Code = Tabelle erstellen.

Möglichkeit 2 : Viele Linien und Textfelder erstellen.  Eine Möglichkeit die ich damals benutzt habe, als ich den Ausdruck einer Angebotssoftware geschrieben habe. Und die ich schon alternativ mit Corel getestet habe.

Schreiben tut ich das ganze unter VB mit den INTEROP Zugriff au Corel.  Ich muss also dein Code in Interop Befehle umwandeln. Ist aber nicht wirklich ein Problem.

Hier mal ein Teil des Code von mir.
Code:
 corel.ActivePage.Orientation = 0
corel.ActiveDocument.Unit = cdrMillimeter
corel.ActiveDocument.ReferencePoint = 3  <- Diese Zeile ist das Ergebnis deiner ersten Antwort

corel.ActiveLayer.CreateCustomShape("Table", 50, 0, 250, 250, 3, 3) ' unten links (x,y) / oben rechts (x,y)
corel.ActiveShape.Name = "Tabi_1"
tab_1 = corel.ActiveShape

corel.ActiveLayer.Shapes.Item("Tabi_1").Custom.Columns(1).Width = 20.0
corel.ActiveLayer.Shapes.Item("Tabi_1").Custom.rows(1).height = 20.0
 tab_1.Custom.Cell(2, 3).TextShape.Text.Story = "papi"
tab_1.Custom.Cell(2, 3).TextShape.Text.story.Alignment = 4
tab_1.Custom.AddRow(1)
 
tab_1.Rows(3).Height = 10 ' <- hier ist der Fehler dessen Antwort ich suche

Ist weder schön noch optimiert. Das mache ich vielleicht wenn es irgendwann läuft.  Zu Lernzwecke ist es mir so lieber.

Danach müsste ich also nur noch mit einer For-Next Schleife jede Zelle füllen. FERTIG.

Ich hoffe du verstehst nun was das Ziel ist, und warum ich hier euch nerve.  Vielleicht hat ja mal ein andere User die selbe IDEE o. eine ähnliche Aufgabe.

Nochmal vielen Dank für deine Hilfe. 

Ist echt ein Krampf Infos über VBA für Corel zu bekommen. Ich habe garantiert gestern 500 Google-Anfragen gemacht Minimum.  Man hat den Eindruck VBA für Corel mag keiner o. Corel rückt kaum Infos raus.  Ich hab noch nie so wenig Code-Bespiele gesehen.

Deshalb bin ich über deine Hilfe sehr dankbar.

Gruß
 
  Pucki

Ps. : Ich weiß das die meisten User Excel für alles mögliche Vergewaltigen. Ich mag aber Corel lieber. Das sieht da Ergebnis besser aus.
Zitieren
#7
Hallo Pucki,

vielen Dank für die ausführliche Antwort!

Bei dem von Dir gekennzeichneten Fehler greifst Du auf das Shape-Objekt zu, das die Tabelle (das Custom-Objekt) beinhaltet. Du musst aber auf das Custum-Objekt zugreifen.

Hier nochmal als VBA-Code:

Code:
Sub Tab2()
   Dim tab_1 As Shape
   Dim tab_1C As CustomShape
       
   ActiveDocument.Unit = cdrMillimeter ' Maßeinheit setzen
   
   Set tab_1 = ActivePage.Shapes("Tabelle1")
   Set tab_1C = tab_1.Custom
   
   tab_1C.Rows(3).Height = 15 'Zeilenhöhe
   tab_1C.Cells(1).TextShape.Text.Frame.VerticalAlignment = 1 ' Zelle 1 vertikal zentrieren
End Sub

Achte auf die Dim und Set Anweisungen. tab_1C ist ein Unterobjekt von tab_1 . Ich hoffe Du kannst das nach VB übersetzen. Die letzte Version, die ich benutzt habe war VB6. VB.Net unterscheidet sich erheblich von dieser alten Version, beim übersetzen kann ich also leider nicht helfen.

Gruß

Koter
[-] 1 Benutzer bedankt sich bei koter für diesen Beitrag:
  • Pucki
Zitieren
#8
Vielen Dank für deine Antwort.

Die Zeilenhöhe klappt perfekt. Aber die Vertikale Zentrierung schmeißt mir einen Fehler raus.


Code:
tab_1C.Cells(1).TextShape.Text.Frame.VerticalAlignment = 1 ' Zelle 1 vertikal zentrieren

Das klappt nicht. 

Ich habe den Code in VB und auch als echtes Makro in Corel eingegeben.  Die Zeilenhöhe führt er sauber aus.
In VB + auch Corel- direkt als Makro.

Der Befehl oben zu vertikalen Ausrichtung wird einfach ignoriert.

Was mich an den Befehl wundert ist.  Er gibt keine Koordinaten an.


Code:
tab_1c.Custom.Cell(2, 3).TextShape.Text.story.Alignment = 4

funktioniert einwandfrei, Aber leider nur Horizontal.    Ein vertikalen Parameter nimmer er komischerweise nicht.



Hast du da vielleicht noch eine Idee.


Gruß

   Pucki
Zitieren
#9
Hallo Pucki,

Noch habe ich keine Idee, aber das kann ja noch kommen.

Lass bei Dir mal folgende VBA-Sub (So wie sie ist) durchlaufen.
Wenn ein Fehler auftritt schreibe mir in welcher Zeile und die Meldung.

Code:
Sub Tab3()
   Dim tab_1 As Shape
   Dim tab_1C As CustomShape
   ActiveDocument.Unit = cdrMillimeter ' Maßeinheit setzen
   
   Set tab_1 = ActiveLayer.CreateCustomShape("Table", 10, 100, 130, 250, 3, 4)
   Set tab_1C = tab_1.Custom
   
   tab_1C.Rows(3).Height = 15 'Zeilenhöhe
   
   With tab_1C.Cell(2, 3).TextShape.Text
       .Story = "Testtext"
       .Story.Font = "Arial"
       .Story.Size = 18
       .Story.Alignment = 3 'Hotizontal Zentrieren (cdrCenterAlignment)
       .Frame.VerticalAlignment = 1 ' Vertikal Zentrieren (cdrCenterJustify)
   End With
End Sub

Bei mir läuft die Sub im Einzelschrittmodus so:

[Bild: tab_vba4ejzv.gif]

Teile mir bitte auch Deine CorelDraw-Version mit und schreibe sie vielleicht auch in Deine Signatur.

Bei dem Befehl, bei dem Du die Koordinaten vermisst, habe ich die Cells-Auflistung benutzt. Da gibt es keine Koordinaten, die Zellen werden einfach durchnummeriert.

Gruß

Koter
[-] 1 Benutzer bedankt sich bei koter für diesen Beitrag:
  • Pucki
Zitieren
#10
JETZT klappt es. 

Der Fehler war das ich eine Zelle in der 3 Zeile(von 4) 2 Spalte (von 4) aus geguckt habe.  Da ein Text rein geschrieben habe, und den dann ausrichten wollte.  Corel hat es also nicht ignoriert, sondern einfach nix in nix gemacht .


Zitat:Da gibt es keine Koordinaten, die Zellen werden einfach durchnummeriert.


AUA. Das ist mir in über 30 Jahren Software-Entwicklung noch nicht bei einer Tabelle vorgekommen.

Muss ich mich bei Corel daran gewöhnen oder gibt es auch ein Befehl wo ich die Vertikale Ausrichtung wie bei der horizontalen auch, via X , Y Koordinaten anweisen kann.  Ist nämlich echt lästig jedes mal über eine Funktion die Zelle berechnen zu lassen. 

Wobei mir dann helfen würde, wenn mir Corel sagt wie viele Spalten aktuell hat.

Selbst wenn es nicht geht, egal.  Du hast mir jede falls Mega geholfen. Muss ich halt eine Extra-Variable setzen + überwachen.

Ach was die Frage angeht. Ich habe noch die alte Corel - X4 . Die reicht für das bisschen was ich mache locker aus.

Mache bitte folgendes. : Führe deine linke flache Hand an das recht Ohr, und dann über den Hinterkopf zurück. Du darfst dich nun von mir gestreichelt fühlen. Wink  Und das ist kein Scherz. Ich würde dich knuddeln wenn du hier wärst und es kein Corona gäbe. Daumenhoch


Gruß

   Pucki
Zitieren



Möglicherweise verwandte Themen...
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Objekt verschieben Karthagos 2 253 03.05.2021, 12:38
Letzter Beitrag: Karthagos
  Objekt Anordnung / Abstand corely 1 210 25.04.2021, 14:05
Letzter Beitrag: Piet
  Objekt "durchscheinend" abru 4 304 25.03.2021, 19:04
Letzter Beitrag: abru
  x8: Dokumentgröße an Objekt anpassen mtemp 3 984 11.03.2021, 02:07
Letzter Beitrag: mtemp
  Gestrichelte Linie um ein Objekt Holzmichl 4 302 01.02.2021, 17:49
Letzter Beitrag: norre
  Outline um komplexes Objekt Paintinger 9 874 27.02.2020, 14:29
Letzter Beitrag: Piet
  Linie mit Objekt verbinden corely 9 1.394 10.07.2019, 17:52
Letzter Beitrag: corely
  Objekt vom Hintergrund trennen Olli111 21 2.646 06.03.2019, 19:00
Letzter Beitrag: Olli111
  Ansichten im Objekt-Manager Karthagos 4 1.036 14.12.2018, 13:18
Letzter Beitrag: Karthagos
  Objekt in Kontur umwandeln (ich kann die Farbe nicht ändern) Roelli 1 751 25.11.2018, 18:03
Letzter Beitrag: norre