Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1708to1712
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

Schleife mit Call einer Untersub

Schleife mit Call einer Untersub
07.09.2019 12:06:38
Raphael
Hallo zusammen,
ich versuche eine Schleife zu basteln die eine Untersub aufruft.
In der Untersub werden verschiedene Rechtecke angeordnet. Diese Anordnung möchte ich in der Schleiefe wiederholen.
Allerdinge erreiche ich nur unterschiedliche Fehlermeldungen wie Syntaxfehler oder auch "Erwartet benannte Parameter" :(
Die Fehler kommen immer in der Zeile ab set. Ich denke die Anweisungen in der Klammer ab dem Ausdruck "Left" sind soweit ok

Dim object As Integer
Dim objShapeMF As Integer 'shape
Dim lngIndex1MF As Long, lngIndex2MF As Long
Dim sngWidthMF As Single, sngHeightMF As Single
Dim sngLeftMF As Single, sngTopMF As Single
Dim sngDistanceMFr As Single
Dim sngDistanceMFc As Single
Dim looprowMF As Single
Dim loopcolumnMF As Single
sngWidthMF = Cells(47, 90).Value
sngHeightMF = Cells(47, 92).Value
sngLeftMF = Cells(47, 86).Value
sngTopMF = Cells(47, 88).Value
sngDistanceMFr = Cells(47, 94).Value
sngDistanceMFc = Cells(47, 97).Value
looprowMF = Cells(47, 95).Value
loopcolumnMF = Cells(47, 98).Value
'Panels in Manufacturerpanel mit Schleife
'Ab hier wird das Panel wiederholt
'Die notwendigen Daten werden aus dem Reiter Panel in den Reiter Manufacturerpanel gespiegelt,   _
_
_
der Startpunkt des ersten Panels wird dazu neu berechnet
For lngIndex1MF = 0 To loopcolumnMF
For lngIndex2MF = 0 To looprowMF
Set objShapeMF = ActiveSheet.Shapes.AddShape(Type:=objShapeMF, Call  _
Panels2Manufacturerpanel, _
Left:=sngLeftMF + sngWidthMF * lngIndex2MF + sngDistanceMFr * lngIndex2MF, _
Top:=sngTopMF + sngHeightMF * lngIndex1MF + sngDistanceMFc * lngIndex1MF, _
Width:=sngWidthMF, Height:=sngHeightMF)
Next
Next

Wie muss die Schleife gestaltet werden das die Untersub entsprechend oft durchlaufen wird?
Danke schon mal
Gruß
Raphael

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schleife mit Call einer Untersub
07.09.2019 12:36:59
Nepumuk
Hallo Raphael,
du kannst in der Methode AddShape keine Prozedur aufrufen, außer es wäre eine Function welche einen entsprechenden Wert zurück gibt. Zudem muss objShapeMF als Shape deklariert sein.
Mehr kann ich nicht schreiben da ich deine Sub-Prozedur nicht kenne und auch die Werte die du in die Variablen schreibst.
Gruß
Nepumuk
AW: Schleife mit Call einer Untersub
07.09.2019 12:46:06
fcs
Hallo Raphael,
der Teil "Call _
Panels2Manufacturerpanel," passt hier nicht mitten in die Set-Anweisung.
Der gehört woanders hin - wo ? evtl unterhalb deiner set-Anweisung, die ein Shape einfügt.
Ohne eine Beispiel-Datei mit den relevanten Teilen kann ich da nichts zu sagen.
LG
Franz
Anzeige
AW: Schleife mit Call einer Untersub
07.09.2019 15:34:58
Raphael
Hallo,
stimmt ohne Code kann man nicht viel über den Code sagen ;)
Ich hab eine Beispielmappe angehängt. Da steht auch die Untersub drin.
Es wird beim Ablauf ein Array der shapes eingefügt, nicht aber die Schleife mit noch einemal einer Spalte und 2 Zeilen des Array, also insgesamt 6x das bereits eingefügte.
https://www.herber.de/bbs/user/131901.xlsm
Danke schon mal im Voraus für die Unterstützung
Raphael
AW: Schleife mit Call einer Untersub
07.09.2019 15:59:11
Nepumuk
Hallo Raphael,
in der Sub-Prozedur werden ja auch nur Shapes eingefügt. Wenn du diese in einer Schleife aufrufst liegen alle darin erzeugten Shapes übereinander. Das macht doch keinen Sinn.
Gruß
Nepumuk
P.S.: Es hat mich geschlagene 30 Sekunden gekostet den Kennwortschutz deines VBA-Projektes aufzuheben.
Anzeige
AW: Schleife mit Call einer Untersub
07.09.2019 16:00:02
Nepumuk
Hallo Raphael,
in der Sub-Prozedur werden ja auch nur Shapes eingefügt. Wenn du diese in einer Schleife aufrufst liegen alle darin erzeugten Shapes übereinander. Das macht doch keinen Sinn.
Gruß
Nepumuk
P.S.: Es hat mich geschlagene 30 Sekunden gekostet den Kennwortschutz deines VBA-Projektes aufzuheben.
AW: Schleife mit Call einer Untersub
07.09.2019 16:29:15
Raphael
Hallo Nepumuk,
PW 30 sek... dann bringt das alles nichts :)
Ja den Code zum anzeigen der einzelnen shapes habe ich von dir, das läuft auch prima.
Ich wollte genau die Anordnung in dem angehängten Beispiel in 2 Spalten und 3 Reihen.
Von der Logik her dachte ich es wäre einfacher die gesamte Prozedur, die ja funktioniert, als Untersub in einer neuen Schleife ablaufen zu lassen. Die Startpunkte sind dabei in Zeile 47 ab der Zelle CB47 angegeben.
Wenn es aber mehr Sinn macht nicht mit Call die Untersub aufzurufen und die einzelnen Arrays der shapes direkt in eine Schleife einzubinden wäre das auch ok.
Gruß
Raphael
Anzeige
AW: Schleife mit Call einer Untersub
07.09.2019 16:30:19
Raphael
... und wieder den Haken bei offen vergessen :)
AW: Schleife mit Call einer Untersub
07.09.2019 17:15:05
Piet
Hallo Raphael
ich weiss nicht ob dir mein Hinweis weiterhilft, würde mich freuen.
GoSub Programme sind, wie der Name sagt, Unterprogramme und müssen IMMER mit Return beendet werden. Somit steht zum Schluss "End Sub", du musst aber schon vorher mit "Exit Sub" das Hauptprogramm beenden. Üblicherweise steht das GoSub Programm hinter dem Hauptprogramm, kehrt durch Return zurück!
Vor dem GoSub Aufruf legt man die Daten fest die in GoSub verarbeitet werden sollen, siehe mein kleines Beispiel. Mehr kann ich dazu nicht sagen, denn dein Code ist sehr komplex. Würde mich freuen wenn es dir weiterhilft.
mfg Piet
           Dim objShapeMF As Integer 'shape
