使用Excel单元格内容搜索其他工作表上的区域并返回信息
如何使用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年
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查看要循环的行数