Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
584to588
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
584to588
584to588
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

if...then

if...then
12.03.2005 19:20:12
René
Hallo zusammen
kann mir jemand von Euch helfen und mir sagen, wie ich diese riesengrosse if...then...goto Anweisung vernünftig verkleinern kann? (In der Beispieldatei ist nur ein Teil davon.)
https://www.herber.de/bbs/user/19581.txt
Für Euch Profis sicher etwas einfaches.
Ich Danke Euch schon jetzt für Eure Mühe.
Gruss
René

27
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: if...then
12.03.2005 22:10:15
Ramses
Hallo
Bischen kompliziert, aber ich würde da auf "Select Case" wechseln
Hier ein Beispiel

Sub Demo()
Select Case LArt
Case "A"
wshDr.Delete
wshv.Visible = True
wshv.Copy before:=Sheets(2)
ActiveSheet.Name = "Dr"
wshv.Visible = xlVeryHidden
Call druck_adr_liste(LArt)
Exit Sub
Case "P"
wshDr.Delete
wshv1.Visible = True
wshv1.Copy before:=Sheets(2)
ActiveSheet.Name = "Dr"
wshv1.Visible = xlVeryHidden
Call druck_adr_vs(LArt)
Exit Sub
Case usw
End Select
End Sub

Damit ist der Code zumindest wesentlich übersichtlicher
Gruss Rainer
Anzeige
AW: if...then
12.03.2005 22:19:19
René
Hallo Rainer
danke für Deine Idee. Aber da wird das ganze ja noch viel länger, da ich dann mehrmals den gleichen Code verwenden muss.
Etwa sieben mal den gleichen Code wie wie Du ihn bei "CaseA" hast und erst dann das was Du bei "Case B" hast. Und auch das wieder mehrere Male. Und das ganze weiter über rund 30 Positionen.
Gruss
René
AW: if...then
12.03.2005 22:25:44
Ramses
Hallo
Tut mir leid, da kann ich dir nicht folgen:
Die Select Anweisung macht genau das gleiche wie deine If-Anweisung, mit dem Unterschied, dass die jeweilige Aktion direkt nach dem Entscheid ausgeführt wird.
Ich hatte dir ja geschrieben, kürzer geht es nicht, aber übersichtlicher :-)
Gruss Rainer
Anzeige
AW: if...then
12.03.2005 22:35:25
René
Hallo Rainer,
ich Danke Dir. Dann werd ich wohl der Übersichtichkeit halber die Version mit Case gebrauchen.
Gruss
René
meine Herren, Select Case macht mehr als...
12.03.2005 22:59:31
Luc
ihr euch offensichtlich vorstellen könnt. Es ist natürlich Quatsch, Select Case zu verwenden und dadurch nichts einzusparen ggüber dem vorliegenden Konstrukt. Jede auszuführende Operation wird nur einmal aufgeschrieben (übrigens ohne exit sub, wenn das, was nach end select kommt für alle gilt) und unter Case alle zutreffenden Fälle aufgeführt, z.B. "A" to "Z", 1 to 999 oder hier case "A","P","Neu","In". Das ist ja gerade einer der Vorteile dieser Operation ggüber if...then...else. Alternativ dazu könnte natürlich auch ein Array mit den LArt-Werten und eins mit zugehörigen SprungmarkenreihenfolgeNr angelegt werden, sodass nach entsprechender Auswahl und Zuordnung eine Variable mit der richtigen Reihenfolgenr gefüllt ist, um mit on variable goto sprungmarkenliste das Ganze ebenfalls verkürzen zu können.
Gruß an euch und schönes WE
Luc :-?
Anzeige
AW: meine Herren, Select Case macht mehr als...
12.03.2005 23:03:30
René
Hallo Luc,
wie funktioniert denn das mit dem Array genau?
Gruss
René
AW: meine Herren, Select Case macht mehr als...
12.03.2005 23:06:25
Ramses
Hallo
"...Es ist natürlich Quatsch, Select Case zu verwenden und dadurch nichts einzusparen ggüber dem vorliegenden Konstrukt..."
Dann zeig mir das doch mal :-)
Ich glaube ganz einfach du hast den vorgestellten Code nicht gelesen.
"...Das ist ja gerade einer der Vorteile..."
Du darfst mir glauben, dass ich die Vorteile von "Select Case" kenne
"...Alternativ dazu könnte natürlich auch ein Array mit den LArt-Werten und eins mit zugehörigen SprungmarkenreihenfolgeNr angelegt werden,..."
Das bezeichne ICH als völligen Quatsch, weil sich dadurch der gleiche unübersichtliche "GoTo" Schmarrn ergibt
Gruss Rainer
Anzeige
@Ramses: diesmal zur Sache u. @René
12.03.2005 23:23:13
Luc
nochmal Hallo,
@Ramses:
ist heute wohl nicht dein Tag?! Glaub mir, du antwortest zu viel - macht süchtig! Natürlich hab ich den Code gelesen. Der ist genauso wie man es nicht machen soll. Aber falls du dein Beispiel meinst, da hab ich Zusammenfassungen vermisst. Da ist natürlich klar, dass René dann alles einzeln aufschreiben würde. So etwas sollte man als erfahrener Vielantworter schon bedenken.
@René:
Das hab ich schon befürchtet, dass du danach fragst. Diese Alternative macht es etwas übersichtlicher, ist aber nicht eleganter als die zu bevorzugende Methode mit Select Case (aber mit Zusammenfassungen!). Möglicherweise hättest du mit den Arrays größere Verständnisprobleme. Code könnte ich dir so als Beispiel morgen zukommen lassen, aber wie gesagt - guter Programmierstil ist Select Case, die Array-Methode ist höchstens originelle Individualität.
Grüße
Luc :-?
Anzeige
AW: @Ramses: diesmal zur Sache u. @René
12.03.2005 23:31:50
René
Hallo Luc,
für ein Beispiel wäre ich Dir natürlich sehr dankbar. Man hat ja nie ausgelernt und ich bin noch nicht so versiert in VBA als dass ich für Beispiele Nein sagen würde. Und sei es jetzt ein Beispiel mit dem Array oder dem Select Case mit Zusammenfassung.
Auf jeden Fall schon mal danke schön.
Gruss
René
AW: @Ramses: diesmal zur Sache u. @René
12.03.2005 23:44:15
Ramses
Hallo
kann ja sein dass ich "blind" bin, aber wenn bei JEDER "If"-Anweisung eine andere Datei, kopiert, versteckt und dargestellt wird, dann wird das wohl schwierig das in gesammelte "Case" Anweisung zu packen,... oder sehe ich das falsch.
Du kannst mich ja überzeugen indem du ein solches Beispiel darstellst.
Ich lasse mich gerne überzeugen.
Auch das mit dem Array würde mich stark interessieren. Zeig mal.
Gruss Rainer
Anzeige
AW: @Ramses (und René)
13.03.2005 17:46:40
Luc
Hallo Ramses (und René),
mir war aufgefallen, dass von mehreren LArt-Werten zur gleichen Marke gesprungen wird, wo natürlich auch stets in die gleichen Dateien gespeichert wird. Wenn das in die Select Case Konstruktion eingebunden wird, kann man im Fall der Sprungmarke 1...
Select Case LArt
Case "A", "P", "Neu", "In", "x8"
wshDr.Delete
wshv.Visible = True
wshv.Copy before:=Sheets(2)
ActiveSheet.Name = "Dr"
wshv.Visible = xlVeryHidden
Call druck_adr_liste(LArt)
Case ...
End Select
...schreiben. Alle weiteren Sprungmarkenblöcke werden analog in das Select Case Konstrukt eingebunden. Damit ergeben sich natürlich auch 14 Blöcke. Es entfallen 19 Zeilen Sprungbefehle und leider nur 4x Exit Sub, weil hier, wenn's so richtig ist ab Sprungmarke 5 immer alle nachfolgenden Blöcke mitabgearbeitet werden. Da wäre u.U. eine 2.Select Case Struktur hilfreich - evtl mit bedingten Sprungbefehlen. Darüber und über eine generelle Alternative denke ich noch nach. Dazu dann voraussichtlich morgen mehr.
Noch 'nen schönen Sonntag-Abend
Luc :-?
Anzeige
AW: @Ramses (und René)
13.03.2005 21:19:28
René
Hallo Luc,
damit Du das ganze richtig überschauen kannst, hab ich diesmal den ganzen Code hochgeladen. Du kannst ihn unter dem nachfolgenden Link anschauen.
https://www.herber.de/bbs/user/19612.txt
Danke für Deine Bemühungen
Gruss
René
AW: @Ramses (und René)
13.03.2005 22:24:48
Ramses
Hallo
Schön, sieht besser aus und liest sich besser als nur ein allgemeiner Kommentar :-)
Als Herausforderung:
Ich kenne nur einen einzige Situation, wo ich eine Sprungmarke benötige, und die sehe ich hier im Code nicht :-)
Gruss Rainer
AW: @René (und Rainer)
14.03.2005 20:19:34
Luc
Hallo René (und Ramses),
so, dass beruhigt mich aber, dass die fehlenden exit in deinem Upload wieder auftauchen. Dadurch wird es einfacher. Hier erstmal die Variante mit select case, wobei hier 2 Versionen möglich sind, weil du streng genommen die set-Befehle gar nicht mehr brauchst. Wenn du deshalb d2: bevorzugst, dann das d1-Unterprogramm löschen und d2: in d1: ändern. Im vorderen Teil dann die Befehle um wsh() und sx herum sowie diese Variablen in der Dim-Anweisung ebenfalls löschen. Wenn nicht, dann d2-Unterprog löschen (jeweils von Markenzeile bis einschl. return).

