Private Sub FunctionText1()
Dim i, Quelle1, Ziel, Spalte
Dim Spalten As Variant
Const AbZeile = 381
Const AnzahlZeilen = 16 'C381:C396 = 16 Zl.
Spalten = Array(„U“, „V“, „W“, „X“)
Liebe Antonia,
Ich war heute unterwegs und komme erst jetzt dazu, Dir zu
antworten, entschuldige bitte, daß Du warten mußtest.
Das Kopieren der 4 Texte besorgen zwei Prozeduren. Die
erste nimmt vom Combofeld den Zeilenindex entgegen
(= Nummer der Zeile, auf die in der Combofeld-Liste
geklickt wurde). Diese Zeilennummer reicht sie an die
zweite Prozedur weiter, welche die Zeilennummer als sog.
Parameter entgegennimmt, daraus die Spalte, aus welcher
der Text entnommen werden soll, ermittelt und den Text
dann von Zeile 381 bis 396 in die Spalte C kopiert.
Die erste Prozedur hast Du ja schon in der Anfrage
entworfen und dabei ein Select-Case Konstrukt verwendet.
Es ginge allerdings auch ohne Select Case, indem direkt
der Zeilenindex aus dem Combofeld verarbeitet wird, das
ist aber sicher weniger leicht zu durchschauen, daher habe
ich Deinen Vorschlag belassen. Die erste Prozedur ruft die
zweite auf in der Form (den Namen habe ich wie von Dir in
der Anfrage vorgeschlagen übernommen):
FunctionText x (ein Leerzeichen dazwischen!)
x ist der Zeilenindex aus dem Combofeld und wird als
"Parameter" an die zweite Prozedur weitergereicht:
Sub FunctionText(Parameter)
FunctionText wertet den Parameter aus und ermittelt Text1
oder Text2 usw. gemäß Auswahl im Combofeld. Du brauchst
also nicht 4 Prozeduren FunctionText1, FunctionText2 etc,
sondern nur die eine FunctionText(Parameter).
In VBA gibt es für Variablen einige Datentypen. Der Typ
"String" wird bei der Dimensionierung geschrieben als
Dim VariablenName As String oder kurz: Dim VariablenName$
Das $-Zeichen ist die Kurzform für "As String". Wird ein
String "s" dimensioniert, kannst Du also schreiben
"Dim s$", dabei gehört das $-Zeichen nicht zum Namen,
sondern zeigt nur als Suffix den Datentyp String an.
Für den Datentyp "Integerzahl" (= Ganzzahl) kann man schreiben
Dim VariablenName As Integer oder kurz: Dim VariablenName%
Das %-Zeichen ist die Kurzform für "As Integer", es gehört
wie das $-Zeichen auch nicht zum Variablennamen. Die
Variable des Namens "i" für eine Integerzahl wird also
deklariert als "i%", im Code aber nur als "i" angespro-
chen.
Zurück zur Übergabe der Zeilennummer aus dem Combofeld an
die zweite Prozedur:
FunctionText n (n ist ein Wert zwischen 1 und 4, eine
Ganzzahl!)
liefert den Wert n an die Prozedur
Sub FunctionText(Nr%)
...
End Sub
Den Parameter habe ich Nr genannt, weil er ja die
Zeilennummer aus dem Combofeld ist. Der Parameter Nr
erhält also den Wert von n.
In der zweiten Prozedur werden diverse Variable verwendet,
die im Prozedurkopf definiert werden:
i% -\> Variable für Ganzzahl als "Zeilenzähler" in der
gewünschten Textspalte (1..16 für Zeilen
381..396)
i ist vom Datentyp Integer, daher Suffix %.
Quelle$ -\> soll den Namen der Zelle enthalten, die
jeweils in die Spalte C kopiert wird (z.B.
W381, W382,..W396 oder X381, X382,..X396
usw.). Quelle hat also den Datentyp String,
daher Suffix $.
Ziel$ -\> soll den Namen der Zelle in Spalte C
aufnehmen, in welche übertragen wird (z.B.
C381, C382,..C396).
Ziel ist auch vom Datentyp String, daher
Suffix $.
Spalten -\> Soll ein Array aufnehmen und muß daher als
Datentyp "Variant" haben.
Dazu kann man "Dim Spalten As Variant" schreiben oder kurz
"Dim Spalten". Wird kein Typ angegeben, dimensioniert man
automatisch einen Variant.
Ein Array ist ein Datenfeld, welches mehrere jeweils
gleichartige Werte aufnehmen kann. Im Array "Spalten"
werden hier die Buchstaben für die Spalten vorgegeben, in
denen sich die Texte befinden, welche die Quellen für das
Kopieren nach Spalte C darstellen:
Spalten = Array("W", "X", "Y", "Z")
Hier mußt Du diejenigen vier Spalten einsetzen, welche
Deine Quellen enthalten.
Durch die Verwendung der Konstanten "AbZeile" ist es
leicht, die Ausgangszeile für die Texte anzugeben. Ändert
sie sich, mußt Du lediglich in der Definition den Wert
ändern, nicht im folgenden Code. Dasselbe gilt für die
Anzahl der Zellen für Text1, Text2 usw.: Mit
"AnzahlZeilen = 16"
kommst Du von Zeile 381 bis 396, wenn Du bei 381 startest
(AbZeile=381). Soll später zB. eine Zelle hinzukommen,
legst Du nur einmalig den Wert in "AnzahlZeile = 17" fest.
Beide Konstanten sind vom Datentyp Integer, daher Suffix
%. Alternative:
Const AbZeile As Integer = 381.
Nun zum Code:
Die gewünschte Spalte wird ermittelt, indem der Zeilen-
Index aus dem Combofeld, der als Parameter mit Namen "Nr"
übergeben wird, zur Auswertung kommt. Dazu wird aus dem
Array "Spalten" der entsprechende Buchstabe ausgelesen.
Die Zählung der im Array gespeicherten Werte beginnt aber
nicht bei 1, sondern bei 0! Wurde auf die erste Zeile im
Combofeld geklickt, wird der Wert des ersten Eintrages
in "Spalten" gelesen, das schreibt man als "Spalten(0)".
Wurde die 3. Zeile gewählt, liest man analog den 3. Wert
im Array "Spalten" aus, das schreibt man als "Spalten(2)".
Um also die Spalte zum Wert von "Nr" zu finden, muß man
in "Spalten(Nr - 1)" Nachschau halten. Das Ergebnis wird
als erster Teil des Zelennamens in die Variable Quelle
gespeichert:
Quelle = Spalten(Nr - 1)
In der Spalte müssen nun alle Zellen ab Zeile "AbZeile"
nacheinander angesprochen und in die Spalte C kopiert
werden. Das geschieht, indem in einer Schleife acheinander
die Zeilenwerte 381, 382, .. bis 396 eingesetzt werden.
Als Zähler für die Schleife (= "Zeilenzähler"!) lassen
wir i von 1 bis AnzZeilen laufen: For i = 1 To AnzZeilen.
Beim 1. Durchlauf ist i = 1, die Zeilennummer ergibt
sich daher als "(AbZeile - 1) + i" -\> 381 - 1 + 1 -\> 381.
Im nächsten Schleifendurchlauf ist i = 2, daher:
AbZeile - 1 + i -\> 381 - 1 + 2 -\> 382; im letzten Durch-
lauf ist i = 16, damit "AbZeile - 1 + i" -\> 396. Der
erhaltene Wert ist eine Ganzzahl, wir benötigen jedoch
Ziffern, nämlich "381", "382" usw, da wir ja die Zellen
"namentlich" angeben müssen. Dazu dient die Funktion
Format (Format$ weil wir einen String erzeugen):
Format$(AbZeile - 1 + i)
liefert die entsprechenden Ziffernfolgen. Diesen String
müssen wir noch an den Spaltenbuchstaben anfügen, dazu
dient der Operaot "&":
Quelle = Spalten(Nr - 1) & Format$(AbZeile - 1 + i)
Quelle erhält also beim ersten Schleifendurchgang die
Zelle "W381" (oder "Y381", wenn Spalte Y ausgewählt war),
und der Zellinhalt wird nach "C381" kopiert. Im nächsten
Durchlauf enthält Quelle "W382" (oder "Y382") und Ziel
"C382" usw. bis zum 16. Durchlauf. Damit ist dann der
gesamte Text übertragen.
Änderungen sind leicht möglich, da Du den Array "Spalten"
und die Konstanten "AbZeile" und "AnzahlZeilen" nur im
Prozedurkopf ändern mußt.
Ich könnte mir vorstellen, daß Du nun klarkommst.
ANMERKUNG: bei Durchsicht meiner vorigen Antwort sehe ich,
daß mir ein Fehler unterlaufen ist! Ich schrieb
Quelle = Spalte(....), es muß natürlich heißen
Quelle = Spalten(....)!
Liebe Grüße
Gerd