2013-06-26 224 views
3

我對程序設計有點新穎,原本只是試圖改進電子表格,但它超越了在Excel中使用基本功能。我有一個表,我有一個函數可以查看第一列中的建築物編號,然後查看其他兩個相應列中的開始日期和結束日期,以確定是否應該在日曆工作表上填充特定塊。出現此問題的原因是,同一建築物號碼可能會出現多次不同的日期,我需要找到與正確日期匹配的條目。將excel公式轉換爲VBA函數

我能夠創建一個雖然複雜的工作公式來找到第一個實例,並瞭解到我可以在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功能。所以,我有點看幾步:

  1. 匹配與
    建築物名稱爲輸出單元格的行中列建築物名稱的第一個實例。
  2. 日期與輸出單元格連接> =第一個條目的開始日期(用戶在D列中輸入)。
  3. 日期是否與輸出單元連接< =第一個輸入的結束日期(用戶在E列中輸入)。
  4. 如果部件1,部件2和部件3全部爲真,則輸入建築物第一個實例的單元名稱(位於列F)。
  5. 如果部分1,2,或3是假,然後循環看建築物名稱落筆列的下一個實例1

希望這使事情變得比公式更清楚,因此我能夠得到幫助因爲我對VBA的瞭解很少,所以我仍然很困難。

+0

這是一種公式,它是可能的,如果你住在一起,就明白最好的,因爲建築開始(我從經驗中知道)。您是否從建築號碼,開始日期和結束數據開始?這是什麼意思「*找出*如果它應該填充特定的塊......」? – chuff

+0

我剛剛發現它的一部分可以由於冗餘而被刪除。該公式不再需要IF(VLOOKUP(「2D11」&1,A2:F6,3,0)=「2D11」),因爲該部分用於檢查名稱是否正確,但不再需要。也必須刪除a)在FALSE之後。 –

+0

所以更好的解釋我猜是一列有一個計數後的數字,它出現在列C的次數。列B和C都是下拉框,列B是區域,所以在這種情況下,2D塊。然後C列根據該區塊中的建築物的區塊下拉。 D,E和F欄填寫用戶的方框。 D列有一個開始日期,它將被佔用,E列有一個結束日期被佔用。 F欄是他們進入的地方,誰將佔領大樓。希望有助於一些。 –

回答

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 

你應該在末尾添加一個測試,以避免情況下存在的表

0

沒有一審如果我理解正確的話,你有一個表T1由3列組成:T1.building,T1.start date,T1.end date。 然後你有3個參數:P1 =建築物,P2 =開始日期,P3 =結束日期。 您需要在表T1中找到「適合」輸入參數日期的第一個條目,即:

  • P1 = T1。建設
  • P2 < = T1.start日期
  • P3> = T1.end日期

如果是的話,你可以這樣定義

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工作示例