Sub testcopy(LArt As String)     'kann mit Parameter nur von einem Programm aufgeruf wdn
Const sht As String = "Dr SZ B_H L_H Et V V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 P_L"
Dim i As Integer, sx As Integer, sn As Variant, _
wsh() As Worksheet, x As Worksheet
sn = Split(sht, " ")
sx = UBound(sn)
ReDim wsh(sx) As Worksheet
With ActiveWorkbook
For i = 0 To sx
Set wsh(i) = .Sheets(sn(i))
Next i
End With
Application.DisplayAlerts = False
Select Case LArt   'KB/GB beachten, sonst nur LCase(LArt)u.KB or UCase(LArt)u.GB vwd!
Case "A", "EM", "Fa", "FM", "G", "IN", "JM", "Neu", "P"
i = 5
Go

Sub d1
Call druck_adr_liste(LArt)
Case "x2"
i = 6
Go

Sub d1
Call druck_adr_vs(LArt)
Case "Del"
i = 7
Go

Sub d1
Call druck_adr_del(LArt)
Case "x27", "x28", "x29", "x30", "x31"
i = 8
Go

Sub d1
Call druck_fleiss(LArt)
Case "x1"
i = 9
Go

Sub d1
Call druck_auszeichnung_ehrung(LArt)
Case "x24", "x25", "x26"
i = 10
Go

