Excel VBA:Vlookup函数返回类型不匹配错误

时间:2014-07-13 15:11:28

标签: excel excel-vba excel-formula vba

运行此代码时出现类型不匹配错误:

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

有没有人对如何避免此错误有任何建议?

2 个答案:

答案 0 :(得分:1)

Weekday()用于从日期值获取工作日。

因此,您应该使用Weekday(.Range("A" & I))从单元格的值中获取工作日。

答案 1 :(得分: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

现在,如果将数据手动输入到单元格中,则上述操作将起作用。但是如果单元格内容是公式的结果,那么target将是包含公式先例的单元格,或者甚至是不同的工作表。那些需要采取不同的方法。