>> Ich hatte nun überlegt, ob es besser ist, wenn das Programm mit der Datei `Zellzuweisung` arbeitet, statt alles in den Code zu packen. Dann könnte man doch auch einfacher Änderunge vornehmen, oder?
Könnte man ... und ja.
An der Stelle möchte ich gerne anmerken, dass dein Anliegen inzwischen weit weg von dem ist, wo es einmal lag. Genau davon habe ich - etwas weiter oben im Themenverlauf - gesprochen.
Es gibt Dienstleistungfirmen die du mit so etwas beauftragen kannst und die dir eine professionelle Lösung in wenigen Wochen liefern. (ich habe früher mal in einer gearbeitet)
Nun zu deiner Überlegung:
Hier bietet es sich an, eine Hilfsfunktion zu bauen. Der übergibst du die Information über deine Quelldaten (inkl. Reihenfolge) und sie liefert dir dann zusammenhängend die entsprechende Werte.
Du würdest ihr also z.B. für »Meldung I« den Bereich E9:E14,E17 übergeben und erhälst eine zusammenhängendes Datenfeld mit den Werten (in der Reihenfolge wie sie angegeben wurden - man könnte also auch schreiben E17,E11,E9:E10,E12:E14 und die Reihenfolge wäre demenstprechend eine andere).
Hier die Hilfsfunktion (kommt in ein Modul):
'////////////////////////////////
'// helper function
'//+----------------------------+
'// params:
'// Range [IN]
'// ... range object
'// Count [IN/OUT, optional]
'// ... amount of values to receive / amount of values read
'////////////////
Public Function GetValues(ByVal Range As Excel.Range, Optional ByRef Count As Long) As Variant
If Range Is Nothing Then Exit Function
Dim rngArea As Excel.Range
Dim vntArray As Variant
Dim i&, j&, k&
If Count <= 0 Then Count = Range.Cells.Count
ReDim vntArray(1 To Count, 1 To 1)
i = 1 'cell idx
j = 1: k = 1 'area idx / area-cell idx
Do While i <= Count And j <= Range.Areas.Count
If k > Range.Areas(j).Cells.Count Then
j = j + 1 'next area
k = 1 'reset area-cell idx
Else
vntArray(i, 1) = Range.Areas(j).Cells(k).Value
k = k + 1
i = i + 1
End If
Loop
Count = i - 1
GetValues = vntArray
Erase vntArray
End Function
Die LookUp Tabelle könnte so aussehen:
Bezeichner |
Ziel |
Quelle |
Bereich |
Reiter_Name |
Bereich |
I |
D10:D16 |
Reiter2 |
E9:E14,E17 |
II |
D17:D26 |
Reiter2 |
E20:E28,E34 |
III |
D27:D41 |
Reiter2 |
E37:E46,E52,E55:E57,E59 |
IV |
D42:D47 |
Reiter2 |
E62:E66,E72 |
… |
… |
… |
… |
Der Aufruf für die Abarbeitung, der oben in der Tabelle gelisteten Bereiche, könnte dann so aussehen:
Sub MyTest()
Dim wksTnsf As Excel.Worksheet
Dim wksEval As Excel.Worksheet
Dim rngEval As Excel.Range
Dim wksSrc As Excel.Worksheet
Dim rngSrc As Excel.Range
Set wksTnsf = Worksheets("TransferLookUp")
Set wksEval = Worksheets("Auswertung")
'anhand der Transfer-Tabelle die Daten kopieren/übertragen
For Each rngSrc In wksTnsf.Range("C3:D6").Rows
'Ziel-Bereich ermitteln (steht in der selben Zeile, eine Spalten nach links)
Set rngEval = rngSrc.Cells(1).Offset(, -1)
'..und jetzt referenzieren
Set rngEval = wksEval.Range(rngEval.Value)
'Quellen-Bereich referenzieren
Set rngSrc = Worksheets(rngSrc.Cells(1).Value).Range(rngSrc.Cells(2).Value)
'Daten kopieren/übertragen
rngEval.Value = GetValues(rngSrc, rngEval.Cells.Count)
Next
End Sub
Beachte bitte:
Ich habe hier alles in einer Mappe belassen. Sollte aber nicht schwer fallen die Referenzen zu anzupassen.
Grüße
|