Sub d1
Call druck_anmeld_anlass(LArt)
Case "x22"
i = 11
Go

Sub d1
Call druck_helfer_ausstellung(LArt)
Case "x23"
i = 12
Go

Sub d1
Call druck_helfer_lotto(LArt)
Case "x7"
i = 13
Go

Sub d1
Call druck_geburts_eintrittsdaten(LArt)
Case "x8"
i = 14
Go

Sub d1
Call druck_adr_liste(LArt)
Case "x4"
i = 15
Go

Sub d1
Call druck_liste_beitrag(LArt)
Case "x6"
i = 16
Go

Sub d1
Call druck_adr_parus(LArt)
Case "x5"
i = 17
Go

Sub d1
Call druck_präsenzliste(LArt)   'Namen übprüf, war Fehler, besser ohne Umlaut
Case "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", _
"x20", "x21"
i = 4
Go

Sub d1
Call druck_etikettenliste(LArt)
End Select
Application.DisplayAlerts = True
Exit Sub
d1: wsh(0).Delete
wsh(i).Visible = True
wsh(i).Copy Before:=Sheets(2)
ActiveSheet.Name = sn(0)
wsh(i).Visible = xlVeryHidden
Return
d2: With ActiveWorkbook            'alternativ zu d1, dann können sx u. wsh() entfallen!
.Sheets(sn(0)).Delete
.Sheets(sn(i)).Visible = True
.Sheets(sn(i)).Copy Before:=Sheets(2)
ActiveSheet.Name = sn(0)
.Sheets(sn(i)).Visible = xlVeryHidden
End With
Return
End 

