VBA, Fragen dazu
#11
Hallo Olaf,

ich habe mir die Datei heruntergeladen, das VBA-Projekt ist dabei!

In der VarINI() sollte die Globale Variable „Breit“ mit der Eigenschaft „SizeWidth“ initialisiert werden, nicht mit „SizeHeight“.

Code:
'die Globalen Variablen mit Werten füllen
   
   Hoch = oScheibe.SizeHeight
   Breit = oScheibe.SizeWidth ' geändert von SizeHeight auf SizeWidth
   DRHoch = oDurchreiche.SizeHeight
   DRBreit = oDurchreiche.SizeWidth

Die Eigenschaft „MaxLength“ der Textfelder würde ich schon bei der Initialisierung des Dialogs festlegen, nicht erst bei der Aktivierung. Dazu müsstest Du die Prozedur „UserForm_Initialize()“ anlegen.

Code:
Private Sub UserForm_Initialize()
   TextBox1.MaxLength = 3
   TextBox2.MaxLength = 3
   TextBox3.MaxLength = 3
   TextBox4.MaxLength = 3
   TextBox5.MaxLength = 10
   TextBox6.MaxLength = 5
End Sub

Wenn Du die Eigenschaft schon beim Einfügen der Textboxen in den Dialog im Eigenschaftsfenster festlegst, brauchst Du gar keinen Code zu schreiben. Die  Prozedur „UserForm_Initialize()“ könntest Du Dir dann also sparen:
[Bild: zwischenablage01yvk55.jpg]


Die Eigenschaften „Value“ und „Text“ der Textfelder verweisen auf den identischen Inhalt.

mit dem Befehl TextBox1.Value = 1 überschreibst Du also den Inhalt, der vorher mit TextBox1.Text = GText(Breit) festgelegt wurde. Wenn ich diese Überschreibungen auskommentiere, funktioniert der Dialog.

Code:
Private Sub UserForm_Activate() 'Textfelder beim aktivieren des Dialogs belegen

   TextBox1.Text = GText(Breit)
   TextBox2.Text = GText(Hoch)
   TextBox3.Text = GText(DRBreit)
   TextBox4.Text = GText(DRHoch)
   TextBox5.Text = GText(Dateiname)
   TextBox6.Text = GText(Anzahl)

   'den Text in Textbox1 auswählen
   TextBox1.SelStart = 0
   TextBox1.SelLength = 100

'    TextBox1.Value = 1
'    TextBox2.Value = 1
'    TextBox3.Value = 1
'    TextBox4.Value = 1
'    TextBox5.Value = 1
'    TextBox6.Value = 1
'
End Sub


Auch ich wünsche Dir ein schönes Wochenende.

Gruß

Koter
[-] 1 Benutzer bedankt sich bei koter für diesen Beitrag:
  • Olaf
Zitieren
#12
Nachtrag:
Die Sub „DeckelPlatzieren()“ steht im Modul „ThisDocument“ und wird vom Ereignis „SelectionChange()“ aufgerufen.
Ich würde das Ereignis in diesem Projekt nicht verwenden. Die Ereignisse des Dialogs reichen aus, um die Prozeduren des Projekts auszuführen.
Im aktuellen Entwicklungsstadium des Projekts, ist das einzige sinnvoll einzusetzende Dokument-Ereignis das Ereignis „Open()“ um den Dialog zu starten.

Das Ereignis „SelectionChange()“ wird bei jeder Änderung der Auswahl im Dokument abgefeuert. Weil Auswahländerungen oft auftreten, tritt dieses Ereignis oft auf. Auswahländerungen werden aber nicht nur durch den Benutzer ausgelöst, auch Makro-Prozeduren können diese auslösen. Das Ereignis ist also schwer vorherzusagen. Es birgt die Gefahr von Endlosschleifen die CorelDraw einfrieren oder komplett abstürzen lassen können. Auch eine Fehlersuche wird nicht gerade vereinfacht.

[Bild: 179px-L%C3%A4mpel_bw_transparent.png]
Wenn ich das Ganze hier noch einmal so lang und breit in Schulmeister-Manier wiederhole, dann nicht, um Dir auf die Nerven zu gehen (oder höchstens ein kleines Bisschen). Ich halte es aber für nützlich, noch einmal darüber nachzudenken.

Die Sub „DeckelPlatzieren()“ kannst Du ja z.B. in das Plattenmodul verschieben und von der Prozedur „machPlatten()“ ausführen lassen.

