04.06.2018, 13:39 (Dieser Beitrag wurde zuletzt bearbeitet: 04.06.2018, 13: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, 14:37 (Dieser Beitrag wurde zuletzt bearbeitet: 04.06.2018, 15: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, 15:43 (Dieser Beitrag wurde zuletzt bearbeitet: 04.06.2018, 15: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.
04.06.2018, 16:16 (Dieser Beitrag wurde zuletzt bearbeitet: 04.06.2018, 16: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, 10:44 (Dieser Beitrag wurde zuletzt bearbeitet: 06.06.2018, 11: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.