Sub </code>
Hieran ist schon zu sehen, dass man eigentlich auch ohne Select Case auskommen müsste, wenn man nur das Variablenfeld (Array) für die Blattnamen geschickt aufbaut (Reihenfolge der Namen in der zugrundeliegenden Textvariablen), ein Variablenfeld für die LArt analog anlegt und denen ein Feld mit den zugehörigen i-Werten zuordnet. Das würde das Programm noch kürzer machen. Das dann evtl. morgen, falls du nicht selbst probieren oder aber vgl willst.
Gruß Luc :-?

Anzeige
AW: @René (und Rainer) Nachtrag
14.03.2005 20:29:05
Luc
nochmals...
Habe mich eben 'ne ganze Weile mit der automatischen Forumsformatierung rumgeärgert und zum Schluss kam das raus! Naja, besser als zuerst!
Habe noch Folgendes vergessen zu erwähnen:
Die Anlage der Blattnamen in Form eines Strings, der dann in ein Datenfeld umgewandelt wird, hat den Vorteil größerer Transparenz und Pflegeleichtigkeit des Programms. Du brauchst so nur die Stringkonstante zu ändern, wenn sich bei den Blattnamen Änderungen ergeben. Alles weitere richtet sich dann automatisch danach. Im Grunde genommen könnte man diesen String auch als Parameter ans Programm übergeben oder ihn aus einem Hauptblatt auslesen. Dann muss bei Änderungen das Programm gar nicht angefasst wdn.
schönen Abend
Luc :-?
Anzeige
AW: @René (und Rainer)
14.03.2005 21:16:47
René
Hallo Luc,
Danke für diesen Vorschlag. Bin Dir natürlich auch für den kürzeren Vorschalg dankbar. Werd aber selber auch versuchen ob ich's hinkriege. Muss dazu aber sagen, dass ich nicht so ein Profi wie Du bin.
Besten Dank auf jeden Fall mal und dann bis morgen.
Gruss
René
AW: Variante2
15.03.2005 10:58:05
Luc
Hallo René,
zuvor noch ein Nachtrag zu Variante 1: Die automatische Programmcode-Erkennung hat leider den gosub-Befehl zerrissen. Bitte beachte das.
Der folgende Code enthält zusätzliche Kontrollen zur Absicherung gg. Fehler bei evtl Änderungen der Feldvariablen:

