AW: Werte neu berechnen
17.11.2008 18:58:24
Franc
hoff die erklärungen sind verständlich
Sub Berechnung()
' Variablen deklarieren - das sollte man immer tun
Dim Spalte As Byte, Zelle As Range, letzteZeile As Long
' tritt ein Fehler auf, dann zum Abschnitt ende
On Error GoTo ende
' schaltet die Aktualisierung des Bildschirminhaltes aus
' dies ist schöner anzusehen und bringt auch teilweise einen
' sehr guten Geschwindigkeitsvorteil beim ausführen
Application.ScreenUpdating = False
' die Änderung findet auf einem anderen Blatt statt und deshalb
' müssen die Anweisungen explizit für diese Tabelle gelten.
' Damit man nicht vor jedem Werte "Sheets(Tabellenname)" schreiben
' muss, sagt man am Anfang "with Sheets(Tabellenname")
' jetzt reicht vor der Anweisung ein "." der stellvertretend für
' Sheets(Tabellenname") steht.
With Sheets("Berechnung")
' die Spalten liegen direkt nebeneinander und es soll auch überall das gleiche
' gemacht werden. Von daher nimmt man am einfachsten eine For to Next Schleife.
' die 4 bis 8 steht stellvertretend für die Spalten D - H
For Spalte = 4 To 8
' Cells(Zeile, Spalte) = Cells(3, 4) = Zelle D3
' prüfen ob auf dem Blatt Berechnung (wegen dem "." vor cells) kein "-" steht
' würde ein "-" drinstehen, dann geht er direkt zum End if und fürht die Anweisungen
' dazwischen nicht aus
' anstatt der Spaltennr. steht hier "Spalte", was die aktuelle Spaltennr. von der
' For to Next Schleife trägt. Beim 1. Durchlauf eine 4, beim 2. eine 5 etc.
' so muß man nicht für jede Spalte ein extra Programm schreiben
If .Cells(3, Spalte) "-" Then
' wenn kein "-" drinsteht, dann die letzte Zeile in der aktuelle Spalte bestimmen
' Excel soll von der jeweiligen Spalte von Zeile 65500 nach oben bis zur 1. befüllten
' Zeile gehen. Mit dem .row am Ende wird nur die Zeilennummer genommen
' sonst stände da z. Bsp. D30 aber damit können wir nicht rechnen. mit .row hat die
' variable "letzteZeile" jetzt zum Beispiel den Wert 30
letzteZeile = .Cells(65500, Spalte).End(xlUp).Row
' wenn man die Zelle, direkt ändern will, dann nimmt man am besten For Each
' Zelle wurde oben als "Range" deklariert
' Die folgende Zeile heißt "Mit jeder Zelle im Bereich von Zeile 9, Spalte 4
' bis Zeile 30 (hier nur als Beispiel), Spalte 4
For Each Zelle In .Range(.Cells(9, Spalte), .Cells(letzteZeile, Spalte))
' IsNumeric(Zelle) = Wenn eine Zahl drin steht (zum Beispiel im Feld D9) und die Zelle nicht _
leer ist
If IsNumeric(Zelle) And Zelle "" Then
' jetzt wird ein neuer Wert für die aktuelle Zelle berechnet
' hierzu wird die Zahl in der aktuelle Zelle genommen und der Quotient von Zeile 6 und 5
' die aktuelle Spalte wird wieder durch die Variable Spalte bestimmt
Zelle = Zelle ^ (.Cells(6, Spalte) / .Cells(5, Spalte))
End If
' Nach der Berechnung der Zelle oder wenn sie leer war, wird die nächste Zelle in der Spalte _
genommen
Next Zelle
End If
' Nachdem alle Zellen in der Spalte berechnet wurden wird mit der nächsten Spalte weitergemacht
Next Spalte
End With
' Wichtig ist es die Bildschirmaktualisierung wieder einzuschalten
Application.ScreenUpdating = True
Exit Sub
ende:
' auch bei einem Fehler wird die Aktualisierung wieder eingeschalten
Application.ScreenUpdating = True
' zusätzlich wird eine Messagebox angezeigt wo auch die Adresse
' von der Zelle drinsteht wo der Fehler aufgetreten ist. (erleichtert
' manchmal die Suche
MsgBox "Es ist ein Fehler aufgetreten!" & Chr(13) & _
"Letzte Berechnung: " & Zelle.Address
End Sub