【问题标题】:excel: vba type mismatch comparing datesexcel:比较日期的vba类型不匹配
【发布时间】:2017-07-04 19:36:06
【问题描述】:

我正在尝试比较两个日期(在不同列中)的年份和当前年份日期。如果年份相同,则应在第 13 列的相应行上写“ATUAL”一词,如果年份不同,则不应写任何内容。

这是我迄今为止尝试过的。

Sub CopyColumn2()

Dim i As Long
Dim j As Long
Dim lastrow As Long
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim wbk As Workbook
Dim wb As Worksheet

Set wbk = Workbooks.Open("I:\CGP\DEOPEX\01 - Supervisão\01 - Administrativo\06- ADM - Taís e Natalia\Férias - Aprovadas\FÉRIAS TÉCNICOS EXTERNAS.xlsx")
Set ws1 = ThisWorkbook.Sheets("BASE_TOTAL")
Set ws2 = wbk.Worksheets("FUNCIONÁRIOS")

lastrow = ws2.Range("A" & Rows.Count).End(xlUp).Row


For j = 2 To lastrow
    If Year(ws1.Cells(j, 9)) = Year(Date) Or Year(ws1.Cells(j, 12)) = Year(Date) Then
        ws1.Cells(j, 13) = "ATUAL"
    Else
        ws1.Cells(j, 13) = ""
    End If
Next j   

End Sub

日期放置在 I 和 L 列中,所有列都设置为日期。我的 Excel 是葡萄牙语,所以我的日期格式是 dd/mm/yyyy。

当我运行我的代码时,我会收到以下消息:

运行时错误 13:类型不匹配

并且这部分被高亮显示:

If Year(ws1.Cells(j, 9)) = Year(Date) Or Year(ws1.Cells(j, 12)) = Year(Date) Then

有人知道这里有什么问题吗?它应该可以工作,因为我所有的日期都以相同的方式格式化。

【问题讨论】:

  • 你检查哪一行报错了吗?
  • 1) 如前所述,逐行逐行检查您的代码,并查看错误发生的位置。 2)虽然您的日期都以相同的方式格式化,但它们是格式化为文本还是 Excel 日期?将它们全部以相同的方式格式化,但全部作为文本不会对您的公式有所帮助。以正确的格式设置日期很重要,否则您需要先将其转换为您需要的格式。
  • @EganWolf 是的,我编辑了这个问题。
  • @ForwardEd 我编辑了代码,突出显示了该行。它们都被格式化为 Excel 日期而不是文本。我想问题出在Date...我认为格式是 mm-dd-yyyy 或与我使用的不同。

标签: vba excel


【解决方案1】:

试试这个:

  1. 声明日期变量Dim date1 As Date, date2 As Date
  2. 为变量设置值

    date1 = ws1.Cells(j, 9) date2 = ws1.Cells(j, 12)

  3. If 语句中使用变量

    If Year(date1) = Year(Date) Or Year(date2) = Year(Date) Then

【讨论】:

  • 它有效,谢谢!为什么这会对我的代码产生影响?我很好奇。
  • @paulinhax 老实说,我不知道。它以某种方式与日期格式的差异有关。 VBA 使用美国格式,即mmddyyyy,Excel 使用您的区域,在欧洲(我想它在欧洲无处不在)是ddmmyyyy。因为这个 VBA 不理解直接从单元格中获取的日期,无论设置什么格式。答案中的技巧以某种方式将日期从 Excel 格式转换为 VBA 格式,并正确执行。它还可用于将日期从 VBA 设置为单元格。如果你直接这样做,你可能会错位月份和日期。
最近更新 更多