2017-07-20 9 views
0

私がここでやろうとしているのは、値の値が等しいかどうかを確認してそこから移動することです。 STDの場合は、請求書日付に曜日を追加するだけです。 BONM(翌月の始まり)の場合、請求書の日付に日を追加して、翌月の初めを回答として参照する必要があります。 EOM(月末)に請求書日付に日を追加し、その当月の末尾を参照する必要がある場合。私が得ているエラーのイメージを添付しました。さまざまな方法で調光しようとしましたが、それでも動作していません。VBA関数エラー

Function OldMaturity(term As Range, invoicedate As Range, days As Range) As Date 

Dim term As String 
Dim invoicedate As Date 
Dim days As Long 
Dim val1 As Long 
Dim val2 As Long 


term = Termtype.Value 
invoicedate = invoicedate.Value 
days = days.Value 
val1 = val1.Value 
val2 = val2.Value 

If term = "STD" Then 

OldMaturity = invoicedate + days 
Exit Function 
End If 

If term = "BONM" Then 
val1 = invoicedate + days 
val2 = DateAdd("m", 1, val1) 
OldMaturity = DateSerial(Year(val2), Month(val2), 1) 
Exit Function 
End If 

If term = "EOM" Then 
val1 = invoicedate + days 
OldMaturity = DateSerial(Year(val1), Month(val1) + 1, 0) 
Exit Function 
End If 
End If 


End Function 

enter image description here

+1

必要はありません。 –

+1

実際には**これを実行してはいけません。そうしないと、コンパイルエラーが発生します。 – Andre

答えて

3

これを試してください:あなたが関数内のパラメータを再定義する

Public Function OldMaturity(term As Range, invoicedate As Range, days As Range) As Date 

    Dim d As Date 
    Select Case term.Value 
     Case "STD": 
      OldMaturity = DateAdd("y", days.Value, invoicedate.Value) 

     Case "BONM": 
      d = DateAdd("y", days.Value, invoicedate.Value) 
      OldMaturity = DateAdd("m", 1, DateSerial(Year(d), Month(d), 1)) 

     Case "EOM": 
      d = DateAdd("y", days.Value, invoicedate.Value) 
      OldMaturity = DateAdd("y", -1, DateAdd("m", 1, DateSerial(Year(d), Month(d), 1))) 

     Case Else: 
      'do nothing 
    End Select 
End Function 


Sub Test() 
    'invoicedate: 15/03/2017 
    'days: 10 
    Debug.Print "STD: " & OldMaturity(Range("A1"), Range("B1"), Range("c1")) 
    Debug.Print "BONM: " & OldMaturity(Range("A2"), Range("B2"), Range("c2")) 
    Debug.Print "EOM: " & OldMaturity(Range("A3"), Range("B3"), Range("c3")) 
End Sub 

'Output: 
'STD: 25/03/2017 
'BONM: 01/04/2017 
'EOM: 31/03/2017 
+0

これは素晴らしい方法です!どうもありがとうございます!私は最後の質問が1つあります。その答えは短い日付形式ではなく、数字として出てきます。私はその機能を日付として示したにもかかわらず。答えを日付形式に変換するだけで別のコードを使用する必要がありますか? – KateLO

+0

Excelは日付を数値として扱うため、セル上にある場合は日付としてフォーマットする必要があります。上記の例のようなVBAでは、実際の日付として表示されます。 –

1

@Vincent Gが言及したものを後に、あなたは、関数のパラメータを再定義する必要はありません。また、最後にend ifというステートメントがあります。

編集:もう1つのエラーが見つかりました。 term = "STD"の場合、OldMaturityの戻り値の型はDateではありません。

Function OldMaturity(term As Range, invoicedate As Range, days As Range) As Date 

'variables 
Dim val1 As Long 
Dim val2 As Long 


term = Termtype.Value 
invoicedate = invoicedate.Value 
days = days.Value 
val1 = val1.Value 
val2 = val2.Value 

If term = "STD" Then 
    OldMaturity = invoicedate + days 
    Exit Function 
End If 

If term = "BONM" Then 
    val1 = invoicedate + days 
    val2 = DateAdd("m", 1, val1) 
    OldMaturity = DateSerial(Year(val2), Month(val2), 1) 
    Exit Function 
End If 

If term = "EOM" Then 
    val1 = invoicedate + days 
    OldMaturity = DateSerial(Year(val1), Month(val1) + 1, 0) 
    Exit Function 
End If 



End Function