2016-08-01 61 views
0

在下面的代碼中,我設置了3個範圍等於變量。我對rngNextrngDays沒有任何問題,他們將正確的變量分配到正確的範圍 - 無後顧之憂。返回mainsub時函數中設置的範圍清零

Bizarely,rngLast不寫入工作表。更確切地說(在進入代碼時),我可以看到正在預期的值被寫入rngLast.Value = LastBillDate行的表格中,然後在End Function行後消失,當我返回到主分支時。

我以前從未遇到過這種情況,我能想到的唯一的事情就是它可能會在變量失去其價值後再回到子變量中,但它肯定已經寫入工作表了?

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 

幫助讚賞一如既往。

+0

這很奇怪。如果你只爲'rngNext'的硬編碼值會發生什麼?這可能有助於確保這種價值導致它沒有任何不可思議的東西。 –

+0

我得到相同的結果硬編碼兩個變量,不幸的是rngLast消失在同一點。 – User632716

+0

Woops,如756tgs所言,如果它是一個工作簿函數,則會出現此行爲。 –

回答

1

這取決於你如何使用或希望使用DaysRemaing步驟:

  1. 如果在表使用它,也就是說,你在呼喚=功能後DaysRemaining(X,Y),那麼已執行的值不會像您期望的那樣保持。 Excel內部函數只能輸出到它們被調用的單元格,您不能使用rng.value函數以外的其他函數。您在表單中使用的功能可以有多個輸入,但只有一個輸出。 (這是一個優秀的限制)。如果你想要多個輸出,那麼你需要返回一個數組結果。

  2. 如果你通過VBA使用這個,那麼你的代碼按預期工作(我試着成功實現它)。您只需將家務管理改爲Public Sub DaysRemaining(...)即可。根據函數的定義,您不需要函數,您不會返回任何內容,只需使用過程在表單上執行一些遠程工作即可。

以下:

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

而且工作得很好,但是你通過VBA調用它。