Code:
Sub machPlatten()
   If Not Dialog1.Visible Then Exit Sub ' nicht ausführen wenn der Dialog nicht sichtbar ist
   
   Call machDeckelPlatte 'Die Scheibe ändern
   Call DeckelPlatzieren
   
End Sub



Gruß

Koter
Zitieren
#13
Hallo Koter,

vielen Dank. Das Problem ist wahrscheinlich das ich Deinen Code verwendet habe, der teilweise auch aus mindestens 2 Dateien von Dir stammt und den zusammengewürfelt habe und zusätzlich auch noch etwas ergänzt habe. Das ganze dann mit zu wenig Wissen von mir.......

Ich versteh mitlerweile ein bisschen vom Code aber immer noch viel zu wenig.

Ich gehe den Code nochmal Stück für Stück durch anhand der von Dir genannten Fehler.

Vielen Dank und eine schöne Woche.

Gruß

Olaf

Betriebssystem / Grafik-Software: Corel Draw GS SE 2018
Zitieren
#14
Achso, wegen der Schulmeister-Manier..... Das finde ich genau richtig.

Mir fehlt ja definitv einfach ganz ganz viel Grundwissen und da bin ich wirklich für jede Hilfe und jeden Fehler der gefunden wird sehr dankbar.

Betriebssystem / Grafik-Software: Corel Draw GS SE 2018
Zitieren
#15
Hallo Koter,

ich habe nun alles, wie von Dir beschrieben, umgestellt. Es funktioniert hervorragend, vielen Dank. Nun werde ich in der nächsten Woche an die große Datei gehen und schauen ob ich alles verstehe. Der Code in der "Baustelle" ist für mich tatsächlich sehr schwierig zu verstehen aber ich bleibe am Ball.

Vielen Dank und vorab schonmal ein schönes Wochenende.

Gruß

Olaf

Betriebssystem / Grafik-Software: Corel Draw GS SE 2018
Zitieren
#16
Hallo Olaf,

in der Baustelle sind die Prozeduren zum Speichern für X7 und zum platzieren. Die auskommentierten Teile habe ich nur zum Testen und zum Erstellen der Fixpunkte aus den roten Linien verwendet (das war mir per Hand zu mühsam).

Die Datei habe ich Dir auf diese Frage hin geschickt:

(18.09.2020, 11:01)Olaf schrieb: ...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....

Mein Vorschlag zur Lösung dieser Aufgabe steht im Dialog-Modul in der Prozedur „CommandButton1_Click()“.
Die erste Unterscheidung benutzt „If Then“, danach folgt „Select Case“.

Der Programmablaufplan der Prozedur sieht so aus:
[Bild: pap-dialogbuttonohjjg.jpg]
Die Prozedur „platzieren“ in der Baustelle habe ich nur zum Testen der Prozedur „CommandButton1_Click()“ gebraucht. Ich hatte angenommen, dass Du dazu Deine eigenen Prozeduren schreiben wolltest.
Du kannst natürlich auch diese Prozedur verwenden.

Durch Deine gut konstruierte Namenskonvention bei den Vorlagen, konnte ich mir die Prozeduren für jede Vorlage sparen und alles von einer Prozedur erledigen lassen. Ein paar kleine Fehler haben sich aber bei den Namen in der Zeichnung eingeschlichen. Ich habe sie jetzt nicht so schnell wiedergefunden, aber ich glaube einige Namen sind doppelt vergeben. Wenn Du das berichtigst, sollte die Prozedur wie geplant funktionieren.

Der Prozedur wird als Argument eine Zeichenfolge von der „CommandButton1_Click()“ übergeben.
Das Argument wird mit den Namen der Objekte in der Zeichnung durch Befehle für Zeichenfolgen abgeglichen, um die richtige Vorlage auszuwählen. Zur Zerlegung von Zeichenfolgen an Leerzeichen wird die Funktion „Split()“ verwendet, die ein Datenfeld erzeugt.

Der Programmablaufplan der Prozedur sieht so aus:
[Bild: pap-platziereni7jyw.jpg]
Das Setzen von Koordinaten ist im PAP nicht genau beschrieben. Eigenschaften wie „TopY“ oder „CenterX“ hast Du ja schon öfter verwendet.

Wenn Du einen Abschnitt im Code genauer untersuchen willst, kannst Du auch Haltepunkte oder den Befehl „Stop“ verwenden:

