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.

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 :)
Antworten 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.
Antworten 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.





Antworten 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.
Antworten 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
________________________________________________________________________
wer aufgibt, ohne es versucht zu haben, gibt einfach nur auf!

Grüße aus Norderstedt, Peter
Antworten 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 ?
Antworten 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.
Antworten 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.
Antworten 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.
Antworten 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.
Antworten Top


Gehe zu:


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