Dim lngIndex1MF As Long, lngIndex2MF As Long
Dim sngWidthMF As Single, sngHeightMF As Single
Dim sngLeftMF As Single, sngTopMF As Single
Dim sngDistanceMFr As Single
Dim sngDistanceMFc As Single
Dim looprowMF As Single
Dim loopcolumnMF As Single
'First Daten für 1. GoSub Aufruf laden
sngWidthMF = Cells(47, 90).Value
sngHeightMF = Cells(47, 92).Value
sngLeftMF = Cells(47, 86).Value
sngTopMF = Cells(47, 88).Value
sngDistanceMFr = Cells(47, 94).Value
sngDistanceMFc = Cells(47, 97).Value
looprowMF = Cells(47, 95).Value
loopcolumnMF = Cells(47, 98).Value
Call Panel    'GoSub aufrufen
'Neue Daten für naechsten GoSub Aufruf laden
sngWidthMF = Cells(48, 90).Value
sngHeightMF = Cells(48, 92).Value
sngLeftMF = Cells(48, 86).Value
sngTopMF = Cells(48, 88).Value
sngDistanceMFr = Cells(48, 94).Value
sngDistanceMFc = Cells(48, 97).Value
looprowMF = Cells(48, 95).Value
loopcolumnMF = Cells(48, 98).Value
'usw.
Exit Sub
'Panels in Manufacturerpanel mit Schleife
'Ab hier wird das Panel wiederholt
'Die notwendigen Daten werden aus dem Reiter Panel in den Reiter Manufacturerpanel  _
gespiegelt, _
'der Startpunkt des ersten Panels wird dazu neu berechnet
Panel:
For lngIndex1MF = 0 To loopcolumnMF
For lngIndex2MF = 0 To looprowMF
Set objShapeMF = ActiveSheet.Shapes.AddShape(Type:=objShapeMF, _
Left:=sngLeftMF + sngWidthMF * lngIndex2MF + sngDistanceMFr *  _
lngIndex2MF, _
Top:=sngTopMF + sngHeightMF * lngIndex1MF + sngDistanceMFc * lngIndex1MF, _
_
Width:=sngWidthMF, Height:=sngHeightMF)
Next
Next
Return
End Sub

