Anzeige
Archiv - Navigation
1728to1732
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

Programmierregeln

Programmierregeln
18.12.2019 10:28:57
Steve
Moin,
ihr habt mir mittlerweile eine Menge beigebracht, dafür bin ich extrem dankbar. Das half mir viele große und kleinere Probleme in den Griff zu bekommen. Nun stellen sich mir einige Fragen die die Übersichtlichkeit und Ordnung betreffen. Gerne reicht mir hier auch Link zu einer übersichtlichen Seite.
A. Ich habe mehrere Subs die Thematisch zueinander gehören in ein Modul geschrieben. (sind nur Buttons die auf andere Sheets springen lassen.)
- Macht das Sinn oder kann das irgendwann zu Problemen führen bzw.ist das gar ein NoGo.
B. Ich nehme mal an man kann von einem Sub auf ein anderes Verweisen. Wie würde das aussehen?
C. ich empfinde es als sehr unübersichtlich alle Deklarationen und (oje, ich kenne das Fachwort nicht) die Bereiche DIM etc. ganz oben in dem Makro zu schreiben.
Ich sehe zwar den Sinn dahinter (man muss nicht im ganzen Text suchen) aber dafür wird der Bereich für den Laien unübersichtlich.
Hat da jemand ein Tipp wie ein Anfänger da die Übersicht nicht verliert
D. Ich habe gemerkt es gibt gewisse Schreibregeln bzgl. der Übersichtlichkeit. Z.B. das einrücken des Textes.
Hat da jemand Tipps für mich die ich beherzigen sollte.
E. Meine Hauptfrage.
Mich nervt das ich keine Schleifen ohne Hilfe hinbekomme. Hat irgendwer sowas wie eine Übung herumliegen die vielleicht die gängigsten Schleifen enthält und die sich auch testen lässt.
Das sind meine Fragen. Wie gesagt, eine schöne Seite die solche Tipps enthält würde mir ausreichen.
Ich danke euch für eure Hilfe.
Steve

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Programmierregeln
18.12.2019 10:59:17
Martin
Hallo Steve,
zu A:
Auch ich lege die Module thematisch an. Lege die Module so an, dass du (und ggf. andere Anwender) eine gewisse Ordnung im Code erkennen. Wichtig: Bezeichne auch die Module nach Ihrem Thema.
zu B:
Es reicht aus einfach nur die Bezeichnung des Makros hinzuschreiben. Aber zur besseren Übersicht schreibt man noch ein Call davor (z.B. Call Makro1)
zu C:
Wenn du im Code später arbeitest, ist es gut alle deklarierten Variablen auf einen Blick sehen und verstehen zu können. Es wäre unübersichtlich, wenn die Variablen überall verteilt deklariert wären. Zusätzlich solltest du die "Ungarische Notation" anwenden und deine Variablen nach Typ deklarieren.
Beispiel:
Dim strNachname as String
Dim dteBirthday as Date
Dim blnPayed as Boolean
zu D:
Das Einrücken (per Tabulator-Taste) dient der Übersichtlichkeit extrem. Eingerückt wird immer dann, wenn etwas untergeordnet ist. Zum Beispiel bei If-Anweisungen, Select Case-Anweisungen, With-Anweisungen, Do...Loop-Anweisungen (...mehr fallen mir jetzt gerade nicht ein). Also bei allen Anweisungen, die mit einer zweiten Zeile abgeschlossen werden müssen, ist der Text dazwischen einzurücken.
zu E:
Eigentlich finde ich Schleifen sehr einfach (...sorry, ist keine hilfreiche Antwort). Du musste einfach versuchen sie zu verstehen. Es gibt bei einer Schleife immer einen Anfang und ein Ende, die definiert werden müssen. Beispiel:
Sub SchleifeHoch()
Dim i As Integer
For i = 1 To 12
Debug.Print Format(DateSerial(1, i, 1), "MMMM")
Next
End Sub
Sub SchleifeRunter()
Dim i As Integer
For i = 12 To 1 Step -1
Debug.Print Format(DateSerial(1, i, 1), "MMMM")
Next
End Sub
In dieser einfachen Schleife wird die Variable i mit Beginn 1 bis 12 durchlaufen und damit können alle Monate angezeigt werden. Mit Step kannst du die Schrittweise bestimmen (Step ist per Standard 1). Wenn du für Step 2 einsetzt, würde nur jeder zweite Monatsname angezeigt werden. Mit einem Minuszeichen vor dem Step läuft die Schleife rückwärts. Spiele man mit einem Beispiel ein wenig herum.
Viele Grüße
Martin
Anzeige
Programmierregel unter C
18.12.2019 19:18:43
Luc:-?
'NAhmt, Steve (& Martin);
VBA verarbeitet Deklarationen stets als Erstes, egal wo sie im Pgm stehen. Deshalb sollten sie auch stets am PgmAnfang notiert wdn (ist ja auch übersichtlicher). Außerdem gibt's auch noch globale Variablen, die stets an den Anfang nur eines Moduls gehören (auch, wenn sie in mehreren benutzt wdn), denn sie wdn stets als Erste benötigt. In anderen PgmmierSprachen (zB JavaScript) kann es uU günstiger sein, erst unmittelbar vor Erst­Gebrauch der Variablen diese zu deklarieren.
Das gilt auch für Konstanten. Letzteres besonders auch für die bedingter Kompilierung, die man allerdings auch für ein ganzes Projekt als dessen Eigenschaften festlegen kann (bei KennwortVergabe).
Was die Namensbildung von Variablen und Konstanten angeht, hängt das natürlich auch davon ab, ob das Pro­jekt privat oder beruflich ist und letztlich später oder auch von Anfang an auch Andere daran arbeiten könn­ten oder sollen. In Pgmmier-Teams legt man idR zuvor eine einheitliche Namensmethodik fest. Ansonsten gibt es bestimmte allgemeine Profi-Pgmmierer-Gewohnheiten, zB KonstantenNamen in Großbuchstaben zu schrei­ben oder eben die erwähnte UN zu benutzen. Nur hat Martin ausgerechnet die Methode demonstriert, die weder der ursprünglichen Intention des Erfinders der sog Ungarischen Notation entspricht noch sonderlich sinn­voll ist, aber gern zur Irreführung bei Nachnutzung beiträgt. Die Wiederholung des deklarierten DatenTyps als Namenspräfix ist nämlich unsinnig, denn wird der Typ später mal geändert, müssten auch die Vorsilben geändert wdn, was gern vergessen wird. Für eine vereinfachte Deklaration gibt's 2 bessere Methoden, wobei sich die 2. auf den Anfangsbuchstaben des Namens bezieht und deshalb weniger flexibel ist. Wenn schon UN, dann auch im Sinne des Erfinders, der damit den VerwendungsZweck, nicht den DatenTyp kennzeichnete (die von Martin gezeigte Form hatten Win-Pgmmierer aufgebracht, die das UN-Konzept offensichtlich nicht verstan­den hatten). Leider hat sich dann genau diese unsinnige Variante unter VBA-Pgmmierern verbreitet.
Zu E gibt's neben dem bereits Genannten noch die Online-Excel-Seite (Forum gelöscht!) und für Englisch- bzw Niederländisch-Kundige die sehr ausführliche von snb, der mitunter auch hier zugange ist.
Gruß, Luc :-?
„Der beste Beweis für intelligentes Leben im Universum ist, dass noch niemand versucht hat, Kontakt mit uns aufzunehmen.“ H.Lesch, 2018, Sonneberg
Deshalb Intelligenz steigern mit …

