Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1504to1508
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Funktion behält immer den letzten Wert

Funktion behält immer den letzten Wert
30.07.2016 23:24:52
Controletti
Hallo liebe Experten,
ich bin EXCEL-VBA-Anfänger und habe eine Funktion geschrieben, mit der ich die Monate ermittle, die jemand in 2016 i Status Altersteilzeit aktiv ist.
wenn ich das Makro in einer Tabellenzeile eingebe und Enter drücke, bekomme ich den richtigen Wert. Wenn ich die Funktion aber in die ganze Spalte kopiere, bekomme ich für alle Zeilen den gleichen Wert - vermutlich den der ersten Zeile mit Aufruf.
Gehe ich wieder in die Einzelzeilen, wähle den Eintrag und drücke Enter, ist wieder alles ok. Was mache ich falsch?
Hier meine Funktion

Function Monataktiv2016()
Dim reihe As Integer
Dim AM, Jahresanfang, Jahresende As Date
Dim Monat As Integer
'AM enthält das Beginndatum der aktiven ATZ-Zeit
reihe = ActiveCell.Row
AM = Cells(reihe, 39)
Jahresanfang = "01.01.2016"
Jahresende = "31.12.2016"
If DatePart("yyyy", AM) = DatePart("yyyy", Jahresende) Then
Monataktiv2016 = DateDiff("M", Jahresanfang, AM)
ElseIf DatePart("yyyy", AM) 

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Funktion behält immer den letzten Wert
30.07.2016 23:47:05
Mullit
Hallo,
versuchs mal hiermit und Du mußt in VBA für eine saubere Programmierung alle Datentypen explicit deklarieren, sonst deklarierst Du sie implizit als Variant...
Option Explicit


Function Monataktiv2016() As Long
Dim reihe As Integer
Dim AM As Date, Jahresanfang As Date, Jahresende As Date
Dim Monat As Integer
'AM enthält das Beginndatum der aktiven ATZ-Zeit

reihe = Application.Caller.Row
AM = Cells(reihe, 39).Value
Jahresanfang = "01.01.2016"
Jahresende = "31.12.2016"

If DatePart("yyyy", AM) = DatePart("yyyy", Jahresende) Then
     Monataktiv2016 = DateDiff("M", Jahresanfang, AM)
ElseIf DatePart("yyyy", AM) < DatePart("yyyy", Jahresende) Then
        Monataktiv2016 = ""
Else
        Monataktiv2016 = 12
End If
End Function

Gruß, Mullit
Anzeige
AW: Funktion behält immer den letzten Wert
30.07.2016 23:58:28
Mullit
Hallo,
...und damit Deine Funktion dynamisch auf Änderungen der Quellspallte reagiert, wäre es besser Du übergibst diese noch an die Funktion:
Option Explicit

Function Monataktiv2016(ByRef probjRange As Range) As Long
Dim reihe As Integer
Dim AM As Date, Jahresanfang As Date, Jahresende As Date
Dim Monat As Integer
'AM enthält das Beginndatum der aktiven ATZ-Zeit

reihe = Application.Caller.Row
AM = Cells(reihe, probjRange.Column).Value
Jahresanfang = "01.01.2016"
Jahresende = "31.12.2016"

If DatePart("yyyy", AM) = DatePart("yyyy", Jahresende) Then
     Monataktiv2016 = DateDiff("M", Jahresanfang, AM)
ElseIf DatePart("yyyy", AM) < DatePart("yyyy", Jahresende) Then
        Monataktiv2016 = ""
Else
        Monataktiv2016 = 12
End If
End Function

Aufruf bspw.:
=Monataktiv2016($AM$1:$AM$16)

Gruß, Mullit
Anzeige
AW: Funktion behält immer den letzten Wert
31.07.2016 00:19:21
Mullit
Hallo,
RückgabeTyp der Funktion ist dann richtigerweise Variant, hattest Du aber auch so gewählt, war mein Fehler:
Function Monataktiv2016(ByRef probjRange As Range) As Variant

Gruß, Mullit
AW: Funktion behält immer den letzten Wert
31.07.2016 08:05:10
fcs
Hallo Mullit und Controlletti,
ich würde die Funktion in der nachfolgenden Form aufbauen.
Der Wert mit dem Beginndatum der ATZ wird direkt an die Function als Parameter übergeben. Die Jahresdaten als optionale Parameter. So ist die Function auch für weitere Jahre nutzbar.
Bei Änderungen in Spalte AM wird dann auch immer sofort die Formel neu berechnet.
Formelbeispiele:
=ATZ_aktiv_Jahr(AM3;DATUM(JAHR(HEUTE());1;1);DATUM(JAHR(HEUTE());12;31))
=ATZ_aktiv_Jahr(AM4)
=ATZ_aktiv_Jahr(AM5;"2017-01-01";"2017-12-31")

Gruß
Franz
Function ATZ_aktiv_Jahr(Beginn_ATZ As Date, _
Optional Jahresanfang As Date = "2016-01-01", _
Optional Jahresende As Date = "2016-12-31") As Variant
'Funktion berechnet die Anzahl aktive Monate im angegebenen Zeitraum
'Beginn_ATZ = das Beginndatum der aktiven ATZ-Zeit
Dim Monat As Integer
If DatePart("yyyy", Beginn_ATZ) = DatePart("yyyy", Jahresende) Then
ATZ_aktiv_Jahr = DateDiff("M", Jahresanfang, Beginn_ATZ)
ElseIf DatePart("yyyy", Beginn_ATZ) 

Anzeige
AW: Funktion behält immer den letzten Wert
31.07.2016 15:48:07
Controletti
1000 Dank,
deine Tipps waren super und jetzt läuft die Funktion einwandfrei. Ich werde nochmal probieren, ob es an der Variablen-Definition oder am Activecells.row lag.
Die Definition als Zahl war schon richtig. Mit der leeren Rückgabe habe ich etwas geschludert und gebe lieber 0 zurück.
AW: Funktion behält immer den letzten Wert
31.07.2016 15:53:40
Controletti
Hallo Franz,
danke für den Umbau, deinen Vorschlag kann ich in meinem neuen Job super einsetzen.
Hier lohnt die Dynamisierung leider nicht mehr, weil die Firma nicht mehr lange existiert.
LG
Contoletti
AW: Funktion behält immer den letzten Wert
31.07.2016 18:18:42
Controletti
Hallo Mullit,
nochmal ein superdickes Dankeschön. Mit deinen Hinweisen läuft nicht nur diese Funktion sondern auch all meine anderen für die übrigen 40 Spalten.
LG Monika
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige