将excel公式转换为VBA函数

时间:2013-06-26 19:50:13

标签: excel excel-vba vba

我尝试编程时有点新手,最初只是想改进电子表格,但它已经超越了使用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. 日期是否与输出单元格相关&gt; =第一个条目的开始日期(用户在D列中输入)。
  3. 日期是否与输出单元格相关&lt; =第一个条目的结束日期(用户在E栏中输入)。
  4. 如果第1,2和3部分都为True,则输入建筑物第一个实例的单位名称(位于F列)。
  5. 如果第1,2或3部分为False,则循环以查看第1列的建筑物名称的下一个实例。
  6. 希望这会让事情比公式更清晰,所以我能够得到帮助,因为我对VBA的了解很少,因此我仍然很困难。

2 个答案:

答案 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中找到“适合”输入参数日期的第一个条目,即:

  • P1 = T1.building
  • P2&lt; = T1.start date
  • P3&gt; = T1.end date

如果是这样,您可以定义像这样的自定义函数

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