2017-02-17 59 views
0

尝试创建一个搜索按钮,当在单元格(B10)中输入时间并按下按钮时,将会将值复制到工作表。尝试了几个教程,但我一直在做错误的事情。使用时间vba的搜索按钮

搜索功能在sheet1上,我的所有数据都在sheet2上。在单元格B10中输入日期和时间(m/dd/yyyy hh:mm:ss),并将信息复制/粘贴到单元格D10:I10中。表2中的时间在A中,而我想要的数据是B到G.搜索只应返回一行值。

我在代码中做了什么错误?

Sub search() 

Dim erow As Long 
Dim ws As Worksheet 
Dim lastrow As Long 
Dim count As Integer 

lastrow = Sheets("Sheet2").Cells(Rows.count, 1).End(xlUp).Row 

For x = 2 To lastrow 

If Sheets("Sheet2").Cells(x, 1) = Sheet1.Range("B10") Then 
Sheet1.Range("D10") = Sheets("Sheet2").Cells(x, 2) 
Sheet1.Range("E10") = Sheets("Sheet2").Cells(x, 3) 
Sheet1.Range("F10") = Sheets("Sheet2").Cells(x, 4) 
Sheet1.Range("G10") = Sheets("Sheet2").Cells(x, 5) 
Sheet1.Range("H10") = Sheets("Sheet2").Cells(x, 6) 
Sheet1.Range("I10") = Sheets("Sheet2").Cells(x, 7) 
End If 

End Sub 
+0

'Rows'在'Rows.Count'(隐含)指的是什么工作是有效的。如果这不是'Sheet2',并且你的代码有效,那么它运气不好。最好限定“Rows”调用它正在查看的工作表。您还应该从'Worksheets'集合中获取工作表引用,因为'Sheets'集合可以包含图表和其他非工作表表单类型。 –

+1

您的'For'循环需要'Next'令牌来终止。 –

回答

1

Sheet1声明为变量吗?我没有看到你设置它的任何地方。试试这个:

Sub search() 

    Dim erow As Long 

    Dim wbTarget as Workbook 
    Dim wsTarget as Worksheet 

    Dim wsSource as Worksheet 

    Dim ws As Worksheet 
    Dim lastrow As Long 
    Dim count As Integer 

    Dim r as Range 

    Set wbTarget = ThisWorkbook 
    Set wsTarget = wbTarget.Sheets("Sheet1") 

    Set wsSource = wbTarget.Sheets("Sheet2") 

    lastrow = wsSource.Cells(wsSource.Rows.count, 1).End(xlUp).Row 

    For x = 2 To lastrow 

     If wsSource.Cells(x, 1) = wsTarget.Range("B10") Then 
      Set r = wsSource.Cells(x, 2).Resize(8, 1) 
      wsTarget.Range("D10:I10").Value = r.Value 
      Set r = Nothing 
     End If 
    Next 

End Sub 
+0

我不知道为什么一些代码是红色的,但这应该工作。 –

+1

'Sheet1'可以假定为'ThisWorkbook'中工作表的'CodeName',而使用这些全局范围的“free”对象引用的IMO是引用工作表的最可靠的方法 - 如果用户重命名代码不会中断(与'Sheets(“SheetName”)'相反),并且重构工具(如[Rubberduck](http://rubberduckvba.com))可以更好地跟踪对它的引用,这会使它们重构友好(即可以重新命名而不会破坏任何东西)。 –

+2

修正了下一个。我对CodeNames毫无头绪,所以感谢您指出了这一点。这实际上是非常有意义的,并且在处理表名易于被编辑的文件时使用SheetNames肯定更好。我一定会在将来使用CodeNames! –

0

你可以尝试:

Option Explicit 

Sub search2() 
    Dim myCell As Range, foundCell As Range 

    Set myCell = Worksheets("Sheet01").Range("B10") 
    With Worksheets("Sheet02") 
     Set foundCell = .Range("A1", .Cells(.Rows.count, 1).End(xlUp)).Find(what:=myCell.Value, LookIn:=xlFormulas, lookat:=xlWhole) '<--| try and find wanted date/time 
     If Not foundCell Is Nothing Then myCell.Offset(, 2).Resize(, 6).Value = foundCell.Offset(, 1).Resize(, 6).Value '<--| if found then copy its adjacent 6 columns to Sheet1 "D10:E10" range 
    End With 
End Sub