我有一个工作表,其中“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月。
提前致谢
答案 0 :(得分:0)
当您使用.Find
设置RngStart
时,您指定了工作簿和工作表,但是当您使用.Find
获取RngEnd
时,您未指定工作表。
这可能会导致查找失败。
答案 1 :(得分:0)
我在工作表“Sheet1”的A列填写了一些日期。
我使用以下控件创建了一个表单:
这是表格中的代码:
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
类型。