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“类型不匹配”错误