04.06.2018, 12:39 (Dieser Beitrag wurde zuletzt bearbeitet: 04.06.2018, 12:40 von JonasRe.)
Hallo zusammen,
ich möchte, dass mir beim Ändern von Zellenwerten automatisch die Funktionen zur Neuberechnung von Kennwerten aufgerufen werden. Dabei habe ich versucht, dass nicht alle Kennwerte neu berechnet werden, sondern lediglich die, die sich in der gleichen Zeile befinden. Wenn ich bei meinem momentanen Makro einen Wert verändere passiert leider nichts.
Hat jemand eine Lösung für mein Problem?
Sub Worksheet_Change(ByVal Target As Range)
Dim Zeile As Integer Dim ZeileMax As Integer
ZeileMax = Cells(Rows.Count, 2).End(xlUp).Row
For Zeile = 3 To ZeileMax
If Target.Address = Range(Cells(Zeile, 13), Cells(ZeileMax, 28)).Address Then
1. Zeige mal deine Funktion
2. sollte man eine Funktion nicht Funktion nennen
3. der Befehl Call ist optional, braucht also nicht mitgeschrieben werde.
Viele Grüße
Klaus-Dieter Der Erfolg hat viele Väter, der Misserfolg ist ein Waisenkind Richard Cobden
04.06.2018, 13:37 (Dieser Beitrag wurde zuletzt bearbeitet: 04.06.2018, 14:16 von WillWissen.
Bearbeitungsgrund: Codetags
)
Es sollen mehrere Funktionen angestoßen werden, wobei ich den Begriff "Funktion" nur als Platzhalter benutzt habe. Es sind an sich um die 5 Funktionen die aufgerufen werden sollen.
Dabei habe ich eine Excel-Liste mit über 500 Einträgen. Die Daten werden jedes Jahr neu aus einer Datenbank eingelesen, jedoch können diese auch händisch abgeändert werden. Daher möchte ich auch eine zeilenweise Berechnung, da sonst beim Ändern einzelner Zellen alle Werte neu berechnet werden. Ich habe die Funktionen, die aufgeruden werden sollen, von meinem Vorgänger übernommen. Dieser hat auch den RefreshButton erstellt, welchen ich jedoch ändern möchte:
Code:
Sub RefreshSumme()
Call platzhalter
Call LBProzentrechnen
Call EGGehalt
End Sub
Sub platzhalter()
Dim instring As String
Dim outstring() As String
Dim book, mybook As Workbook
Dim sourceline, destinationline As Integer
Dim Result As Integer
Dim Pfad As String
Dim Help1 As Integer
Dim Help2 As Integer
Dim Help3 As Integer
Dim Help4 As Integer
Dim Help5 As Integer
Dim Help6 As Integer
Dim Summe As Integer
Set mybook = ActiveWorkbook
destinationline = 3
sourceline = 3
While (mybook.Worksheets("Gehaltsdaten").Cells(destinationline, 1) <> "")
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 20) = "" Then GoTo Sprung
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 20) = "A" Then Help1 = 0
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 20) = "B" Then Help1 = 2
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 20) = "C" Then Help1 = 4
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 20) = "D" Then Help1 = 6
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 20) = "E" Then Help1 = 8
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 21) = "A" Then Help2 = 0
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 21) = "B" Then Help2 = 2
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 21) = "C" Then Help2 = 4
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 21) = "D" Then Help2 = 6
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 21) = "E" Then Help2 = 8
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 22) = "A" Then Help3 = 0
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 22) = "B" Then Help3 = 1
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 22) = "C" Then Help3 = 2
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 22) = "D" Then Help3 = 3
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 22) = "E" Then Help3 = 4
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 23) = "A" Then Help4 = 0
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 23) = "B" Then Help4 = 1
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 23) = "C" Then Help4 = 2
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 23) = "D" Then Help4 = 3
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 23) = "E" Then Help4 = 4
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 24) = "A" Then Help5 = 0
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 24) = "B" Then Help5 = 1
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 24) = "C" Then Help5 = 2
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 24) = "D" Then Help5 = 3
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 24) = "E" Then Help5 = 4
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 25) = "A" Then Help6 = 0
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 25) = "B" Then Help6 = 1
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 25) = "C" Then Help6 = 2
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 25) = "D" Then Help6 = 3
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 25) = "E" Then Help6 = 4
Summe = Help1 + Help2 + Help3 + Help4 + Help5 + Help6
mybook.Worksheets("Gehaltsdaten").Cells(destinationline, 19) = Summe
04.06.2018, 14:43 (Dieser Beitrag wurde zuletzt bearbeitet: 04.06.2018, 14:46 von Käpt'n Blaubär.)
Hallo,
Zitat:Es sollen mehrere Funktionen angestoßen werden, wobei ich den Begriff "Funktion" nur als Platzhalter benutzt habe.
Es sind an sich um die 5 Funktionen die aufgerufen werden sollen.
ich finde es schon sehr ungewöhnlich, wenn ein Anfänger sich derart flapsig über einen so exentiell wichtigen Hinweis
hinwegsetzt. Solange Du nicht Dein eigenes VBA kreierst, solltest Du Dich schon daran halten, wie VBA mit sich selbst
umgeht.
Im Übrigen macht es den Helfern keinen wirklichen Spaß zu helfen, wenn ihre Vorschläge so mir nichtsdirnichts vom
Tisch gewischt werden.
Im Anhang ein bischen entsprechenden Lesestoff für dieses, Dein jetziges Projekt.
Auch in zurückliegenden und künftigen Projekten solltest Du diese Hinweise unbedingt berücksichtigen.
Wenn der große Knall kommt, ist es nämlich zu spät.
________________________________________________________________________
wer aufgibt, ohne es versucht zu haben, gibt einfach nur auf!
04.06.2018, 15:16 (Dieser Beitrag wurde zuletzt bearbeitet: 04.06.2018, 15:17 von BoskoBiati.)
Hi,
ich sehe nirgendwo ein Worksheet_Change.
Hier mal ein Teil etwas gekürzt:
Code:
Sub EGGehalt()
Dim mybook As Workbook
Dim sourceline As Integer
Set mybook = ActiveWorkbook
sourceline = 3
With mybook
While .Worksheets("Gehaltsdaten").Cells(sourceline, 1) <> ""
.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = .Worksheets("Parameter").Cells(.Worksheets("Gehaltsdaten").Cells(sourceline, 16)+1, 4)
sourceline = sourceline + 1
Wend
End With
End Sub
Gruß
Edgar
Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
ich wollte keinem auf den Schlips treten, wie du erkannt hast bin ich relativ neu bei der Verwendung von VBA.
@BoskoBiati
Danke schonmal für den übersichtlicheren Code. Jetzt konkret für mein Problem:
Es reicht also nicht wenn ich lediglich über Worksheet_Change die Funktionen aufrufe, da momentan keine Berechnungen ausgeführt werden. Muss ich in den entsprechenden Funktionen noch einen Verweis (wenn ja in welcher Form?) einbringen?
Dies ist meine Funktion auf der Arbeitsblattebene, die aufzurufenden Funktionen sind auf der Modulebene.
Sub Worksheet_Change(ByVal Target As Range)
Dim Zeile As Integer Dim ZeileMax As Integer ZeileMax = Cells(Rows.Count, 2).End(xlUp).Row For Zeile = 3 To ZeileMax If Target.Address = Range(Cells(Zeile, 13), Cells(ZeileMax, 28)).Address Then Call platzhalter Call LBProzentrechnen Call EGGehalt
06.06.2018, 09:44 (Dieser Beitrag wurde zuletzt bearbeitet: 06.06.2018, 10:05 von BoskoBiati.)
Hi,
ich möchte jetzt nicht alles nachbauen und umstellen, aber soviel ist klar: Dein Code funktioniert nicht, weil die Address-Geschichte nicht stimmt. Außerdem würde das Ganze, wenn es funktionieren würde, ALLE Zeilen mehrfach neu berechnen. Hier mal ein Ansatz:
Code:
Sub Worksheet_Change(ByVal Target As Range)
Dim Zeile As Integer
Dim ZeileMax As Integer
If Target.Count > 1 Then Exit Sub
If Target.Column > 12 And Target.Column < 29 Then
platzhalter
LBProzentrechnen
EGGehalt
End If
End Sub
Code:
Sub EGGehalt()
.Worksheets("Gehaltsdaten").Cells(activeCell.row, 15) = .Worksheets("Parameter").Cells(.Worksheets("Gehaltsdaten").Cells(activeCell.row+1, 16), 4)
End Sub
Code:
Sub LBProzentrechnen()
Dim loZeile As Long
loZeile = ActiveCell.Row
With Sheets("Gehaltsdaten")
If .Cells(loZeile, 25) <> "" Then
.Cells(loZeile, 18) = .Cells(loZeile, 19) * 0.9375
Else
.Cells(loZeile, 18) = .Cells(loZeile, 19) * 1.0714
End If
End Sub
Code:
Sub platzhalter()
Dim sourceline As Long, destinationline As Long
Dim Help1 As Long
Dim Help2 As Long
Dim Help3 As Long
Dim Help4 As Long
Dim Help5 As Long
Dim Help6 As Long
Dim Summe As Long
Help1 = 0
Help2 = 0
Help3 = 0
Help4 = 0
Help5 = 0
Help6 = 0
With Sheets("Gehaltsdaten")
sourceline = .ActiveCell.Row
If .Cells(sourceline, 1) <> "" Then
If .Cells(sourceline, 20) <> "" Then
Help1 = (Asc(.Cells(sourceline, 20)) - 64) * 2
Help2 = (Asc(.Cells(sourceline, 21)) - 64) * 2
Help3 = (Asc(.Cells(sourceline, 22)) - 64)
Help4 = (Asc(.Cells(sourceline, 23)) - 64)
Help5 = (Asc(.Cells(sourceline, 24)) - 64)
Help6 = (Asc(.Cells(sourceline, 25)) - 64)
loSumme = Application.WorksheetFunction.Sum(Help1, Help2, Help3, Help4, Help5, Help6)
.Cells(sourceline, 19) = Summe
End If
End If
End With
End Sub
Alles ungetestet!
Gruß
Edgar
Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.