2016-03-29 28 views
2

午後、のByRef引数の型の不一致 - エクセル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 

変数はその後、私の機能以下のサブに設定されている:

更新データのB3がフォーマットされ
searchDate = Worksheets("Update Data").Range("B3").Value 

DD/MM/YYYY

関数とsearchDate変数を使用して変数weekdayNameを設定しようとすると、ByRef引数型の不一致が発生します。シート2上

Public weekdayName As String 

サブにおいて:

weekdayName = calcWeekdayName(searchDate) 

B3の電流値が28/03/2016であるが、私はまた、2016年1月1日を試みました。

乾杯

+1

すべてのコードモジュールの最初の行に 'Option Explicit'を置きます。 – GSerg

+0

私は公共の変数を使用していますか?だから私はそれぞれのモジュールですべてをReDimする必要がありますか? – megatron77

+0

@ megatron77 - あなたの質問に答えて、私はあなたの範囲の問題があるかどうかを判断するのに役立ちます。次に、「変数は、私の関数*の下にある*に設定されます。コンパイラが 'searchDate'として渡しているものは、あなたが呼び出した日ではないと思います。 – Comintern

答えて

4

Sheet2は、ワークシートオブジェクトである - それのためのコードビハインドは、クラスモジュールあります。

クラスモジュールと「標準モジュール」は、Publicのメンバーがインスタンスにアクセスする必要があるという点で異なります。

Sheet2.MyPublicVariable = 42を実行することができますが、変数を宣言しているモジュールと同じモジュールでない限り、MyPublicVariable = 42は実行できません。

Option Explicitをモジュールの上部に指定すると、問題が回避されている可能性があります。 searchDateはアクセス不可能であり、したがって宣言されず、VBAコードはコンパイルを拒否することになります。

Option Explicitを指定ないことによって、あなたは宣言されていない変数の使用を許可され、それがVBAでの諸悪の根源です。

使用。オプション。明示的。

0

WeekDayName変数に問題があります。同じ名前のVBA関数との混乱を避けるために、myWeekDayNameという名前を変更する必要があります。

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 
関連する問題