[英]Turning an excel formula into a VBA function
我嘗試編程時有點新手,最初只是想改進電子表格,但它已經超越了在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的了解很少,因此我仍然很困難。
這是一個簡單的解決方案......
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
你應該在最后添加一個測試,以避免表中沒有第一個實例的情況
如果我理解正確,你有一個由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
這可能不是世界上性能最高的代碼,但我認為這是解釋性的。
您可以下載此工作示例
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.