2016-03-29 47 views
2

下午,ByRef參數類型不匹配 - Excel的VBA

我有一個函數從一個日期計算工作日名稱:

Function calcWeekdayName(calcDate As Date) As String 

Dim calcWeekday As Integer 
calcWeekday = Weekday(calcDate, vbMonday) 

calcWeekdayName = weekdayName(calcWeekday, True, vbMonday) 

End Function 

然後我使用一個公共變量的日期傳遞給這個函數。公共變量聲明上表2:

Public searchDate As Date 

可變然後在下面我的函數的子集:

searchDate = Worksheets("Update Data").Range("B3").Value 

上更新數據B3被格式化日/月/年

當我嘗試使用函數和searchDate變量設置變量weekdayName時,我得到一個ByRef參數類型不匹配。

在表2:

Public weekdayName As String 

在子:

weekdayName = calcWeekdayName(searchDate) 

B3的當前值是28/03/2016但我還試圖2016年1月1日。

乾杯

+1

將'Option Explicit'放置爲所有代碼模塊的第一行。 – GSerg

+0

當我使用公共變量?所以我需要在每個模塊中重新使用它們? – megatron77

+0

@ megatron77 - 回答你的問題,沒有。我會幫助確定你是否有範圍問題。 「你的意思是」變量被設置在我的函數*下面的* sub中「。我猜測,無論編譯器傳遞的是「searchDate」,在您撥打電話時都不是日期。 – Comintern

回答

4

Sheet2是一個工作表對象 - 代碼隱藏它是一個類模塊

類模塊和「標準模塊」的不同之處在於它們的Public成員要求實例是可訪問的。

所以你可以做Sheet2.MyPublicVariable = 42,但你不能只做MyPublicVariable = 42,除非你在同一個模塊聲明變量

通過在模塊的頂部指定Option Explicit可以防止您的問題;那麼,searchDate將無法​​訪問,因此未聲明,VBA代碼將拒絕編譯。

通過指定Option Explicit,你允許使用未聲明的變量的,那就是在VBA所有罪惡的根源。

使用。選項。明確。

0

您對WeekDayName變量有問題。您應該將其重命名爲myWeekDayName以避免與具有相同名稱的VBA函數混淆。

Public searchDate As Date 
Public myWeekDayName As String 

Function calcWeekdayName(calcDate As Date) As String 
    Dim calcWeekday As Integer 
    calcWeekday = Weekday(calcDate, vbMonday) 
    calcWeekdayName = VBA.weekdayName(calcWeekday, True, vbMonday) 
End Function 

Sub test() 
    searchDate = Worksheets("Sheet1").Range("B3").Value 
    myWeekDayName = calcWeekdayName(searchDate) 
End Sub