【问题标题】:Excel VBA - trying to find a date in a row of dates, get "object variable or with block variable not set" errorExcel VBA - 试图在一行日期中查找日期,得到“对象变量或未设置块变量”错误
【发布时间】:2017-08-09 10:55:26
【问题描述】:

以下是我正在尝试做的事情的摘要: 我有两个文件,“yyy”是从跟踪疾病和假期的系统中提取的,“xxx”文件是我们手动记下这些东西的地方,所以我正在尝试制作一个可以交叉检查两者的宏和突出显示摘录中的一致性/不一致。

问题: 当我运行宏时,当它到达以下内容时,我得到一个错误“对象变量或未设置块变量”

设置 y = Range(Workbooks("xxx.xlsm").Sheets("xxx").Range("J2:NZ2").Find(dates.Value).Address) 我试图在 dates.value 和 dateStr 之间交换作为查找内容的参考,但得到相同的错误。

PS。我一遍又一遍地检查所有范围,一切似乎都是正确的。 聚苯乙烯。我可能有一些额外定义的位,否则代码中不存在这些位,为不整洁的代码道歉。我正在尝试克服此错误以完成其余部分...

提前非常感谢!

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

【问题讨论】:

  • Workbooks("xxx.xlsm") 不正确....工作簿名称与文件名不同。
  • 如果我删除 .xlsm 格式,我会收到“主题超出范围”错误。我也打开了这两个文件...
  • 当您已经有合格的对象时,不确定为什么要使用Workbooks("xxx.xlsm").Sheets...WBschedule。我只会使用WBschedule.Sheets...。另外,Workbooks("xxx.xlsm") 已经打开了吗?
  • 代码有相当多的错误:您需要声明每个变量的数据类型 - y 是一个范围,但该行中的其他变量是变体。与wbws 相同。 Set ws=Sheets("Sheet1") - 是指当前活动的工作簿,因为您没有说它在哪本书中。Set dates - 您将其设置为 n - 3 列的地址值,为什么不将其设置为参考n-3 列,因为两个参考都在同一张纸上:Set dates = n.Offset(, -3)Set x = Range... - 表 xxx 后面真的有空格吗?
  • 是的,我开始使用 wbschedule,但后来遇到了问题,然后切换到使用整个东西,因为它是一组非常具体的文件,我首先想获得基本功能工作,以后再优化。是的,这两个文件总是打开的

标签: vba excel


【解决方案1】:

针对您的具体问题(您的代码中还有其他问题):

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 错误。

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

您也不需要将它包装在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

【讨论】:

  • 感谢您的提示,达伦。实际上,我对文本进行了一些更新以解决特定问题,尽管它在技术上仍然存在。让我稍微解释一下 - 似乎 find 函数无法在日期范围内找到日期值。我已经三次检查日期是否正确显示在日期范围内。我也尝试过将日期定义为 long 并寻找它,但由于某些奇怪的原因都不起作用。日期范围基本上是 01/01/2017 到 29/12/2017。当我调试问题时,我可以突出显示变量并查看是否正确找到了 long 或 value,但仍然没有运气
  • ps。非常感谢你坚持我可怕的解释,我很清楚我的解释的复杂性,所以为此道歉:)
【解决方案2】:

所以,我只是决定将 range.find 函数更改为“for each...”方式,并以这种方式找到必要的单元格。仍然不知道为什么 .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

感谢大家的好建议!

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多