Anzeige
AW: Programmierregel unter C
18.12.2019 20:06:10
Daniel
Luc schrieb:
"VBA verarbeitet Deklarationen stets als Erstes, egal wo sie im Pgm stehen. "
nein.
VBA verarbeitet die Deklarationen dann, wenn sie im Code auftauchen.
Verwendet man eine Variable, bevor man die deklariert hat, gibt's die entsprechende Fehlermeldung.
Userbild
Gruß Daniel
Das verursacht die Syntax-Überprüfung, ...
19.12.2019 03:20:07
Luc:-?
…Daniel;
ein Gegenbeweis ist das genauso wenig wie sich in diesem Fall meine Bemerkung beweisen lässt. Gemeint hatte ich ja auch nicht, dass man eine Variable vor ihrer Deklarierung anwenden könnte. Das wäre bei einer reinen Interpreter-Sprache unmöglich und dass war das Ur-BASIC ja mal.
Klären könnte man das evtl mit VBS in einer HTML-Datei, nur akzeptieren die meisten Browser VBS nicht. Und wenn's doch ginge, würde das interpretiert wdn und dann muss die Deklaration stets vor der ErstVerwendung, aber eben an beliebiger Stelle erfolgen - genau wie bei JavaScript. Das hatte ich als selbstverständlich vor­aus­gesetzt… ;-]
Deshalb steht in der VBE-Hilfe zu Dim als Anmerkung wohl auch nur:
Wenn Sie die Dim-Anweisung in einer Prozedur verwenden, wird in der Regel die Dim-Anweisung an den Anfang der Prozedur gesetzt.
Es gibt allerdings diverse Möglichkeiten einer impliziten Deklaration, also ganz ohne eine solche Anweisung.
Luc :-?
Anzeige
Dann solltest du endlich lernen Luc,
19.12.2019 07:05:15
Daniel
Das zu schreiben was du meinst und nicht das Gegenteil von dem.
Nur so als Tip.
Gruß Daniel
Soll ich aufzählen, was du alles "endlich lernen …
20.12.2019 03:13:10
Luc:-?
…solltest", Daniel…‽
Luc :-?
Gerne
20.12.2019 08:13:10
Daniel
Aber zuerst bleiben wir bitte bei dir.
AW: Das verursacht die Syntax-Überprüfung, ...
19.12.2019 07:31:04
Daniel
Luc schrieb:
"Es gibt allerdings diverse Möglichkeiten einer impliziten Deklaration, also ganz ohne eine solche Anweisung.
Luc :-?"
Interessant. Und welche wären das?
Mal abgesehen vom Verzicht auf Option Expicit?
Gruß Daniel
Diese Frage solltest du dir selbst beantworten ...
20.12.2019 03:08:46
Luc:-?
…können, Daniel;
über W'nachten/J'wechsel wäre ja genug Zeit zum Überlegen u.Probieren… :-]
Gruß, Luc :-?
Über Weihnachten hab ich eigentlich besseres zu tu
20.12.2019 08:26:58
Daniel
Außerdem, warum sollte ich versuchen, deine Behauptungen ZZ belegen?
Mir fällt grad nur das weglassen von Option Explicit als indirekte Deklaration ein.
Redim oder die Verwendung von Übine Antwort bitten.ergabeparameter wären ja ebenfalls direkte Deklaration und können von dir nicht gemeint gewesen sein.
Da das Thema bis Silvester wahrscheinlich nicht mehr aktiv ist, würde ich dich jetzt schon um eine Antwort bitten.
Gruß Daniel
Anzeige
AW: Programmierregeln
18.12.2019 11:10:21
Pierre
Hallo Steve,
ich versuche es mal (bitte nicht köpfen, wenn sich eine Antwort als falsch herausstellt ;-) ):
A. Ich weiß das nicht ganz genau, ich persönlich bin eigentlich ein Fan davon, mir für jede "Aktion" bzw. in deinem Fall jeden Button, ein eigenes Modul zu machen. Aber das ist nur meine eigene Meinung dazu.
Wie gesagt, ob das innerhalb eines Moduls zu Problemen führt, kann ich leider nicht sagen.
B. Das geht mit dem Befehl Call deinmakro
C. Ich mache es folgendermaßen von der Aufteilung:

