簡體   English   中英

將excel公式轉換為VBA函數

[英]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函數來使其變得更簡單。 所以我有點看幾步:

  1. 匹配A列中建築物名稱的第一個實例
    構建輸出單元格行的名稱。
  2. 日期是否與輸出單元格連接> =第一個條目的開始日期(用戶在D列中輸入)。
  3. 日期是否與輸出單元格<=第一個條目的結束日期(用戶在E列中輸入)相關聯。
  4. 如果零件1,2和3都為True,則輸入建築物第一個實例的單位名稱(位於F列)。
  5. 如果第1部分,第2部分或第3部分為False,則循環以查看第1列的建築物名稱的下一個實例。

希望這會讓事情比公式更清晰,所以我能夠得到幫助,因為我對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中找到“適合”輸入參數日期的第一個條目,即:

  • P1 = T1.building
  • P2 <= T1.start日期
  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM