Zeilenweise Berechnung durch Calculate
#1
Hallo zusammen,

da ich momemtan bei einer Änderung durch das Worksheet_Change-Ereignis die komplette Tabelle neu berechne, möchte ich die Berechnungen durch zeilenweise Berechnungen ersetzen.

Dabei möchte ich, dass verschiende Unterprogramme nur ausgeführt werden, wenn die Spalten 14, 16 bzw. 20 bis 25 geändert werden. Ich habe es mit Worksheet.Calculate versucht, habe jedoch dabei einen Fehler den ich gerade nicht finde, da zur Zeit die Tabelle und nicht lediglich wie gewünscht die geänderte Zeile berechnet wird.

Code:
Sub Worksheet_Change(ByVal Target As Range)

Dim Zeile, Spalte As Integer

Zeile = Target.row
Spalte = Target.Column

'MsgBox "Zeile: " & Zeile & " Spalte: " & Spalte

Select Case Spalte

   Case 14, 16, 20 To 25

   Worksheets("Gehaltsdaten").Rows(Target.row).Calculate

               Summe
               LBProzentBerechnen
               EGGehalt

               LBBerechnen
               irwazBerechnen
               MEKhBerechnen
               JEK

               DeltaMEK35berechnen
               DeltaMEKIrwazberechnen
               DeltaMEKProzent

End Select

End Sub
 
in über jeden Hinweis dankbar :)
Top
#2
Hi,

erst einmal stimmt die Dimensionierung nicht. Dann ist die Frage, was berechnen denn die ganzen Subs, die Du aufrufst?
Gruß

Edgar

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

nimm:

"If Not (Intersect(Target, Range("14:14,16:16,20:25")) Is Nothing) Then"

ps. Im Worksheet Change Ereignis kann das Target mehr als ein Zelle beinhalten. Mit Target.Row bekommst du nur die erste Zeile.
helmut

Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.





Top
#4
Hi,

die Auswahl mehrerer Zellen sollte man unterbinden:

If Target.Count>1 then exit sub

Es ist aber immer noch offen, was für Berechnungen die ganzen Subs starten!
Gruß

Edgar

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

Edgar hat Dich schon darauf aufmerksam gemacht: Die Dimensionierungen stimmen nicht !

Zitat:Dim Zeile, Spalte As Integer        'das ist Deine uns vorgestellte Codezeile

was da steht, heißt aber im Klartext:
Dim Zeile as Variant, Spalte As Integer     'was Du garantiert nicht so bestimmen wolltest

richtig wäre:
Dim Zeile as Integer, Spalte As Integer     'wobei heutzutage fast niemand mehr "Integer"
                                                            'sondern "Long" benutzt
Top
#6
Vielen Dank schon mal euch allen. Die Dimensionierung war ein Fehler von mir, wollte für Zeile auch Integer übernehmen und habe es falsch geschrieben. Werde in Zukunft auch mit Long arbeiten :)
Die Subs besitzen die gleiche Struktur, wesehalb ich mal einen beispielhaft hier reinsetze:
Code:
Sub LBProzentBerechnen()

Dim Zeile As Integer

Zeile = 3

Set book = ActiveWorkbook

With book.Worksheets("Gehaltsdaten")

While (.Cells(Zeile, 1) <> "")


   If (.Cells(Zeile, 25) = "") Then
       .Cells(Zeile, 18).Value = Cells(Zeile, 19) * 1.0714
   Else
       .Cells(Zeile, 18).Value = Cells(Zeile, 19) * 0.9375
   End If


   .Cells(Zeile, 18).NumberFormat = ("0.00")
   
   Zeile = Zeile + 1
   
Wend

End With

End Sub

Im Grunde genommen will ich durch das Verändern der Werte in den Spalten 14 (Arbeitstunden pro Woche), 16 (EG-Stufe) oder der Spalten 20 - 25 Mitarbeiterbewertungen Berechnungen auslösen. Hier im obigen Code soll beispielsweise ein Prozentsatz berechnet werden, der davon abhängt ob der MA eben einen Wert hat oder nicht in Spalte 25.

Der Hinweis, dass jeweils nur eine Zeile ausgeführt wird ist gut, danke.

@Ego ist Target.Row dann auch die erste geänderte Zeile, die das Worksheet-Ereignis erkennt ?
Top
#7
Hi,

der Beispielcode durchläuft z.B. das ganze Blatt! Wahrscheinlich machen das die anderen Codes auch.......
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Top
#8
Sprich, in der Form ist es unmöglich nur eine bestimmte Zeile anzusprechen?

Ja, ich druchlaufe bei den anderen Codes auch mit einer While-Schleife.
Top
#9
Hi,

wenn Du alle die Unterroutinen startest, dann wird eben x-mal die gesamte Tabelle berechnet. Da Deine Pläne und Gedankengänge hier nicht deutlich ersichtlich sind, ist es schwer dabei zu helfen.
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Top
#10
Am schnellsten geht Kalkulation manuell und Neuzuweisung der fraglichen Formeln in persönlich gewollter Reihenfolge. Dann hat man aber auch sein Modell intellektuell im Griff.

Mit einem Makro-Shortcut könnte man Kalkulation automatisch ein- und sofort wieder ausschalten. Evtl. noch mit "Sind Sie sicher?", falls das über 20 Sekunden dauert.

Dann hast Du eine echte Highspeed-Anwendung.
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Top


Gehe zu:


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