[Bild: debug31jdr.gif]

Variableninhalte kannst Du beobachten, wenn Du Überwachungsausdrücke anlegst oder sie im Direktbereich mit „Debug.Print“ ausgeben lässt.

Du kannst vielleicht die Variablennamen noch ändern. Der Name der Variable „s“ ist nicht sehr aussagekräftig. Da hätte ich mir etwas mehr Mühe geben können.

Ein schönes Wochenende!

Gruß

Koter

Nachtrag: Bei den anderen Beiträgen gab es für von der Forums-Software verkleinerte Bilder eine „Click to enlarge“ - Funktion. Das scheint bei neuen Beiträgen nicht mehr zu funktionieren. Ich habe die PAPs als PDF angehängt weil die Bilder zu klein angezeigt werden.


.pdf   PAP-1.pdf (Größe: 34,19 KB / Downloads: 2)
[-] 1 Benutzer bedankt sich bei koter für diesen Beitrag:
  • Olaf
Zitieren
#17
Hallo,

vielleicht kann mir ja jemand bei meinem wahrscheinlich kleinen Problem helfen, ich selbst kriege es nicht gebacken.

Ich möchte nur die Zeichnung aus einer bestimmten Ebene aus Corel Draw Speichern und nicht das ganze Document.

Der Code sieht so aus
--------------------------------------------------------------------------------------------------------------------------------
Option Explicit

Sub DateiSpeichern()
    Dim SaveOptions As StructSaveAsOptions
    Dim Pfad As String
    Dim Dateiendung1 As String
    Dim Dateiendung2 As String
    
    Set SaveOptions = CreateStructSaveAsOptions

    Pfad = "\\hb-dc01\work\Hauptordner_FERTIGUNG\_3_LASER\Sonderanfertigung\"
    Dateiendung1 = "AF_Stck_"
    Dateiendung2 = ".dxf"

    With SaveOptions
        .EmbedVBAProject = True
        .Filter = cdrDXF
        .IncludeCMXData = False
        .EmbedICCProfile = False
        .Version = cdrVersion20
        .Range = cdrAllPages
        .Overwrite = True
        .KeepAppearance = True
    End With

    ActiveDocument.SaveAsCopy Pfad & Dateiname & Dateiendung1 & Anzahl & Dateiendung2, SaveOptions
End Sub
-----------------------------------------------------------------------------------------------------------------------------------------
Ich bin mir relativ sicher das ich an der rot markierten Stelle die Ebene bestimmen muss, habe aber diverse Möglichkeiten probiert und es funktioniert nicht. Ich bin mir nicht sicher ob und wenn ja wie ich die Ebene deklarieren muss, da habe ich auch schon diverse Versuche durch. Die Ebene hat den Namen "Export".

Veilen Dank für die Hilfe.

Gruß

Olaf

Betriebssystem / Grafik-Software: Corel Draw GS SE 2018
Zitieren
#18
nu frag ich aber auch ma..
bin ja immer hin und weg wenn Herr Koter ma wieder Macros raushaut und über vba doziert..
(irgendwann frag ich ihn ob er mir auch n Macro machen kann um ne Flasche Bier zu öffnen
und ich würd mich nich wundern wenn ers könnte....)

aber wenn ich nur etwas bestimmtes im Dokument speichern möchte..
dann markier ich das Objekt/e und klick beim" Speichern unter"" nur markierte Objekte" an
und das wärs.. dafür brauchts doch kein Macro oder sowas???

verwirrt bin

freundlich fragt

Suc
Zitieren
#19
Hallo Suc,

ich bin auch sehr begeistert wie Koter uns bisher geholfen hat, am Anfang habe ich es exakt so gemacht wie Du es
beschrieben hast, wir möchten / müssen das ganze aber ein bisschen automatisieren und vor allem Fehlerfrei hinkriegen.

Wir erstellen Laserteile auf Wunschmaß und die Vorlagen dazu werden mit Corel erstellt.
Bei einem einzelnen Teil wäre das kein Problem, wenn ich das aber jeden Tag ein paar mal machen möchte sieht es schon anders aus.

Beim Starten von Corel  öffnet sich eine Dialogfenster und nur dieses soll unser Mitarbeiter nachher benutzen. Es soll eben möglichst auch gnaz ohne Corel Kenntnisse funktionieren.

