使用Excel单元格内容搜索其他工作表上的区域并返回信息

使用Excel单元格内容搜索其他工作表上的区域并返回信息,excel,vba,Excel,Vba,如何使用Excel单元格内容(日期)搜索其他工作表上的某个区域,并返回该区域中该日期右侧单元格中包含的该日期的信息。我需要检查一个日期是否是工作日而不是假日,是否是月底。靶场有 Column 1 Column 2 Column 3 Column 4 Column 5 Date Day of Week BD or WE HD or NH Y or N BD=工作日,WE=周末,HD=假日,NH=非假日,Y=月末,N=非月末 从2011年

如何使用Excel单元格内容(日期)搜索其他工作表上的某个区域,并返回该区域中该日期右侧单元格中包含的该日期的信息。我需要检查一个日期是否是工作日而不是假日,是否是月底。靶场有

Column 1     Column 2      Column 3    Column 4   Column 5
  Date     Day of Week     BD or WE    HD or NH    Y or N
BD=工作日,WE=周末,HD=假日,NH=非假日,Y=月末,N=非月末 从2011年到2016年的每个日期都在该范围内

我想使用用户在工作表的单元格中输入的日期来搜索范围、查找日期并使用该日期的信息来确定该日期是否是一个好日期。 我对编程并不陌生,但我落后于当前编程语言大约20年,所以我正在学习VBA代码。我想使用VBA代码,因为如果输入的日期不是工作日也不是假日,那么我想将日期向上推一次,并验证该日期,直到得到一个好的日期。如果是月末,我还想把日期缩短1。我相信我可以输入If语句并自己循环,但我很难知道如何使用用户输入的日期到单元格(而不是输入框)中,并从该日期的范围返回信息,以便我可以在循环中使用它,直到我可以得到我想要的日期。
我很感激你能给我的任何帮助。谢谢

当用户在您的第一张工作表上输入信息时,您似乎希望您的Visual Basic代码触发(我们将其称为第一张工作表,并使用其代码名;Sheet1)。因此,您需要在Visual Basic编辑器的Sheet1中编写子程序

因此你可以使用

Private Sub Worksheet_Change(byval target as range)

Dim SelDate as Date

If VBA.IsDate(Cells(target.Row,target.Column)) Then
SelDate=Cells(target.Row, target.Column)

'Assume other range is on sheet with the codename Sheet2, starting at top of page in first column

LookRow = 1

     Do Until (Sheet2.Cells(LookRow, 1) >= SelDate and Sheet2.Cells(LookRow, 3) = "BD" and Sheet2.Cells(LookRow, 4) = "HD" and Sheet2.Cells(LookRow,5) = "N") or Sheet2.Cells(LookRow, 1) = ""
     LookRow = LookRow + 1
     Loop

     If Cells(LookRow, 1) <> "" Then
     Cells(target.Row, "OutputCol") = Sheet2.Cells(LookRow, 1)
     End If
End If

End Sub
Private子工作表\u更改(byval目标作为范围)
将日期设置为日期
如果VBA.IsDate(单元格(target.Row,target.Column))则
SelDate=单元格(target.Row,target.Column)
'假设另一个范围位于代码为Sheet2的工作表上,从第一列页面顶部开始
LookRow=1
直到(Sheet2.单元格(LookRow,1)>=SelDate和Sheet2.单元格(LookRow,3)=“BD”和Sheet2.单元格(LookRow,4)=“HD”和Sheet2.单元格(LookRow,5)=“N”)或Sheet2.单元格(LookRow,1)=“”
LookRow=LookRow+1
环
如果单元格(LookRow,1)“,则
单元格(target.Row,“OutputCol”)=Sheet2.Cells(LookRow,1)
如果结束
如果结束
端接头
如果是月末,此代码实际上会将日期提前一天,因为您的问题没有指定如果将日期提前一天导致非工作日,会发生什么情况。你说你可以处理IF声明,所以我不太关心细节。如果要减少日期和增加日期,则需要单独的循环来查找SelDate和最近的可接受日期

“OutputCol”是您希望将输出放在初始工作表上的任何位置。一般来说,我建议使用范围名称定义列,以使代码更加健壮。我也会使用错误处理

注意:一次只能找到一个日期。如果要将多个日期粘贴到工作表中,则它将仅作用于范围的左上角单元格。工作表更改事件定义的“Target”将包含完整选择,因此您可以在Target.Count>1时重新处理完整列,也可以使用Target.Rows.Count查看要循环的行数