【问题标题】:VBA date type mismatchVBA 日期类型不匹配
【发布时间】:2014-05-22 12:39:29
【问题描述】:

我正在尝试在 VBA 中使用 vlookup 函数,以便根据当前日期,它将与 Excel 工作表中的日期匹配并给出相应的值。这将通过邮件发送。我的问题是,当我将变量声明为 Date 时,它​​的显示类型不匹配,但如果它是字符串,则没有任何问题(但我还必须以文本格式在工作簿中输入相应的值)。这有点乏味.我一直在excel中使用短日期,但不知道为什么它显示类型不匹配。下面提到了代码

Sub Send_Email_Using_VBA()
    Dim Email_Subject, Email_Send_From, Email_Send_To, _
        Email_Cc, Email_Bcc, Email_Body As String
    Dim Ldate As Date
    Dim Mail_Object, Mail_Single As Variant

    Email_Subject = "Trying to send email using VBA"
    Email_Send_From = "*****@*****.***"
    Email_Send_To = "***@****.***"
    Email_Cc = ""
    Email_Bcc = ""
    Ldate = Date
    Email_Body = Application.VLookup(Ldate, Sheet1.Range("A1:B4"), 2, False)

    On Error GoTo debugs
    Set Mail_Object = CreateObject("Outlook.Application")
    Set Mail_Single = Mail_Object.CreateItem(0)

    With Mail_Single
        .Subject = Email_Subject
        .To = Email_Send_To
        .cc = Email_Cc
        .BCC = Email_Bcc
        .Body = Email_Body
        .send
    End With
    Exit Sub

debugs:
    If Err.Description <> "" Then MsgBox Err.Description
End Sub

【问题讨论】:

  • Option Explicit开头,注意Email_Subject是Variant,Email_Body是String。
  • Dim LDate As String 然后LDate = CStr(Date)?

标签: vba excel excel-2010


【解决方案1】:

我建议您将 Sheet1.Range("A1:B4") 更改为 Sheet1.Range("A1:B4").Value 以便将数组而不是范围对象传递给 VLookup。

VLookupWorksheetFunction 的成员,因此您应该将Application.VLookup 更改为WorksheetFunction.VLookup

我使用了这个测试数据:

电子邮件是通过在 vlookup 中传递范围值来发送的

    Dim Email_Subject
    Dim Email_Send_From As String
    Dim Email_Send_To As String
    Dim Email_Cc As String
    Dim Email_Bcc As String
    Dim Email_Body As String
    Dim Mail_Object
    Dim Mail_Single As Variant

    Email_Subject = "Trying to send email using VBA"
    Email_Send_From = "*****@*****.***"
    Email_Send_To = "***@****.***"
    Email_Cc = ""
    Email_Bcc = ""

    On Error GoTo Failed_Lookup
    Email_Body = WorksheetFunction.VLookup(Format(Date, "dd-mm-yyyy"), Sheet1.Range("A1:B4").Value, 2, False)

    On Error GoTo debugs
    Set Mail_Object = CreateObject("Outlook.Application")
    Set Mail_Single = Mail_Object.CreateItem(0)

    With Mail_Single
        .Subject = Email_Subject
        .To = Email_Send_To
        .cc = Email_Cc
        .BCC = Email_Bcc
        .Body = Email_Body
        .send
    End With

    Exit Sub

debugs:
    If Err.Description <> "" Then MsgBox Err.Description
    Exit Sub

Failed_Lookup:
    If Err.Number = 1004 Then
        MsgBox "Unable to find the date " & Date
    End If

【讨论】:

  • 我尝试了上面的代码,但它抛出了错误号 1004。我正在使用 dd-mm-yyyy 中的日期格式,甚至尝试了您通过自定义设置使用的上述格式,但它仍然显示同样的错误
  • 感谢您的帮助。你能告诉我为什么它不能在 dd-mm-yyyy 格式下工作,而是在处理这个。因为,我无法使用格式画家来进入这种格式。
  • 只需使用 Format() 以与工作表上的格式相同的格式获取日期。 WorksheetFunction.VLookup(Format(Ldate, "dd-mm-yyyy"), Sheet1.Range("A1:B4").Value, 2, False)