AW: Berechnung Durchschnitt
15.08.2006 20:06:49
fcs
Hallo Mathias,
hier jetzt die Makro-Lösung. Ich hab es mit Variablen so aufgebaut, dass automatisch die Anpassung an mehr Zeilen und Spalten mit Daten erfolgt. Falls sich die Position der Daten in der Tabelle ändert, dann muß du die Variablen "iSpalteJahr" und "iZeileMonate" anpassen.
gruss
Franz
Private Sub CommandButton2_Click()
'Berechnung der Durchschnittswerte für die Monate eines Jahres
Dim iJahr As Integer, rngMonate As Range, rngDaten As Range, wks As Worksheet, iLetzteSpalte As Integer
Dim iZeile As Long, iLetzteZeile, dblSumme As Double, iAnzahl As Integer
Dim iSpalteJahr As Integer, iZeileMonate As Long, I As Integer, iRund As Integer
Set wks = Me
iRund = 0 ' Anzahl Kommastellen, auf die das Ergebnis gerundet werden soll
With wks
'Spalte in der das Jahr steht und in der die Ergebnisse eingetragen werden sollen
iSpalteJahr = 7 'Spalte "G"
'Zeile in der die Monate stehen
iZeileMonate = 2
' Letzte Spalte für die ein Monat eingetragen ist
iLetzteSpalte = .Cells(iZeileMonate, .Columns.Count).End(xlToLeft).Column
'Bereich mit den Monaten, die 1. vier Zeichen von links müssen immer gleich der Jahreszahl sein
Set rngMonate = .Range(.Cells(iZeileMonate, iSpalteJahr + 1), .Cells(iZeileMonate, iLetzteSpalte))
'Jahreszahl (Text der Jahreszahl muss rechts in der Zelle stehen)
iJahr = Val(Right(.Cells(iZeileMonate, iSpalteJahr), 4))
'1. zeile mit Daten, deren Mittelwert berechnet werden soll
iZeile = iZeileMonate + 1
' Letzte Zeile mit Daten für einen Monat
' für alle Monate wird die unterste Zeile mit einem Eintrag geprüft und das Maximum genommen
For I = iSpalteJahr + 1 To iLetzteSpalte
iLetzteZeile = Application.WorksheetFunction.Max(iLetzteZeile, .Cells(Rows.Count, I).End(xlUp).Row)
Next
Do
dblSumme = 0
iAnzahl = 0
' Bereich mit den auszuwertenden Daten
Set rngDaten = .Range(.Cells(iZeile, iSpalteJahr + 1), .Cells(iZeile, iLetzteSpalte))
'Summe und Anzahl für Jahr berechnen
For I = 1 To rngMonate.Columns.Count
If iJahr = Val(Left(rngMonate(1, I), 4)) Then
If Not (IsEmpty(rngDaten(1, I)) Or rngDaten(1, I) = "-") Then
dblSumme = dblSumme + rngDaten(1, I)
iAnzahl = iAnzahl + 1
End If
End If
Next
'Durchschnittswert gerundet in Zelle eintragen
.Cells(iZeile, iSpalteJahr).Value = Application.WorksheetFunction.Round(dblSumme / iAnzahl, iRund)
iZeile = iZeile + 1
Loop Until iZeile > iLetzteZeile
End With
End Sub