Excel的VBA – 试图find一个date的行date,得到“对象variables或块variables未设置”错误

下面是我想要做的事情的总结:我有两个文件,“yyy”是一个系统logging疾病和假期的摘录,“xxx”文件是我们手动记下这些东西的地方,所以我是试图制作一个macros来检查两者,并强调提取中的一致性/不一致性。

问题:当我运行macros时,出现以下错误“对象variables或块variables未设置”

Set y = Range(Workbooks(“xxx.xlsm”)。Sheets(“xxx”).Range(“J2:NZ2”)。Find(dates.Value).Address)我试着在dates.value和dateStr作为参考find什么,但得到相同的错误。

PS。 我检查了所有的范围,一遍又一遍,一切似乎是正确的。 PPS。 我可能有一些额外的定义位,否则在代码中不存在,为不整齐的代码道歉。 我试图通过这个错误来完成其余的部分…

提前谢谢了!

Option Explicit Sub sickhol_check() Dim names, dates, schedDates, n, schedName, x, y As Range Dim wb, WBschedule As Workbook Dim ws, WSschedule As Worksheet Dim nameStr As String Dim dateStr As Long Set wb = Workbooks("yyy.xlsm") Set ws = Sheets("Sheet1") Set WBschedule = Workbooks("xxx.xlsm") Set WSschedule = WBschedule.Sheets("xxx") Set names = ThisWorkbook.Sheets("Sheet1").Range("D2:D1882") 'yyy workbook Set schedName = Workbooks("xxx.xlsm").Sheets("xxx ").Range("F4:F300") Set schedDates = Workbooks("xxx.xlsm").Sheets("xxx ").Range("J2:NZ2") For Each n In names 'working in yyy workbook If n.Value <> "" Then Set dates = ThisWorkbook.Sheets("Sheet1").Range(n.Offset(0, -3).Address) nameStr = n.Value dateStr = dates.Value If n.Value = schedName.Find(n.Value) Then Set x = Range(Workbooks("xxx.xlsm").Sheets("xxx ").Range("F4:F300").Find(nameStr).Address) Set y = Range(Workbooks("xxx.xlsm").Sheets("xxx ").Range("J2:NZ2").Find(dates.Value).Address) If n.Offset(0, 11).Value = "Sick Leave" Then If Workbooks("xxx.xlsm").Sheets("xxx ").Cells(x.Row, y.Column).Value = "Sick" Or Workbooks("xxx.xlsm").Sheets("xxx ").Cells(x.Row, y.Column).Value = "Sick - pending" Or Workbooks("xxx.xlsm").Sheets("xxx").Cells(x.Row, y.Column).Value = "Half-day Sick" Then With n .Interior.Color = RGB(0, 255, 0) End With Else: With n .Interior.Color = RGB(255, 0, 0) End With GoTo a: End If ElseIf n.Offset(0, 11).Value = "Holiday Annual Leave" Then If Workbooks("xxx.xlsm").Sheets("xxx").Cells(x.Row, y.Column).Value = "Hol. Approved" Or Workbooks("xxx.xlsm").Sheets("xxx").Cells(x.Row, y.Column).Value = "Half-day Hol." Then With n .Interior.Color = RGB(0, 255, 0) End With Else: With n .Interior.Color = RGB(255, 0, 0) End With GoTo a: End If ElseIf n.Offset(0, 11).Value = "Leave - Unpaid" Then If Workbooks("xxx.xlsm").Sheets("xxx").Cells(x.Row, y.Column).Value = "TimeOff Approv." Or Workbooks("xxx.xlsm").Sheets("xxx").Cells(x.Row, y.Column).Value = "Unavailable" Then With n .Interior.Color = RGB(0, 255, 0) End With Else: With n .Interior.Color = RGB(255, 0, 0) End With GoTo a: End If End If MsgBox x.Address & " " & y.Address Else: GoTo a: End If Else: GoTo a: End If a: Next 

对于你的具体问题(你的代码中有其他人):

 Set y = Range(Workbooks("xxx.xlsm").Sheets("xxx ").Range("J2:NZ2").Find(dates.Value).Address) 

如果你的工作表中不存在dates.value ,你会得到一个Object variable or With block variable not set错误。

这是因为你告诉它find价值并返回它的地址。 你应该尝试find价值,检查是否find,然后看看地址。

你也不需要把它封装在Range因为FIND函数无论如何都会返回一个范围参数。

 Set y = Workbooks("xxx.xlsm").Sheets("xxx ").Range("J2:NZ2").Find(dates.Value) If Not y Is Nothing Then MsgBox y.Address 'Other code that relies on y. End If 

所以,我只是决定改变range.find函数为“每个…”的方式,并find必要的细胞这种方式。 仍然不知道为什么.find没有工作,但问题基本上不存在了。 供参考:我改变了以下内容

  Set y = Range(Workbooks("xxx.xlsm").Sheets("xxx ").Range("J2:NZ2").Find(dates.Value).Address) 

如下:

  For Each d In Workbooks("xxx.xlsm").Sheets("xxx").Range("J2:NZ2") If d = dates.Value Then Set y = d Else: GoTo b End If b: Next 

谢谢大家好的提示!