Sub testcopy(LArt As String)
Const sht As String = "Dr SZ B_H L_H Et V V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 P_L"
Dim i As Integer, j As Integer, k As Integer, LAw As String, _
lw As Variant, lx As Variant, sn As Variant, x As Worksheet
LAw = "A Del EM Fa FM G IN JM Neu P x1 x2 x4 x5 x6 x7 x8 x9 x10 x11 x12 " & _
"x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31"
lx = Array(5, 7, 5, 5, 5, 5, 5, 5, 5, 5, 9, 6, 15, 17, 16, 13, 14, 4, 4, 4, 4, _
4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 12, 10, 10, 10, 8, 8, 8, 8, 8)
sn = Split(sht, " ")
lw = Split(LAw, " ")
With WorksheetFunction
k = .Min(lx)
If k < 1 Or .Max(lx) > UBound(sn) Or UBound(lw) <> UBound(lx) Then
MsgBox "Programmvariablen unstimmig!", vbCritical + vbOKOnly, _
"Interner Fehler"
Exit Sub
End If
End With
For i = 0 To UBound(lw)
If lw(i) = LArt Then
j = lx(i)
Exit For
End If
Next i
If j = 0 Then Exit Sub
Application.DisplayAlerts = False
With ActiveWorkbook
.Sheets(sn(0)).Delete
.Sheets(sn(j)).Visible = True
.Sheets(sn(j)).Copy Before:=Sheets(2)
ActiveSheet.Name = sn(0)
.Sheets(sn(j)).Visible = xlVeryHidden
End With
On j - k GoTo d1, d2, d3, d4, d5, d6, d7, d8, d9, e0, e1, e2, e3
Call druck_etikettenliste(LArt): GoTo ex
d1: Call druck_adr_liste(LArt): GoTo ex
d2: Call druck_adr_vs(LArt): GoTo ex
d3: Call druck_adr_del(LArt): GoTo ex
d4: Call druck_fleiss(LArt): GoTo ex
d5: Call druck_auszeichnung_ehrung(LArt): GoTo ex
d6: Call druck_anmeld_anlass(LArt): GoTo ex
d7: Call druck_helfer_ausstellung(LArt): GoTo ex
d8: Call druck_helfer_lotto(LArt): GoTo ex
d9: Call druck_geburts_eintrittsdaten(LArt): GoTo ex
e0: Call druck_adr_liste(LArt): GoTo ex
e1: Call druck_liste_beitrag(LArt): GoTo ex
e2: Call druck_adr_parus(LArt): GoTo ex
e3: Call druck_präsenzliste(LArt)
ex: Application.DisplayAlerts = True
End Sub 

