2016-08-01 3 views
0

Im folgenden Code habe ich 3 Bereiche gesetzt, die Variablen entsprechen. Ich habe kein Problem mit rngNext und rngDays, sie weisen die richtige Variable dem richtigen Bereich zu - keine Sorge.Der in der Funktion eingestellte Bereich wird gelöscht, wenn zum Hauptrechner zurückgekehrt wird.

Bizarely, RngLast schreibt nicht in das Arbeitsblatt. Genauer gesagt (wenn ich in den Code gehe) kann ich den Wert sehen, der wie erwartet auf das Blatt in der Zeile rngLast.Value = LastBillDate geschrieben wird, aber dann nach der End Function Zeile verschwindet, wenn ich zum Haupt-Sub zurückkehre.

Ich habe das noch nie zuvor erlebt, das einzige was ich mir vorstellen kann ist, dass es vielleicht damit zu tun hat, dass die Variable ihren Wert verliert, nachdem ich zum Sub zurückkehre, aber sicher ist es schon auf dem Arbeitsblatt geschrieben?

Function DaysRemaining(lngBillDate As Long, lngRow As Long) 

Dim rngLast As Range, rngNext As Range, rngDays As Range 
Dim NextBillDate As Date, LastBillDate As Date 

Set rngLast = Worksheets("Data").Range("G" & lngRow) 
Set rngNext = Worksheets("Data").Range("H" & lngRow) 
Set rngDays = Worksheets("Data").Range("I" & lngRow) 

If lngBillDate > Day(Date) Then 
    NextBillDate = CDate(Format(lngBillDate, "00") & "/" &  Format(Month(Date), "00") & "/" & Year(Date)) 
    LastBillDate = DateAdd("m", -1, NextBillDate) 

Else 
    NextBillDate = CDate(Format(lngBillDate, "00") & "/" & Format(Month(Date) +  1, "00") & "/" & Year(Date)) 
    LastBillDate = DateAdd("m", -1, NextBillDate) 
End If 



rngNext.Value = NextBillDate 
rngLast.Value = LastBillDate 
rngDays.Value = rngNext.Value - Date 
End Function 

Hilfe wie immer geschätzt.

+0

Das ist seltsam. Was passiert, wenn Sie nur einen Wert für 'rngNext' fest codieren? Das könnte helfen, sicherzustellen, dass nichts in diesem Wert wonky ist, der es verursacht. –

+0

Ich bekomme das gleiche Ergebnis hart Codierung beider Variablen, leider RngLast verschwindet an der gleichen Stelle. – User632716

+0

Woops, wie 756tgs sagt, dieses Verhalten wird erwartet, wenn es eine Arbeitsmappenfunktion ist. –

Antwort

1

Es hängt davon ab, wie Sie verwenden oder die DaysRemaing Verfahren verwenden möchten:

  1. Wenn Sie es in Blatt verwenden, dh Sie rufen = DaysRemaining (x, y) dann nach der Funktion Die ausgeführten Werte bleiben nicht wie erwartet. Excel-In-Sheet-Funktionen sind so konstruiert, dass sie nur in die Zelle ausgeben, von der sie aufgerufen werden. Sie können nicht direkt auf Bereiche zugreifen, die rng.value außerhalb der Funktion verwenden. Eine Funktion, die Sie in Tabellenblättern verwenden, kann mehrere Eingänge haben, aber nur einen Ausgang. (Dies ist eine Excel-Grenze). Wenn Sie mehrere Ausgänge benötigen, müssen Sie ein Array-Ergebnis zurückgeben.

  2. Wenn Sie diese obwohl VBA verwenden, dann funktioniert Ihr Code wie erwartet (ich habe versucht, es erfolgreich zu implementieren). Du wirst es nur als eine gute Haushaltsführung brauchen, um es zu einem öffentlichen Sub DaysRemaining (...) zu ändern. Sie benötigen keine Funktion gemäß der Definition einer Funktion, die Sie nicht zurückgeben, sondern nur eine Prozedur verwenden, um eine Remote-Arbeit an dem Blatt auszuführen.

Die folgende:

Public Sub DoDaysRemianing() 
    DaysRemaining CLng(Date), 2 
End Sub 

funktioniert auch gut, aber Sie es durch VBA anrufen.

Verwandte Themen