Im Dialog befinden sich Textboxen in die verschiedenen Maße, eine Auftragsnummer und eine Stückzahl eingetragen werden. Durch Command Buttons werden Teile "skaliert" und positioniert und der nächste Command Button speichert die fertige Laserdatei an der von uns benötigten Stelle.

Und all das funktioniert Mega. Leider benötigen wir mehrere Ebenen für Erklärungen, Vorlagen usw. und nur die Zeichnungen aus einer Ebene sind relevant für den Laser, alles andere wird dafür nicht benötigt.

Daher ist dies für uns tatsächlich sehr  wichtig.

Gruß

Olaf

Betriebssystem / Grafik-Software: Corel Draw GS SE 2018
Zitieren
#20
Hallo Olaf,

da hast Du Dir aber große Mühe mit der Code-Formatierung im Beitrag gegeben!

(26.10.2020, 12:51)Olaf schrieb: ...Ich bin mir relativ sicher das ich an der rot markierten Stelle die Ebene bestimmen mus...

Nein, Du kannst nur das Dokument-Objekt verwenden, andere Objekte stellen keine Methoden zum Speichern oder Exportieren zur Verfügung.

Bei den SaveOptions hast Du aber Einstellungen für CDR-Dateien gewählt. Weil als DXF gespeichert wird, ignoriert Corel diese. Als Range hast Du cdrAllPages gewählt, deshalb wird das gesamte Dokument exportiert.
Falls die Variablen „Dateiname“ und „Anzahl“ nicht global sind und von einer anderen Prozedur initialisiert wurden, müsstest Du das in dieser Prozedur noch nachholen.

Ich würde aber nicht speichern sondern exportieren und die Einstellungen für die DXF-Datei im Filter vornehmen:
Code:
Sub ExportDXF()
    Dim expflt As ExportFilter
    Dim l As Layer
    Dim Pfad As String, Dateiname As String
    Dim Anzahl As Integer
        
    For Each l In ActivePage.Layers: l.Printable = False: Next  'Alle Ebenen nicht druckbar schalten
    ActivePage.Layers("Export").Printable = True    'Exportebene druckbar schalten
    Pfad = "\\hb-dc01\work\Hauptordner_FERTIGUNG\_3_LASER\Sonderanfertigung\"
    Anzahl = 2  'Anzahl festlegen
    Dateiname = "Test" 'Dateiname festlegen
    Dateiname = Pfad & Dateiname & Replace("AF_Stck_X.dxf", "X", Anzahl) 'Dateiname vervollständigen und Anzahl einfügen
    
    Set expflt = ActiveDocument.ExportEx(Dateiname, cdrDXF)  'Exportfilter setzen
    With expflt
        .Version = 4 'DXF Version festlegen
        .Units = cdrMillimeter ' Maßeinheit festlegen
        .Finish ' Filter ausführen
    End With
End Sub

Die Prozedur schaltet (die Export-Ebene ausgenommen) alle Ebenen auf nicht druckbar, damit sie nicht exportiert werden.
Du könntest aber auch eine Auswahl erzeugen und nur diese exportieren.

Ich benutze weiterhin das Code-Element der Forums-Software. Ich bin einfach zu faul um alles so schön zu formatieren wie Du.

Gruß

Koter
[-] 1 Benutzer bedankt sich bei koter für diesen Beitrag:
  • Olaf
Zitieren



Möglicherweise verwandte Themen...
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Fragen eines blutigen Anfänger Spiderschweinn 10 1.642 05.04.2016, 20:02
Letzter Beitrag: ensing
  Fragen zu Corel Draw X6 Home & Student RSoutside 31 7.746 01.12.2014, 13:32
Letzter Beitrag: RSoutside
  Wechsel X4 auf X6, Fragen!? TottiSB 3 990 26.07.2012, 12:06
Letzter Beitrag: mvm
  Einige CorelDraw X4 Fragen anorak 4 1.952 04.03.2011, 14:49
Letzter Beitrag: anorak
  Neuling hat Fragen zu Corel Draw Schnittmustererstellung anhand von Bitmap lizardqueen 2 2.097 20.11.2009, 11:43
Letzter Beitrag: skifan
  Fragen zur Schnittmenge Hirs 1 668 18.10.2009, 04:09
Letzter Beitrag: Nachtviole
  allgemeine Fragen zu Corel Draw wolle28071975 2 3.510 17.05.2009, 17:24
Letzter Beitrag: Unkraut