excel:使用查找的vba类型不匹配

Posted

技术标签:

【中文标题】excel:使用查找的vba类型不匹配【英文标题】:excel: vba type mismatch using find 【发布时间】:2017-07-07 14:47:32 【问题描述】:

我有这张表,其中:

如果I 列中单元格中的值是“Não marcou férias”,那么它应该搜索整个列A 并查找该特定人员的唯一编号出现多次的所有时间。

如果唯一编号出现两次或更多次,并且该行的列 I 不是“Não marcou férias”,则应与当前年份进行比较,并在 @987654330 列的相应单元格中写入 ATUAL @。如果是真的,那么K 列中具有“Não marcou férias”的行应该是空白的。

这是我的工作表:

这就是我想要发生的事情:

如您所见,我有两个编号为 59837 的条目,其中一个是“Não marcou férias”,我希望它遍历 A 列并查找是否存在另一个条目,因为它是最新的,它应该在上面写上“ATUAL”。

这是我的代码:

Sub test()

Dim j As Long
Dim lastrow As Long
Dim ws1 As Worksheet
Dim date1 As Date, date2 As Date

Set ws1 = Sheets("Plan1")

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

For j = 2 To lastrow

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

If ws1.Cells(j, 9) = "Não marcou férias" Then
k = ws1.Cells(j, 1).Value
    With ws1.Range("A2:A" & lastrow)
    Set c = .Find(k, LookIn:=xlValues)

    If Not c Is Nothing Then
    firstAddress = c.Address
        Do
            If ws1.Cells(j, 9) <> "Não marcou férias" Then
                If Year(date1) = Year(Date) Or Year(date2) = Year(Date) Then
                    ws1.Cells(j, 13) = "ATUAL"
                Else
                    ws1.Cells(j, 13) = ""
                End If
            End If

    Set c = .FindNext(c)

        If c Is Nothing Then
            GoTo DoneFinding
        End If
        Loop While c.Address <> firstAddress
    End If
DoneFinding:
    End With
End If

Next j

End Sub

但是当我尝试运行时,我得到:

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

并且这一行被高亮显示:

date1 = ws1.Cells(j, 9)

我的 Excel 是葡萄牙语,所以在这里我们使用 dd/mm/yyyy 之类的日期格式,并且我的所有列都正确设置为日期。

有人有建议吗?我不知道为什么我已经应用了THIS 解决方案,所以我再次遇到这种类型不匹配。

编辑:我已经测试了建议的解决方案,但我仍然在同一行中遇到同样的问题。

Option Explicit
Sub test2()

Dim j As Long
Dim lastrow As Long
Dim ws1 As Worksheet
Dim date1 As Date, date2 As Date
Dim k As Long
Dim c As Range
Dim firstAddress As String

Set ws1 = Sheets("Plan1")

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

For j = 2 To lastrow

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

If Not IsDate(ws1.Cells(j, 9)) Then
    k = ws1.Cells(j, 1).Value
    With ws1.Range("A2:A" & lastrow)
    Set c = .Find(k, LookIn:=xlValues)

    If Not c Is Nothing Then
    firstAddress = c.Address
        Do
            If IsDate(ws1.Cells(j, 9)) Then
                If Year(date1) = Year(Date) Or Year(date2) = Year(Date) Then
                    ws1.Cells(j, 13) = "ATUAL"
                Else
                    ws1.Cells(j, 13) = ""
                End If
            End If

    Set c = .FindNext(c)

        If c Is Nothing Then
            GoTo DoneFinding
        End If
        Loop While c.Address <> firstAddress
    End If
DoneFinding:
    End With
End If

Next j

End Sub

【问题讨论】:

If ws1.Cells(j, 9) = "Não marcou férias" Then: ws1.Cells(j, 9) 不是日期,所以 date1 = ws1.Cells(j, 9) 当然是 type mismatch 因为 Dim date1 As Date :) 。我认为您应该首先与If IsDate(ws1.Cells(j, 9) ) 核对并考虑到这一点。 @A.S.H 我真的明白了,尽管我需要在该列中进行比较。例如,我尝试了 Vityata 的解决方案,Message Box 将 I6 指定为日期。我可以尝试改变我的比较。 【参考方案1】: 始终确保在代码顶部包含 Option Explicit。 只需将msgbox ws1.Cells(j, 9).address 写在错误行的上方即可。 检查出现错误之前的 MsgBox。 我可以打赌虚拟啤酒,地址指向的是一个值,而不是日期。例如在你的截图中I6,用葡萄牙语说一些关于假期和预订的好话。

在您的代码中,您可以添加类似If IsDate(ws1.cells(j,9)) then 的内容。它将检查给定值是否为日期。在您的情况下,Não marcou férias 无法解析为 Date 格式,因此您会收到错误消息。或者干脆尝试像这样替换代码位置:

For j = 2 To lastrow    
   If ws1.Cells(j, 9) <> "Não marcou férias" Then
      date1 = ws1.Cells(j, 9)
      date2 = ws1.Cells(j, 12)
      k = ws1.Cells(j, 1).Value
      With ws1.Range("A2:A" & lastrow)

如果值不是“Nao marcou ferias”,那么它可能是一个日期(尽管最好使用IsDate())。

玩得开心,TGIF

【讨论】:

让我们看看这啤酒会不会出现!无论如何,我已经测试了两件事:当我不使用Option Explicit 时,代码运行良好,并且消息框指定I6 也作为日期。然后它再次出现类型不匹配。然后,当我尝试使用 Option Explicit 时,我得到 k = ws1.Cells(j, 1).Value 突出显示并且未定义变量。 Option Explicit的意思是告诉你忘记在上面写Dim k as Something了。在您的屏幕截图中,I6 不是日期格式。你说 MessageBox 指定I6 也是一个日期是什么意思? 是的,是的,我现在声明我的所有变量。我想说的是I6 不是日期,但即使上面有文字,整列也会被格式化为日期。所以我认为它会以同样的方式工作。 好吧,如果整列格式化为Date,但I6中的值不是日期,VBA引擎还在寻找日期,解析成date1而且葡萄牙语字符串无法以任何方式解析为日期... 哦,现在我明白了。所以我的想法是行不通的。无论如何,我无法更改此值。应该是Não marcou férias 所以我必须改变我的比较,我猜......

以上是关于excel:使用查找的vba类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

切换到 64 位 Excel 后如何修复 VBA“类型不匹配”错误

ByRef 参数类型不匹配 - Excel VBA

excel VBA匹配,这是我写的正则表达式:

Excel VBA 类型不匹配错误

包含不同类型 VBA Excel 的组的每个下一个循环中的类型不匹配

EXCEL VBA 不完全匹配自动过滤器