VBA查找返回“没有”在用户窗体中

我有一个工作表,其中列“A”到“我”充满了数据。 列a包含从2011年11月30日至2011年6月12日的date。 我有一个用户窗体,其中有2个选项button。 select第一个时,将使用所有date。 当第二个被选中的文本框可以用来input一个开始和结束date。 这些date用于创build一个包含所有数据/选定时间间隔的范围。 我使用.find来创build一个选定的开始和结束date范围。

我为此写了一个代码,它在单独的模块中工作,但是我无法在用户表单中工作,因为range.Find返回“ range.Find ”。 我花了一段时间让它在模块中工作,因为range.find很难与date结合使用,但现在它的工作原理我不知道为什么它不能在用户窗体中工作。

我已经广泛search论坛,但找不到任何帮助我的东西。 我希望这只是一个打字错误,但我真的找不到为什么它不工作。

这是模块中的代码:

 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 

但是,当我尝试在用户窗体中运行此代码时,.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 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)) If OptionButton1.Value = False And OptionButton2.Value = False Then MsgBox "specify time domain" End If If OptionButton1.Value = True Then Set RngDates = ThisWorkbook.Worksheets("blad1").Range(Cells(2, 1), Cells(LastRow, 1)) End If If OptionButton2.Value = True Then 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 If 

我可以看到,DateStart和DateEnd被正确定义,代码只是不会设法返回finddate的单元格,并给我一个运行时错误1004:方法的范围对象_global失败,因为我试图设置作为从无到有的范围的变化。

编辑:这可能是帮助知道,当我运行第一个选项buttonselect整个代码后,可以使用单独的模块来创build范围RngDates但是,当我运行代码使用第二个select,我停止它后,崩溃,单独模块也不会find所需的单元格。

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

提前致谢

我用一些date填充了工作表“Sheet1”的A列。

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

  • 文本框:txtDate
  • 命令button: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 

每次我在文本框中input一个date,然后单击button,查找的结果就会显示在标签中。 CDate是关于什么构成一个date有点挑剔,但除此之外,我没有find与此代码的date的困难。

注意 Find语句中的variables是Datetypes的。

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

这可能会导致找不到。