VBA查找在userform中返回“nothing”

时间:2015-07-31 11:25:07

标签: excel vba excel-vba find nothing

我有一个工作表,其中“A”列到“I”用数据填充。 a栏包含2011年11月30日至2011年12月12日的日期。我有一个userform,其中有2个选项按钮。选择第一个时,将使用所有日期。当第二个被选中时,可以使用6个文本框来输入开始日期和结束日期。这些日期用于创建具有所有数据/所选间隔的范围。我使用.find来制作所选择的开始和结束范围。

我为此编写了一个代码,该代码在单独的模块中工作,但我无法在userform中工作,因为range.Find返回“没有”。我花了一段时间才使它在模块中工作,因为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”

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被正确定义,代码只是没有设法返回找到日期的单元格并给我一个运行时错误1004:方法'对象范围'_global'失败,因为我试图将rngdates设置为从无到有的范围。

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

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

提前致谢

2 个答案:

答案 0 :(得分:0)

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

这可能会导致查找失败。

答案 1 :(得分:0)

我在工作表“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类型。