Anzeige
AW: Schleife mit Call einer Untersub
07.09.2019 17:59:41
Piet
Nachtrag - Fehler von mir!!!
bitte NICHT Call verwenden, sondern GoSub Panel - bei Call gibt es ja keinen Return Befehl!!
mfg Piet
AW: Schleife mit Call einer Untersub
08.09.2019 14:58:16
Hajo_Zi
Hallo Piet,
lasse den Fragesteller entscheiden ob offen.
Es ist heute nicht mehr üblich eine Rückmeldung zu geben und so ist der Beitrag über 6 Tage offen.
Das ist nur meine Meinung zu dem Thema.

..deine Meinung-wen juckt das ?
08.09.2019 16:21:58
robert
AW: Schleife mit Call einer Untersub -> offen
08.09.2019 17:07:28
Raphael
offen, weil ich auch ein wenig Zeit brauche die hilfreichen Tipps hier in das Original einzubauen.
Ich bin sehr froh das hier für mich wildfremde Menschen meist in sehr kurzer Zeit Hilfestellung geben. Und ja, Rückmeldungen sind heute nicht mehr üblich, ich versuche auch hier ein wenig gegen den Mainstream zu arbeiten.
Allen ein schönes regenerisches Wochenende
Raphael
Anzeige
AW: Schleife mit Call einer Untersub
08.09.2019 17:00:14
Raphael
Hallo Piet
hab das mit GoSub probiert und es funktioniert .... fast :(
Die Schleife läuft durch und fügt alle shapes der Untersub ein, aber alle an der selben Stelle, also alle übereinander (die shapes kann man verschieben). Am lezten shape bleibt er aber dann wohl hängen da dieses shape aktiv bleibt.

Set objShapeMF = ActiveSheet.Shapes.AddShape(Type:=Panels2Manufacturerpanel, _
Left:=sngLeftMF + sngWidthMF * lngIndex2MF + sngDistanceMFr * lngIndex2MF, _
Top:=sngTopMF + sngHeightMF * lngIndex1MF + sngDistanceMFc * lngIndex1MF, _
Width:=sngWidthMF, Height:=sngHeightMF)
der ganze Set Block wird dann im Debugg modus gelb markiert, der gelbe Pfeil zeigt auf die letzte Zeile davon mit der Fehlermeldung:
Laufzeitfehler 13
Typen unverträglich
Kann es sein das durch den Aufruf mit GoSub zwar schön die Untersub aufgerufen und durchlaufen wird, aber der Abschluss nicht stimmt weil ja das letzte shape aktiv bleibt?
Und da ja die UnterSub immer durchlaufen wird will der code wohl alle shapes an der gelichen Stelle einfügen, wobei das ja über den setBlock eigentlich weiter berechnet wird?
https://www.herber.de/bbs/user/131912.xlsm
Danke und Gruß
Raphael
Anzeige
AW: Schleife mit Call einer Untersub
09.09.2019 07:25:48
Piet
Hallo Raphael
ich hab mir das Beispiel herunter geladen, das Programm ist aber dermassen lang, und so komplex, das ich absolut keinen Durchblick habe was es macht? Oder machen soll?
Mir fiel auf das der GoSub Befehl innerhalb der For Next Schleife ist. So war das von mir nicht gedacht. Er bewirkt aber einen interessanten Effekt. Er überspringt zuerst mal den Set Befehl der danach kommt, lauwft dann in eine Fehlermeldung. Ich konnte aber nicht herausfinden warum?
Mir fiel auf das auch Panels erzeugt werden auch ohne diesen Set Befehl. Was passiert wenn man GoSub und den Set Befehl weg laesst? Ist das Panel dann unvollstaendig? Und wenn es unkorrekt ist, wie müsste die fertige Version dann aussehen? Das kann ich bei der Menge an Set Codes leider nicht nachvollziehen.
mfg Piet
Anzeige
AW: Schleife mit Call einer Untersub
09.09.2019 16:41:57
Raphael
Hallo Piet,
vieln Dank schon mal fürs probieren. Auf die Idee den Set Block wegzulassen bin ich noch gar nicht gekommen.
Die Untersub die mit Gosub aufgerufen wird erzeugt ein Array von grünen shapes, in der Beispielmappe sollte das Array drin sein. Ich habs mal grob so hingeschoben wies aussehen soll. (Kann man hier Bilder hochladen?)Das bedeutet die Untersub funktioniert soweit (Danke auch an Nepumuk dafür). In der Datei werden dazu die Startpunkte oben links zu jedem shape berechnet, in der Besipilemappe aber durch fixe Werte ersetzt.
Mit dem Setblock wollte ich erreichen das genau dieses Array mehrmals nebeneinander und untereinander eingefügt wird. Das mehrmals funktioniert, mann kann das hellgrüne shape wegziehen, dann erscheint dasselbe dahinter, so wie jetzt in der Beispiuelmappe. In Summe in der richtigen Anzahl, nur eben übereinander.
Und genau das ist mein Knackpunkt. Ich kenne dazu VBA zu wenig, ich beschäftige mich ddamit seit 2 Monaten und einem VBA Grundkurs :)
Der Setblock sollte also die Abstände berechnen, innerhalb des Array funktioniert es ja schon, nur eben das Array mehrmals neben- und untereinander noch nciht. Ich denke es liegt an den mir nicht bekannten eBefehlen die im Setblock rein müssen

