Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Call-Funktion beim Ändern von Zellenwerten
#1
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

Call Funktion

End If
Next Zeile
End Sub
Antworten Top
#2
Hi,
Zitat:Wenn ich bei meinem momentanen Makro einen Wert verändere


Wie veränderst Du Werte?
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Antworten Top
#3
Hallo,

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
Antworten Top
#4
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

Sprung:
destinationline = destinationline + 1
sourceline = sourceline + 1
Help1 = 0
Help2 = 0
Help3 = 0
Help4 = 0
Help5 = 0
Help6 = 0
Wend
End Sub
                                                                                                                           
Sub LBProzentrechnen()
Dim Zeile As Integer
Zeile = 3

Set book = ActiveWorkbook
While (book.Worksheets("Gehaltsdaten").Cells(Zeile, 1) <> "")
If (book.Worksheets("Gehaltsdaten").Cells(Zeile, 25) <> "") Then
book.Worksheets("Gehaltsdaten").Cells(Zeile, 18).Value = Cells(Zeile, 19) * 0.9375
Else
book.Worksheets("Gehaltsdaten").Cells(Zeile, 18).Value = Cells(Zeile, 19) * 1.0714
End If
Zeile = Zeile + 1

Wend
End Sub
                                                                                                                                             

Sub EGGehalt()

Dim instring As String
Dim outstring() As String
Dim book, mybook As Workbook
Dim sourceline, destinationline As Integer
Set mybook = ActiveWorkbook
sourceline = 3
While (mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 1) <> "")
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "1" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(2, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "2" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(3, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "3" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(4, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "4" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(5, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "5" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(6, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "6" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(7, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "7" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(8, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "8" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(9, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "9" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(10, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "10" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(11, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "11" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(12, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "12" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(13, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "13" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(14, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "14" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(15, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "15" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(16, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "16" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(17, 4)
If mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 16) = "17" Then mybook.Worksheets("Gehaltsdaten").Cells(sourceline, 15) = mybook.Worksheets("Parameter").Cells(18, 4)
sourceline = sourceline + 1
Wend

End Sub
Antworten Top
#5
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.


Angehängte Dateien
.doc   Übersicht aller VBA-Schlüsselwörter.doc (Größe: 350 KB / Downloads: 4)
________________________________________________________________________
wer aufgibt, ohne es versucht zu haben, gibt einfach nur auf!

Grüße aus Norderstedt, Peter
Antworten Top
#6
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.
Antworten Top
#7
@Käpt'n Blaubär,

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

End If
Next Zeile
End Sub
Antworten Top
#8
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.
Antworten Top
#9
Vielen Dank schon mal für deine Arbeit!

Ich werde mich mit deinem Code befassen und mich intensiver einlesen
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste