2014-07-13 84 views
0

我得到一個類型不匹配錯誤,同時運行此代碼:Excel的VBA:VLOOKUP函數返回類型不匹配錯誤

Private Sub Worksheet_Change(ByVal Target As Range) 

Dim Lastrow1 As Long 
Dim val As Variant 

Lastrow1 = Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row 

With Sheets("Sheet1") 
    Lastrow1 = .Range("A" & Rows.Count).End(xlUp).Row 
    For I = 1 To Lastrow1 
    If (.Cells(I, "A") <> "") Then 
     **val = Application.WorksheetFunction.VLookup(Weekday(I, "A"), day_name, 2, 0)** 
     Cells(I, "B") = val 
    End If 
    Next I 
End With 

End Sub 

下面是表陣列day_name具有以下值:

1 Sunday 
2 Monday 
3 Tuesday 
4 Wednesday 
5 Thursday 
6 Friday 
7 Saturday 

有沒有人有任何建議如何避免這個錯誤?

+0

還有其他的選擇你應該考慮。 你可以做到這一點簡單地用公式和/或格式化 在VBA函數,而不是VLOOKUP,你可以更簡單地返回星期的一天使用 格式的字符串(了myCell,「DDDD」) 你需要考慮的另一件事是,當你的例程寫結果時,這也會觸發事件。您可能需要檢查目標,或禁用事件(然後重新啓用它們),或兩者兼而有之。 –

+0

查看我編輯的回覆以演示不同的事件代碼方式 –

回答

0

不知道你的數據,很難說,但也許你想

Weekday(Cells(I, "A")) 
在功能

編輯

顯示如果我想有所不同的方法

讓單元格與列A中的單元格相鄰,包含文本形式的星期幾或空白,我會編寫事件宏,如下所示。根據數據如何進入單元格,可能需要進行一些更改。

Option Explicit 
Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim rRangeToCheck As Range 
    Dim C As Range 

Set rRangeToCheck = Worksheets("sheet1").Columns(1) 
If Not Intersect(rRangeToCheck, Target) Is Nothing Then 
    Application.EnableEvents = False 
    For Each C In Intersect(rRangeToCheck, Target) 
     If IsDate(C) Then 
      C.Offset(0, 1) = Format(C, "dddd") 
     Else 
      C.Offset(0, 1) = "" 
     End If 
    Next C 
End If 

Application.EnableEvents = True 

End Sub 

現在,如果手動輸入數據到單元格中,上面的工作將會起作用。但是,如果單元格內容是公式的結果,那麼目標將是包含公式先例的單元格,甚至是在不同的工作表上。這些將需要一個不同的方法。

+0

嗨,非常感謝您的回覆。 – user3834451

+0

嗨,它看起來非常簡單和高效!謝謝。但是我得到了運行時錯誤1004-方法「object'global'intersect'在執行此代碼時失敗了。請問您可以幫我 – user3834451

+0

在某個公共站點發布您的工作簿副本,並在此處發佈鏈接。 –

1

平日()用於從日期值中獲取工作日。

所以您應該使用Weekday(.Range("A" & I))從單元格的值中獲取星期幾。

+0

嗨...感謝您的迴應。我已經嘗試過,但運行時錯誤'1004' - 的方法object_worksheet失敗。請幫我編輯這個 – user3834451

+1

。因爲那個代碼是在'With'塊中的......所以應該是'.Range' –

+0

如果這有幫助,請考慮設置我的答案爲接受:) –