Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1496to1500
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

Makro bei Zelländerung

Makro bei Zelländerung
15.06.2016 09:55:23
Gunnar
Hallo Zusammen,
ich verwende folgendes Makro, was bei Änderung des Wertes in der Zelle A1 in der Zelle E5 unterschiedliche Werte bzw. Formeln einträgt (Dank nochmal an Hajo_Zi):
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet
If Target.Address = "$A$1" Then
If MsgBox("Wollen Sie wirklich ändern?", vbYesNo + vbQuestion, _
"Frage") = vbYes Then
Select Case Target
Case 1
Worksheets("Tabelle1").Cells(5, 5).FormulaLocal = "1"
Case 2
Worksheets("Tabelle1").Cells(5, 5).FormulaLocal = "2"
End Select
End If
End If
End Sub
Wie muss ich das anpassen, wenn ich auf dem selben Tabellenblatt mehrere solcher Anpassungen vornehmen möchte. Also zum Beispiel soll bei Änderung des Wertes in Zelle B1 entsprechend den Cases in Zelle E6 geänderte Werte / Formeln eingetragen werden. Wenn ich das gleiche Makro mit anderen Zellbezügen verwende, bekomme ich eine Fehlermeldung, dass das Makro nicht mehr eindeutig ist.
Kann jemand helfen?
Vielen Dank im Voraus & beste Grüße
Gunnar

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro bei Zelländerung
15.06.2016 10:01:52
Rudi
Hallo,
wozu fragst du den Wert der Zelle ab, wenn du ihn schreibst?
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet
If Target.Row = 1 Then  'Änderung in Zeile1
Select Case Target.Column
Case 1 To 4 'Spalten A:D
If MsgBox("Wollen Sie wirklich ändern?", vbYesNo + vbQuestion, _
"Frage") = vbYes Then
Cells(Target.Column + 4, 5) = Target
End If
End Select
End If
End Sub
Gruß
Rudi

AW: Makro bei Zelländerung
15.06.2016 16:26:46
Gunnar
Hallo Rudi,
danke für die Antwort. Das trifft das Ganze schon etwas näher. Aber die Eingabebereiche (A1:D1) und die Bereiche, in denen je nach Case dann eine Formel reingeschrieben wird, sind nicht zusammenhängend.
Das Ganze kommt aus folgender Überlegung. Ich habe folgendes Makro für Zinsberechnungen in einem Excel-Zins- und Tilgungsplan.
Sub Act360(startCol As Long)
Dim ws As Worksheet
Set ws = Worksheets("Immobilie")
ws.Cells(351, startCol).FormulaLocal = "Act/360"
ws.Cells(352, startCol + 2).FormulaR1C1 = "=IF(ISERROR(COUPDAYSNC(R[-1]C[-5],RC[-5],1,2)),0,COUPDAYSNC(R[-1]C[-5],RC[-5],1,2))"
Range(Cells(352, startCol + 2), Cells(698, startCol + 2)).FillDown
ws.Cells(352, startCol + 3).FormulaR1C1 = "=IF(ISERROR(COUPDAYS(R[-1]C[-6],RC[-6],1,2)),0,COUPDAYS(R[-1]C[-6],RC[-6],1,2))"
Range(Cells(352, startCol + 3), Cells(698, startCol + 3)).FillDown
End Sub</pre>
Für drei andere Zinsberechnungsarten entsprechend - nur halt mit kleinen Anpassungen in der Formel.
Da auf einem Tabellenblatt mehrere dieser Zins- und Tilgungspläne sind und die jeweiligen Zinsberechnungsarten in allen gleich angewendet werden, habe ich das über die startcol-Funktion gelöst. Ausführen konnte ich die Makros dann jeweils über Schaltflächen (pro Zinsberechnungsart eine Schaltfläche) mit dem folgenden Code:
Private Sub CommandButton241_Click()
Act360 5
End Sub
Die Nummer hinter dem Makro gilt für die jeweilige Startspalte (folgende dann 14, 23, 32), so dass ich das jeweilige Zinsberechnungsmakro für alle 4 Zins- und Tilgungspläne gleichermaßen anwenden konnte.
Die Makros zu den Zinsberechnungen sollen nun aber statt durch Schaltflächen durch eine DropDown-Liste im Tabellenblatt ausgeführt werden. Also habe ich in einer DropDown-Liste die Werte "Act360", "Act365", "ActAct" und "Dreißig360". Je nach Auswahl soll dann die entsprechende Zinsberechnungsformel in dem jeweiligen Zins- und Tilgungsplan angewendet werden. So lange ich nur einen Zins- und Tilgungsplan auf dem Tabellenblatt hatte, war das mit dem zuerst in meinem Thread genannten Makro möglich, da die 4 Cases jeweils einem Makro entsprachen.
Ich hoffe, die Sache ist jetzt etwas klarer und du kannst nochmal helfen.
Vielen Dank & beste Grüße
Gunnar

Anzeige
AW: Makro bei Zelländerung
16.06.2016 13:26:38
Gunnar
Hallo Zusammen,
es geht darum mehrere Worksheet_Change-Makros in einem Tabellenblatt verwenden zu können.
Die sollen jeweils durch einen Zelleintrag aus einer Dropdown-Liste ausgelöst werden. Je nach Art des Zelleintrags startet ein anderes Makro.
Hat vielleicht noch jemand 'ne Idee? Alternative Lösungsvorschläge sind natürlich auch willkommen.
Vielen Dank im Voraus & beste Grüße
Gunnar
Gunnar

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

Anzeige
AW: Sub via WS_Change aufrufen
20.06.2016 17:41:18
Gunnar
Hallo Michael,
danke erst mal für die Antwort und deine damit verbundenen Mühen. Mal sehen, ob ich das mit meinen VBA-Kenntnissen umsetzen kann.
Gruß, Gunnar

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige