我尝试编程时有点新手,最初只是想改进电子表格,但它已经超越了使用excel中的基本功能。我有一个表,我正在查看第一列中的建筑物编号,然后查看其他两个相应列中的开始和结束日期,以确定它是否应填充日历工作表上的特定块。出现此问题是因为相同的建筑物编号可能会出现多次不同的日期,我需要找到与正确日期匹配的条目。
我能够创建一个工作虽然复杂的公式来查找第一个实例并且学会了我可以在false语句中再次添加嵌套if的那个公式并稍作修改。我可以继续这样做,但它变得非常庞大和繁琐。我正在尝试找到一种方法来为公式创建一个函数,其中包含一个变量,它会查看已经使用过多少次的函数,因此它会不断搜索表格以获得符合参数的答案。
这是我目前的公式:
=IFERROR(IF(AND(DATE('IF SHEET (2)'!$F$7,MATCH('IF SHEET (2)'!$C$2,'IF SHEET (2)'!$C$2:'IF SHEET (2)'!$N$2,0),'IF SHEET (2)'!C$4)>=VLOOKUP("2D11"&1,A2:F6,4,0),DATE('IF SHEET (2)'!$F$7,MATCH('IF SHEET (2)'!$C$2,'IF SHEET (2)'!$C$2:'IF SHEET (2)'!$N$2,0),'IF SHEET (2)'!C$4)<=VLOOKUP("2D11"&1,A2:F6,4,0)),IF(VLOOKUP("2D11"&1,A2:F6,3,0)="2D11",VLOOKUP("2D11"&1,A2:F6,6,FALSE)),"NO ANSWER"),"ERROR")
你看到2D11&1
的地方我需要1的变量所以它是“它在函数+1中使用的次数”然后我可以循环它以便它继续检查直到它运行超出2D11或找到匹配的。我之前没有发布,我通过大量的试验和错误这样做,所以如果你需要更多的信息,请发布并说出来,我会尝试提供它。
所以,不要让别人试图弄清楚我发布的那些荒谬的公式,但我会尝试通过陈述我需要完成的事情并尝试查看如何将其转换为VBA函数来使其变得更简单。所以我有点看几步:
希望这会让事情比公式更清晰,所以我能够得到帮助,因为我对VBA的了解很少,因此我仍然很困难。
答案 0 :(得分:0)
这是一个简单的解决方案......
Building_name = ???
Date = ???
Last_Row = Range("A65536").End(xlUp).Row
For i = 1 To Last_Row
if cells(i,1).value = Building_Name Then
if date >= cells(i,4).value Then
if date <= cells(i,5).value Then
first instance = cells(i,6).value
end if
end if
end if
next
你应该在最后添加一个测试,以避免表格中没有第一个实例的情况
答案 1 :(得分:0)
如果我理解正确,你有一个由3列组成的表T1:T1.building,T1.start date,T1.end date。 然后你有3个参数:P1 =建筑,P2 =开始日期,P3 =结束日期。 您需要在表T1中找到“适合”输入参数日期的第一个条目,即:
如果是这样,您可以定义像这样的自定义函数
Public Function MyLookup(Key As Variant, DateMin As Variant, DateMax As Variant, LookUpTable As Range, ResultColumn As Integer) As Range
Dim iIndx As Integer
Dim KeyValue As Variant
Dim Found As Boolean
On Error GoTo ErrHandler
Found = False
iIndx = 1
Do While (Not Found) And (iIndx <= LookUpTable.Rows.Count)
KeyValue = LookUpTable.Cells(iIndx, 1)
If (KeyValue = Key) And _
(DateMin <= LookUpTable.Cells(iIndx, 2)) And _
(DateMax >= LookUpTable.Cells(iIndx, 3)) Then
Set MyLookup = LookUpTable.Cells(iIndx, ResultColumn)
Found = True
End If
iIndx = iIndx + 1
Loop
Exit Function
ErrHandler:
MsgBox "Error in MyLookup: " & Err.Description
End Function
这可能不是世界上性能最高的代码,但我认为这是解释性的。
您可以下载this工作示例