Sub
Dimensionierung
Dimensionierung
Set
Set
Weiterer Code

Also immer alles mit Leerzeilen voneinander getrennt.
Und ich mache es für meine eigene Übersichtlichkeit so, dass ich jede Dimensionierung, die notwendig ist, in eine eigene Zeile schreibe.
D. Hm...also ich schaue, dass ich innerhalb eines Codes weitestgehend jede neue Zeile weiter einrücke und alles, was sozusagen zusammen gehört (Select - End Select, If - End If usw.) schreibe ich untereinander.
als Beispiel:

If Not Intersect(Target, Range("C4:N33")) Is Nothing Then        'Range anpassen
For Each rngC In Intersect(Target, Range("C4:N33"))           'Range anpassen
Select Case True
Case rngC.Value 

Und ein kleiner Tipp, den ich mir auch angewöhnt habe: ich schreibe alles im Code klein, denn wenn du in eine neue Zeile springst, wird die richtige Groß-/Kleinschreibung ergänzt.
E. Da kann ich dir so gerade nicht helfen.
Gruß Pierre
Anzeige
Nachtrag
18.12.2019 11:17:47
Pierre
Sorry, ich wollte noch kurz erklären, wieso ich alles klein schreibe:
Wie gesagt, es wird automatisch richtig geschrieben, wenn du die Zeile verlässt.
So siehst du sofort oder zumindest schneller, wenn du etwas falsch geschrieben hast, denn dann bleibt das Wort klein.
Würdest du selbst auf die Groß-Kleinschreibung achten, würden solche Fehler nicht so schnell auffallen.
Aber es werden sich bestimmt eh noch 2-3 Leute melden ;-)
Gruß Pierre
Meine Meinung zu den Link-Themen, ...
20.12.2019 19:47:45
Luc:-?
…Chris (& Steve):
1. MS hat dazu nicht ohne Grund keine Regelung getroffen. 3 Deklarationsmethoden des Datentyps in VBA sollten ja auch reichen. Was der Link wiedergibt ist genau nicht im Sinne des Erfinders der UN (deshalb erwähnt HWH die wohl auch nicht). (Vgl dazu meine obige Bemerkung!)
2. Sog Spaghetti-Code ist (genau wie damit oft verbundene Kopiererei bei leichter Variation von PgmTeilen) ein „Phänomen“ aus der Anfangszeit moderner Pgm­mierung, das vor allem unorganisierte (zB ohne PAP) Pgm­mierung/er (und Anfänger) betraf. In organisierter Pgm­mierung führt die (gelegentliche) Ver­wendung (un-)be­ding­ter Sprung­Befehle nicht per sé zu Spaghetti-Code, sondern kann notwendige Pgm­Ver­zwei­gungen ein­fa­cher und (durch die Ein­sprung­marken) über­sicht­licher machen, als es eine tiefe Ver­schach­telung vermag. Schließ­lich wdn UPs idR auch durch (un-)bedingte Sprung­Befehle erreicht/bar.
Anders sieht es bei Sprachen aus, die keine SprungBefehle enthalten. Hier muss man ohne diese aus­kom­men, was mit­unter kom­pli­zierte Pgm­Kon­strukte und Kom­pilie­rungen ver­ursacht, wie sie bspw in KI-Sprachen (u.a. PROLOG) üblich sind. Immerhin müssen hier ja ebenfalls Pgm­Ver­zwei­gungen realisiert wdn, d.h., ggf müssen umfang­reiche Pgm­Teile aus­gelassen wdn, weil sie eine voran­gestellte Bedingung nicht erfüllen. Das bleibt genau dann übersichtlich, wenn die Sprache mit vielen vordefinierten Abläufen (aus Pgm­Biblio­theken) arbeitet, die ggf vom Compiler aus dem Pgm­Kontext erschlos­sen wdn können. VBA gehört aber nicht zu die­sen Sprachen, obwohl man so etwas auch hier nach­gestalten könnte. Das ist dann aber kein Fall für einfache Anwendungs­Pgm­mierung mehr, sondern setzt so etwas wie ein über­geord­netes Inter­preter-System voraus.
Gruß & Fro'Weihn', Luc :-?
Anzeige
AW: Meine Meinung zu den Link-Themen, ...
21.12.2019 09:27:12
ChrisL
Hi Luc
Namenskonventionen wollte ich nicht als Religion verstanden haben (ich halte mich selber zu oft nicht daran), aber als Tipp zur besseren Übersichtlichkeit. Eine kurze aber aussagekräftige Variablen-Bezeichnung schadet nicht und den Präfix würde ich einem VBA-Einsteiger u.a. empfehlen, weil es zum bewussten Umgang mit Datentypen zwingt.
Meiner Meinung bringen Konventionen Ordnung rein. Welche Konventionen genau (man darf auch seine eigenen machen) und wie streng man diese anwendet (hängt auch vom Umfang und Komplexität des Codes ab), ist jedem selber überlassen.
Einverstanden, das Thema Spaghetticode ist breiter als Go-To, und Sprungmarken sind nicht per sé böse. Schwer ein für Steve umsetzbarer Tipp daraus abzuleiten z.B. geschichtete Lasagne isst sich einfacher, dafür sind Spaghetti schneller gekocht.
cu & Merry Xmas
Chris
Anzeige
AW: Meine Meinung zu den Link-Themen, ...
21.12.2019 10:38:25
Steve
Moin Leute,
Ich habe eure Ausführungen mit Interesse verfolgt. Ich sehe schon, viele Wege führen nach Rom. Das eine oder andere habe ich noch an anderer Stelle nachgelesen. Vor allem die Warnung vor dem Spaghettimonster, denn ich wäre wahrscheinlich ein Kandidat für sowas.
Ich versuche aus euren Anmerkungen, eurer Diskussion und euren Tipps das für mich umsetzbare umzusetzen.
Tatsächlich muss ich sagen, das ich zwischendrin sogar „raus“ war, weil ich euch nicht mehr folgen konnte. Aber ich denke das wird vielleicht noch kommen, wenn ich mich intensiver mit dem Thema beschäftige.
Ich bin dankbar, das es so etwas wie dieses Forum gibt, denn das gibt auch „ungelernte“ die Möglichkeit sich an das Thema VBA heranzuwagen. Eure Hilfe und Anmerkungen sind da von großem Wert.
Sicherlich werde ich trotz euren und der Anmerkungen der anderen nicht alles sofort umgesetzt haben, aber es ist schon einmal ein Anfang. Ich war zum Beispiel sehr dankbar als, ich glaube es war Michael, jemand meinen Code ein wenig aufgeräumt hat. Dadurch habe ich viel gelernt.
Ich wünsche euch allen schöne Festtage einen guten Rutsch
Steve
Anzeige
AW: Programmierregeln
18.12.2019 11:36:54
fcs
Hallo Steve,
ergänzend zur Antwort von Martin:
Hier im Forum findest du unter "Excelmaterialien" auch VBA-Grundlagen.
https://www.herber.de/vbabasics/0001.html
Wenn du ein wenig Geld (5 EUR) in die Hand nehmen willst, dann empfehle ich für Anfänger dieses Heftchen
https://www.knowware.de/office-programme/excel/pdf/
Ich habe mir vor Jahren die Vorgängerversion für Excel 2003 in einer Bahnhofsbuchhandlung gekauft.
Beim Aufrufen anderer Makros solltest du wissen, dass man mit dem Aufuf des weiteren Makros auch Parameter übergeben kann und es ist möglich Werte an das aufrufende Makro zurückzugeben.
Sub Makro1()
Dim i As Integer
Dim lngZeile As Long
With ActiveWorkbook
For i = 2 To .Worksheets.Count
Call Makro2(wks:=ActiveWorkbook.Worksheets(i), varSuch:="Test", Fundzeile:=lngZeile)
MsgBox """Test"" gefunden in Blatt """ & ActiveWorkbook.Worksheets(i).Name _
& """ in Zeile " & lngZeile & vbLf _
& "Wenn Zeile = 0 -  dann wurde Suchwert nicht gefunden", vbOKOnly, _
"Test - Makro1"
Next i
End With
End Sub
Sub Makro2(wks As Worksheet, varSuch As Variant, Fundzeile As Long, _
Optional lngLookat As Long = xlWhole)
'Suche den Suchtext im Tabellenblatt und mache was
Dim rngSuch As Range
Set rngSuch = wks.Cells.Find(What:=varSuch, LookIn:=xlValues, lookat:=lngLookat)
If rngSuch Is Nothing Then
Fundzeile = 0
Else
Fundzeile = rngSuch.Row
End If
End Sub

DANKE
18.12.2019 15:00:23
Steve
Moin, Moin,
das waren extrem hilfreiche Tipps und Webseiten. Einige habe ich mir direkt mal angeschaut. Das ist natürlich viel, aber ich möchte gerne das eine oder andere versuchen umzusetzen.
Aus Erfahrung weiss ich, das es manchmal mühseliger ist sich etwas falsches abzugewöhnen als was neues zu lernen.
Die vorgeschlagene Lektüre werde ich mir wohl auch mal zulegen. 5€ schrecken mich da nicht.
Vielen Dank dafür
Steve

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige