Konstantendefinition auslagern

Hallo Wissende,

ich hatte vorhin die andere Hälfte meiner Frage vergessen:

Mein Programm ist eine Funktion auf Modul1. Sie wird aufgerufen, indem der Anwender eine Schaltfläche auf einem Sheet bedient.

Das Programm greift auf verschiedene Sheets und dort auf verschiedene Zellen zu. Die Koordinaten der auszulesenden Zellen sind nicht hartcodiert, sondern über Konstanten geregelt. (Falls mal das Layout der Tabellen sich verändert, muss ich nur die Konstante ändern). Da kommen aber schnell mal 50 Konstanten zusammen.

Nun ist die Funktion aber schon ellenlang und unübersichtlich. Ich würde gern Blöcke auslagern, wie z.B.

Option Explicit

Function MeineFunktion()
 Konstanten\_zur\_Feldlokalisierung\_laden
 Daten\_lesen\_und\_auf\_Ergebnisseite\_zusammenstellen
 With Ergebnisseite
 Rechnung\_1\_durchführen
 Rechnung\_2\_durchführen
 Daten\_in\_anderes\_Workbook\_schreiben
 EndWith
End Function

sub Konstanten\_zur\_Feldlokalisierung\_laden ()
 Public const Wert1Zeile=3
 Public const Wert2Zeile=13
 ...
end sub

Nun meine Fragen:

  1. das Auslagern der Konstantendefinition funktioniert nicht - oder ich mache was falsch. Ganz egal, was ich probiere, die Konstante ist weder im Hauptprogramm, noch in den anderen Subs bekannt. Ich weiss, ich könnte auch Werte übergeben, aber das wird bei 50 Konstanten eine riesige Liste. Wie kann ich erreichen, dass die Konstanten im ganzen Modul bekannt sind, ohne immer zu übergeben ?

  2. Die Ergebnisseite ist der Dreh- und Angelpunkt des Makros. Ich würde gern in der Struktur der Hauptfunktion klar machen, dass es jetzt um dieses Blatt geht (durch With Ergebnisseite) und dann in den Unterroutinen nur noch mit .Cells(x,y) arbeiten. Aber auch das klappt nicht wie ich mir das vorstelle.

Ich denke, dass das beides möglich ist, aber finde weder in der Hilfe noch im Internet eine direkte Antwort.

Vielen Dank für eure Hilfe

Hans-Jürgen

Hallo Hans-Jürgen,

ich hatte vorhin die andere Hälfte meiner Frage vergessen:

filosofisch/mathematisch interessant, die Hälfte einer Frage wäre ja eine Halbfrage.
Da du jeweils zwei Fragen in einer Anfrage hier stellst wirds schwierig zu entscheiden was da nun die Hälfte ist, quasi gesucht wird, was sind eigentlich die 100% :smile:))

Nun ist die Funktion aber schon ellenlang und unübersichtlich.
Ich würde gern Blöcke auslagern, wie z.B.

Warum eine Function und keine Sub?

Probiere das mal so in einem Standardmodul, oberhalb der nachfolgenden Prozeduren:

Option Explicit

Public const Wert1Zeile=3
Public const Wert2Zeile=13

Dann kannst du in anderen Modulen auf die Werte zugreifen.

With Ergebnisseite
Rechnung_1_durchführen
Rechnung_2_durchführen
Daten_in_anderes_Workbook_schreiben
EndWith

Bitte schreibe hier Codes nicht rein sondern kopier sie herein.
„EndWith“, da fehlt das leerzeichen.
D.h. jeder Schreibfehler den du machst kann ggfs. unnötig sehr verwirren.

Du kannst das ja halten wie du willst, ich benutze immer Call wenn ich Subs aufrufe, damit kann ICH die Codes besser, flüssiger lesen.
Also so:
Call Rechnung_1_durchführen

Das „With Ergebnisseite“ ist so benutzt sinnlos.

  1. das Auslagern der Konstantendefinition funktioniert nicht -
    oder ich mache was falsch. Ganz egal, was ich probiere, die
    Konstante ist weder im Hauptprogramm, noch in den anderen Subs
    bekannt.

Du hast sie nicht global definiert, probier das was ich schrieb.

Ich weiss, ich könnte auch Werte übergeben, aber das
wird bei 50 Konstanten eine riesige Liste.

Du könntest auch ein Array übergeben was global deklariert wurde.
Das geht nicht mit Konstanten.

  1. Die Ergebnisseite ist der Dreh- und Angelpunkt des Makros.
    Ich würde gern in der Struktur der Hauptfunktion klar machen,
    dass es jetzt um dieses Blatt geht (durch With Ergebnisseite)
    und dann in den Unterroutinen nur noch mit .Cells(x,y)
    arbeiten. Aber auch das klappt nicht wie ich mir das
    vorstelle.

Prinzipiell so:
Call Rechnung_1_durchführen(Ergebnisseite)

Oder aber in den Unterroutinen With Ergebnisseite-Schleifen einbauen.

Zeig mal deine Codes.
Ggfs. lade die Mappe abgespeckt hoch, wichtig ist die Spaltenstruktur bleibt erhalten, aber 10.000 Zeilen brauch ich nicht, 100 oder so reichen.
Hochladen mit Fileupload, s. FAQ:2606

Gruß
Reinhard

Hallo Hans-Jürgen.

Das Programm greift auf verschiedene Sheets und dort auf
verschiedene Zellen zu. Die Koordinaten der auszulesenden
Zellen sind nicht hartcodiert, sondern über Konstanten
geregelt. (Falls mal das Layout der Tabellen sich verändert,
muss ich nur die Konstante ändern). Da kommen aber schnell mal
50 Konstanten zusammen.

Möglicherweise könnte es Dir zusagen, wenn Du statt Konstanten verschiedene Enumerationen verwendest. Diese sind vom Prinzip her aufgebaut, wie im folgenden Beispiel beschrieben:

Public Enum ZeilenKonstantenEnum
 Zeile1 = 1
 Zeile2
 Zeile3
 Zeile4
 Zeile5
End Enum

Public Enum SpaltenKonstantenEnum
 Spalte1 = 1
 Spalte2
 Spalte3
 Spalte4
 Spalte5
End Enum

Standardmäßig ist das erste Enumerations-Mitglied 0, es sei denn, Du legst explizit einen anderen Wert dafür fest (wie im Beispiel Zeile1 = 1).

Jedes folgende Mitglied erhält automatisch einen Wert, der um 1 höher ist als das vorherige, es sei denn, Du legst auch dafür einen expliziten Wert fest.

Wenn Du Deinem Projekt ein Modul hinzufügst und den obigen Code dort hinein kopierst, dann sind diese Enumerationen im gesamten Projekt verfügbar.

Um in Deiner Funktion dann Werte aus Zellen zu lesen, könntest Du dann das folgende Codeprinzip verwenden:

Variable = Tabelle1.Cells(ZeilenKonstantenEnum.Zeile1, SpaltenKonstantenEnum.Spalte1)

VG
Carsten