Ansonsten gilt auch hier das zu Variante1 und im Nachtrag Gesagte. Nach dem, was du geschrieben hast, gehe ich davon aus, dass du die Befehlsabfolge nachvollziehst. Ich selbst würde auch keine Fremdcodes einsetzen, die ich nicht verstehe.
Gruß Luc
:-?
AW: Variante2
15.03.2005 11:26:42
René
Hallo Luc,
Besten Dank für Deine Mühe.
Es geht mir nicht darum, Fremdcode nicht benutzen wenn ich Ihn nicht verstehe. Aber ich will ja bei dem ganzen auch etwas lernen, damit ich dann bei etwas anderem das auch selber fertig bringe. Deshalb versuche ich ja, das nachzuvollziehen.
Die automatische Programmcode-Erkennung hab ich gar nicht eingesetzt, da ich das nicht kenne. :-(
Auf jeden Fall noch einmal ein Herzliches Danke und sollte Dir noch mehr einfallen, für Anregungen bin ich immer dankbar.
Gruss
René
AW: AutoCodeErkennung
15.03.2005 12:16:53
Luc
Hallo René,
freut mich, dass ich richtig liege mit meiner Einschätzung. Diese Einstellung wird aber offensichtlich immer seltener.
Die automatische Programmcodeerkennung kannst du nicht benutzen, sondern höchstens auslösen. Sie ist (mitunter lästiger) Bestandteil der Forumssoftware. Schreib mal in irgendeinem deiner Postings hier mittendrin das Wort sub mit großem S. Dann kannst du sehen, was die Automatik mit deinem Posting macht.
Gruß Luc :-?
AW: AutoCodeErkennung
15.03.2005 15:58:57
René
Hallo Luc,
Besten Dank für Deine Ausführung.
Und schon hab ich wieder was gelernt! :-)
Und das mit dem lernen ist doch wirklich so. Ein Forum sollte ja dazu da sein um bei einem Problem so zu helfen, dass man es in einem anderen Fall selber lösen kann und dabei etwas lernt. Wenn das aber nicht so ist, kanns man ja zum Beispiel direkt schreiben: "Ich bin zu Faul um was zu lernen, gebt mir bitte die Lösung!" Ist vielleicht ein bisschen krass ausgedrückt, ich weiss, aber wie gesagt, sowas liegt mir nicht.
"Es ist schliesslich noch nie ein Profi vom Himmel gefallen und zum lernen ist es nie zu spät!" sagte schon...
Gruss
René
Ganz in meinem Sinne...! -- owT
15.03.2005 16:04:39
Luc
AW: AutoCodeErkennung
15.03.2005 17:17:35
René
Hallo Luc,
kannst Du mir das folgende ein wenig genauer erklären?
LAw = "A Del EM Fa FM G IN JM Neu P x1 x2 x4 x5 x6 x7 x8 x9 x10 x11 x12 " & _
"x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31"
lx = Array(5, 7, 5, 5, 5, 5, 5, 5, 5, 5, 9, 6, 15, 17, 16, 13, 14, 4, 4, 4, 4, _
4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 12, 10, 10, 10, 8, 8, 8, 8, 8)
On j - k GoTo d1, d2, d3, d4, d5, d6, d7, d8, d9, e0, e1, e2, e3
Vor allem begreife ich nicht ganz, wie Du da auf "d1..." usw kommst.
Danke und Gruss
René
...also doch noch Arbeit, war schon fast weg...
15.03.2005 23:01:16
Luc
...hallo, hallo und gute Nacht René,
in LAw habe ich alle deine mir bekannten FArt-Werte als String zusammengefasst, damit sie sich bei Bedarf leichter ändern lassen. Nichtgenannte Werte (also auch x) wdn nicht berücksichtigt. Leerzeichen ist Trennzeichen (Delimiter) für die Funktion Split(), die daraus dann das Array (Datenfeld) lw macht, das im Folgenden verwendet wird (analog war's bei sht und sn). In lx (gleich als Array geschrieben, um Probleme beim Umwandeln in Integerwerte zu vermeiden) stehen die Positionsnummern (Indizes) der den FArt-Werten zuzuordnenden Blattnamen aus dem Array sn. Das Blatt "Dr" hat z.B. den Index 0, weil es als 1.Wert im Datenfeld sn steht.
Beim letzten Konstrukt handelt es sich um einen bedingten Sprungbefehl. Die Bedingung steht nach dem Schlüsselwort On. Nach Goto wdn dann die einzelnen Sprungmarken aufgeführt. Wenn j-k=0 ist, wird der nächste Befehl genommen, deshalb steht da der Programmaufruf für 4-4=0 (sn(4)="Et") ohne Sprungmarke. Bei allen anderen Werten von j-k wird die dieser Reihenfolgenr entsprechende Sprungmarke ausgewählt und angesprungen. Nach dem Abarbeiten des Call-Befehls wird mit goto ex die Endbehandlung angesprungen (Alarmmeldung wieder eingeschaltet) und das Programm verlassen. Die Namen der Sprungmarken (d1...e3) habe ich frei gewählt, du kannst auch andere nehmen (z.B. deine Zahlen). Ich wollte sie bloß 2stellig haben.
Das mit den bedingten Sprungbefehlen findest du auch in der Editorhilfe unter on oder goto.
Ciao Luc :-?
AW: ...also doch noch Arbeit, war schon fast weg...
16.03.2005 11:57:05
René
Hallo Luc
danke für Deine Ausführungen. So kann ich das ganze noch viel besser nachvollziehen.
Gruss
René
...da hilft man gern - OK & Ciao! -- owT
16.03.2005 12:05:22
Luc
@Ramses (für Rene irrelevant)
12.03.2005 23:10:28
Luc
Hallo Ramses,
meinst du nicht auch, dass mayk immer noch das gleiche Problem (s. OffTopic) hat?
Gruß Luc :-?
Reine Höflichkeit :-) o.T.
12.03.2005 23:12:04
Ramses
...

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige