VBA查找返回”;“什么都没有”;以用户形式

VBA查找返回”;“什么都没有”;以用户形式,vba,excel,find,nothing,Vba,Excel,Find,Nothing,我有一份工作表,其中“a”到“I”列填写了数据。a列包含2011年11月30日至2011年12月6日的日期。我有一个userform,其中有两个optionbuttons。选择第一个日期时,将使用所有日期。选择第二个时,可使用6个文本框输入开始日期和结束日期。这些日期用于创建包含所有数据/选定间隔的范围。我使用.find来设置所选开始日期和结束日期的范围 我为此编写了一个代码,它在一个单独的模块中工作,但我无法让它在userform中工作,因为range.Find返回“nothing”我花了一段

我有一份工作表,其中“a”到“I”列填写了数据。a列包含2011年11月30日至2011年12月6日的日期。我有一个userform,其中有两个optionbuttons。选择第一个日期时,将使用所有日期。选择第二个时,可使用6个文本框输入开始日期和结束日期。这些日期用于创建包含所有数据/选定间隔的范围。我使用
.find
来设置所选开始日期和结束日期的范围

我为此编写了一个代码,它在一个单独的模块中工作,但我无法让它在userform中工作,因为
range.Find
返回“nothing”我花了一段时间才让它在模块中工作,因为
range.find
很难与日期结合使用,但现在它工作了,我不知道为什么它在Userform中不工作

我在论坛上搜索了很多,但是没有找到任何对我有帮助的东西。我希望这只是一个打字错误,但我真的不知道为什么它不起作用

这是模块中的代码:

sub Find()
Dim Dates As Range   
Dim Data As Range
Dim LastRow As Long
Dim LastCol As Long

Dim RngStart As Range 
Dim RngEnd As Range
Dim RngDates As Range
Dim DateStart As String
Dim DateEnd As String

Dim TextboxDate1 As Long   'these variables represent the textboxvalues of the userform
Dim TextboxDate2 As Long
Dim TextboxMonth1 As Long
Dim TextboxMonth2 As Long
Dim TextboxYear1 As Long
Dim TextboxYear2 As Long
    TextboxDate1 = 2
    TextboxDate2 = 4
    TextboxMonth1 = 12
    TextboxMonth2 = 12
    TextboxYear1 = 2011
    TextboxYear2 = 2011


    ThisWorkbook.Worksheets("blad1").Activate
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    LastCol = Cells(1, Columns.Count).End(xlToLeft).Column
        Set Data = Range(Cells(1, 2), Cells(LastRow, LastCol))
        Set Dates = Range(Cells(1, 1), Cells(LastRow, 1))

DateStart = TextboxMonth1 & "/" & TextboxDate1 & "/" & TextboxYear1 '"12/2/2011"
DateEnd = TextboxMonth2 & "/" & TextboxDate2 & "/" & TextboxYear2 '"12/4/2011"
    Set RngStart = ThisWorkbook.Worksheets("blad1").Columns("A").find(DateStart)
    Set RngEnd = Columns("a").find(what:=DateEnd, after:=Cells(1, 1), searchdirection:=xlPrevious)
    Set RngDates = Range(RngStart, RngEnd)
        MsgBox RngDates.Address 'should return A160:A447
End Sub
但是,当我尝试在userform中运行此代码时,.find返回“nothing”

我可以看到DateStart和DateEnd定义正确,代码无法返回找到日期的单元格,并给出运行时错误1004:方法“对象范围”\u global“失败,因为我试图将rngdates设置为从零到零的范围

编辑:当我选择第一个选项按钮运行整个代码时,我可以随后使用分离模块创建范围
RngDates
但是,当我使用第二个选项运行代码并在崩溃后停止时,分离模块也找不到所需的单元格,这可能会有所帮助

编辑:澄清是关于2011年12月2日至2011年12月4日的日期,而不是2月


提前感谢

当您使用
.Find
设置
RngStart
时,您可以指定工作簿和工作表,但当您使用
.Find
获取
RngEnd
时,您不指定工作表


这可能会导致查找失败。

我在工作表“Sheet1”的a列中填写了一些日期

我使用以下控件创建了一个表单:

  • 文本框:txtDate
  • 命令按钮:cmdFind
  • 标签:lblResult
这是表格中的代码:

Private Sub cmdFind_Click()

  Dim Rng As Range
  Dim DateDat As Date

  With Worksheets("Sheet1")

    DateDat = CDate(txtDate)

    Set Rng = .Columns("A").Find(What:=DateDat)

    If Rng Is Nothing Then
      lblResult.Caption = Format(DateDat, "d mmm yyyy") & " not found"
    Else
      lblResult.Caption = Format(DateDat, "d mmm yyyy") & " found in " & _
                          Replace(Rng.Address, "$", "")
    End If

  End With

End Sub
每次我在文本框中输入日期并单击按钮时,查找结果都会显示在标签中
CDate
对日期的构成有点挑剔,但除此之外,我用此代码查找日期并不困难


注意Find语句中的变量类型为
Date

我很惊讶您居然能让它工作。Excel将日期存储为1900年1月1日之后的天。“12/2/2011”只是一个显示值。例如,请尝试
debug.Print clng(dateserial(2011,11,30))
,然后查看显示的内容。@TonyDallimore我确实在查找日期时遇到了一些问题,但此链接:包含一个关于在页面底部使用“查找日期”的小说明。我也尝试过不同的格式化方法,但几乎没有成功。我没有尝试过你给出的链接中的想法,但我认为它们是印刷错误<代码>“12/2/2011”不是Excel中的标准日期格式。我想他们的意思是2011年12月2日。美国民间风格的hash之间的日期是VBA的日期文字。我在运行的模块中尝试了hash之间的日期,但这导致查找“nothing”,而“12/2/2011”则导致查找正确的单元格。这是用户表单中的代码,我不知何故无法使用,也不能使用您建议的哈希之间的dateformat。这是真的,它不干净,但这不是问题的原因。
RngStart
RngEnd
在用户表单中都是“无”的,在模块
中。find
能够找到这两个。是的,这对我来说很有效。我用
Cdate
添加了一个额外的变量,并搜索返回正确单元格的变量
Private Sub cmdFind_Click()

  Dim Rng As Range
  Dim DateDat As Date

  With Worksheets("Sheet1")

    DateDat = CDate(txtDate)

    Set Rng = .Columns("A").Find(What:=DateDat)

    If Rng Is Nothing Then
      lblResult.Caption = Format(DateDat, "d mmm yyyy") & " not found"
    Else
      lblResult.Caption = Format(DateDat, "d mmm yyyy") & " found in " & _
                          Replace(Rng.Address, "$", "")
    End If

  End With

End Sub