Sub via WS_Change aufrufen
19.06.2016 18:01:44
Michael
Hi zusammen,
in der betreffenden Tabelle:
Option Explicit
Const meineSubs = "Act360;Act365;ActAct;Dreißig360"
Private Sub Worksheet_Change(ByVal Target As Range)
Dim a
If Target.Address "$A$1" Then Exit Sub
If Trim(LTrim(Target)) = "" Then Exit Sub
If InStr(meineSubs, Target) = 0 Then Exit Sub
If MsgBox("Wollen Sie wirklich ändern?", _
vbYesNo + vbQuestion, "Frage") vbYes Then Exit Sub
a = Split(meineSubs, ";")
If Target = a(0) Then
Act360 "Immobilien", "1,3,5,7"
Else
If Target = a(1) Then
Act365 "Immobilien", "2,4,6,8"
Else
If Target = a(2) Then
ActAct "Immobilien", "3,5,7,11"
Else
Dreißig360 "Immobilien", "4,6,8,10"
End If
End If
End If
End Sub
Das sind natürlich nur beispielhafte Aufrufe, außerdem habe ich mehrfache Aufrufe für unterschiedliche Spalten mit einem zu übergebenden String gelöst, der dann innerhalb der einzelnen Subs aufgedröselt wird, hier in einem allg. Modul:
Option Explicit
Sub Act360(sh$, Spalten$)
Dim sc, i&
sc = Split(Spalten, ",")
With Sheets(sh)
For i = 0 To UBound(sc)
.Cells(1, Val(sc(i))) = "aus Act360: " & sc(i)
Next
End With
End Sub
Sub Act365(sh$, Spalten$)
Dim sc, i&
sc = Split(Spalten, ",")
With Sheets(sh)
For i = 0 To UBound(sc)
.Cells(3, Val(sc(i))) = "aus Act365: " & sc(i)
Next
End With
End Sub
Sub ActAct(sh$, Spalten$)
Dim sc, i&
sc = Split(Spalten, ",")
With Sheets(sh)
For i = 0 To UBound(sc)
.Cells(5, Val(sc(i))) = "aus ActAct: " & sc(i)
Next
End With
End Sub
Sub Dreißig360(sh$, Spalten$)
Dim sc, i&
sc = Split(Spalten, ",")
With Sheets(sh)
For i = 0 To UBound(sc)
.Cells(7, Val(sc(i))) = "aus Dreißig360: " & sc(i)
Next
End With
End Sub
Der String mit den Spalten wird in ein Array "sc" zerlegt, und die eigentliche Funktion, die in der For-Schleife steckt, führt die Aktionen für jede im Array (bzw. zuvor dem String) vorhandene Spalten-Nummer aus.
Die Betonung liegt auf NUMMER: split zerlegt STRINGs, und das Ergebnis sind wiederum Strings, die vor der Verwendung mit Val in eine Zahl konvertiert werden.
Mit STRING würde es so aufgerufen werden: .cells(1,"1"), was nicht geht, durch das Val wird es dann .cells(1,1) (oder was auch immer für eine Zahl drinsteckt.
Bei einer ganzen Reihe von Zugriffen könnte es sich dann auch rentieren, die ursrpüngliche Variable startcol zu Hilfe zu nehmen und in der ersten Zeile innerhalb der Schleife zuzuweisen, exemplarisch so:
Sub Act360(sh$, Spalten$)
Dim sc, i&, startcol& ' & = as long
sc = Split(Spalten, ",")
With Sheets(sh)
For i = 0 To UBound(sc)
startcol = Val(sc(i))
.Cells(1, startcol) = "aus Act360: " & sc(i)
Next
End With
End Sub
Die Datei: https://www.herber.de/bbs/user/106343.xlsm
Schöne Grüße,
Michael