Set objShapeMF = ActiveSheet.Shapes.AddShape(Type:=Panels2Manufacturerpanel, _
Left:=sngLeftMF + sngWidthMF * lngIndex2MF + sngDistanceMFr * lngIndex2MF, _
Top:=sngTopMF + sngHeightMF * lngIndex1MF + sngDistanceMFc * lngIndex1MF, _
Width:=sngWidthMF, Height:=sngHeightMF)
https://www.herber.de/bbs/user/131934.xlsm
Danke und Gruß
Raphael
Anzeige
AW: Schleife mit Call einer Untersub
09.09.2019 17:05:01
Piet
Hallo Raphael
ohne den Code noch weiter untersucht zu haben ist mir am neuen Beispiel was interessantes aufgefallen!
Das 1. Panel wird akkurat sauber erstellt, man sieht auch dünne schwarze Linien zwischen den einzelnen Rechtecken, 6 Stück, im grösseren Rahmen!
Im Block daneben kommen die Rechtecke übereinander, erkennbar an grünen Schatten und Linien. Kann man nicht den gesamten 1. Block kopieren und nach Rechts bzw. nach unten kopieren. Ist das nicht einfacher zu lösen?
Kam mir gerade so als spontane Idee. Was sagt du dazu?
mfg Piet
AW: Schleife mit Call einer Untersub
09.09.2019 18:31:38
Raphael
Hallo Piet,
das erste Array kommt sauber, die anderen habe ich manuell hingeschoben, deshalb sind die nicht so schön ordentlich angeordnet :(
Vorab, in der Originaldatei wird NUR das Array in einem separaten Tabellenblatt gebildet, das funktioniert bereits super. Der Code der Untersub im Beispiel ist eine Kopie davon.
Dann war es auch eine Idee dieses Array einfach ein Bild davon zu machen und als komplettes Bild einzufügen in das Manufacturerpanel, dabei geht mir aber der Startpunkt oben links verloren, zumindest kenne ich nicht wie man Konturgenau so ein Bild in VBA erstellen kann, dann gabs immer einen unschönen weißen Rand, da der CopyBefehl von Zellen abhängig ist.
Ein weiterer Gedanke war das OriginalArray zu kopieren. Ich habs zwar kopieren können, dann fehlte mir aber auch wieder der Startpunkt oben links.
Und dann eben noch die Schleife die ich mit meinen wenigen Kenntnissen in VBA einfach nicht hinbekomme. Deshalb dachte ich, was schon funktioniert, nämlich das Array, dieses einfach mehrmals als Schleife einzubinden über eine Schleife die mit CALL, RUN oder dein Vorschlag mit GOSUB den vorhandenen Code aufruft.
Gruß
Raphael
Anzeige
AW: Schleife mit Call einer Untersub-Nachtrag
09.09.2019 18:47:28
Raphael
Hallo Piet,
das die Arrays immer auf der selben Stelle erscheinen ist glaube ich deswegen weil ja die Untersub immer die Daten wie Startpunkt oben links, Größe des shapes usw aus der selben Zelle der Deklaration holt.
Durch den SETBLOCK wollte ich den Versatz erreichen.
In der Zeile 47 berechne ich wo die weiteren Arrays hin sollen also z. B. den Abstand zueinander bezogen auf die Startpunkte und die Anzahl an loops die in der Schleife ausgeführt werden sollen. In dem Besipielo also einmal eine zusätzliche Spalte bilden und zwei zusätzliche Reihen.
Gruß
Raphael
AW: Schleife mit Call einer Untersub-Nachtrag
11.09.2019 19:07:32
Raphael
Hallo alle,
falls doch noch jemand eine zündende Idee hat, ich werde nicht gleich Antworten können, da ich für 4Wochen beruflich ins Ausland darf :)
Allen eine schöne Post-Urlaubszeit
Gruß
Raphael
AW: 2 Tage kein Internet - Strassenbauarbeiten ..
12.09.2019 18:41:42
Piet
Hallp Raphael
Sorry das ich dir nicht antworten konnte, lag nicht an mir. Hier ist zur Zeit ohne Vorwarnung Strom, Wasser, Internet weg wegen mehreren Bauarbeiten.
Hatte 2 Tage lang kein Internet .... Weiss nie wann es wieder da ist?
https://www.herber.de/bbs/user/132009.xls - 131934 Schleife mit Call Untersub - Excel 7
https://www.herber.de/bbs/user/132010.xlsm - 131934 Schleife mit Call einer Untersub 2
Des Ratsel Lösung und ein Lösungsmöglichkeit findest du in einer uralten Excel 7 Datei! - Ist nur eine Demo Datei! - Dort findest du ein abgespecktes Makro für Rechtecke , wo ich den Wert für Top und Left nach vielem Experimentieren so korrigiert habe das man gleiche Abstaende hin bekommt. Schau es dir bitte selbst an.
Fehler in Set Anweisung:
İn deinem Code ist ein massgeblichr Fehlr in diesem Teil zu finden: - ' Set objShapeMF = ActiveSheet.Shapes.AddShape(Type:=Panels2Manufacturerpanel, _
Excel erwartet dort einen Objekttyp wie: Rechteck, Oval usw., aber KEINE Sprungadresse für GoSub Programm. Das klappt so nicht! Laesst man deisen Set Teil weg kann man auf GoSub verzichten, das Programm funktioniert auch über die For Next Schleifen.
Cosde von Nepumuk:
Aus einem mir nicht ersichtlichen Grund hat Nepumuk in seinem Programm den Versatz von Left und Top nicht berücksichtigt? Sein Code ist so kompliziert das ich da weder durchblicke, noch in aendern kann. Mein Vorschlag ist überall da wo Top und Left steht zu versuchen mit dem Vorschlag aus der Excel 7 Datei die Variablen für Top und Left durch meine Korrektur Formeln zu ersetzen. In der Hoffnung dann klappt es.
Das zweite Beispiel enthaelt einen Code von mir zum Objekte auflisten! Es werden 160 Objekte erstellt. Dabei fiel mir auf, ist zu sehen, das manche Objekte die Grösse 0 besitzen. Wofür die gut sind, warum sie auf Null stehen, ist mir zu hoch.
Ich gebe zu das ich an das Wissen und Können von Nepumuk nicht heran komme, deshalb kann ich seinen Code nicht aendern. Vielleicht helfen meine Erkenntnisse trotzdem weiter das Problem zu lösen. Von meiner Seite kann ich leider nicht mehr tun! - Mein Internet Problem ist ein andres Thema ....
mfg Piet
AW: 2 Tage kein Internet - Strassenbauarbeiten ..
12.09.2019 18:47:29
Piet
Nachtrag
bei Left und Top Korrekturen bitte darauf achten das man die richtigen Variable Namen für - Top, Left, Height und Widht verwendet.
Diese Variable Namen sind bei jedem Objekt anders!
mfg Piet
AW: 2 Tage kein Internet - Strassenbauarbeiten ..
13.09.2019 10:00:40
Raphael
Hallo Piet,
Danke für die Infos, die werde ich mitnehmen, ob ich gleich dazu komme weiß ich noch nicht, da ich nun 4 Wochen ausser Landes bin ab heute.
Der Code von Nepumuk funktioniert für mein Projekt sehrt gut, die BErechnungen die er mir gegeben hat sind für mich soweit plausibel, auch den Versatz.
Danke das du dich diesem Problem angenommen hast.
Gruß
Raphael

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige