【问题标题】:How to use constant values in Excel UDF?如何在 Excel UDF 中使用常量值?
【发布时间】:2014-08-28 08:37:56
【问题描述】:

我一直在努力想出 Excel 中的 UDF。基本上我正在寻找的是一个函数,它将接受用户提供的 2 个输入参数(常量),然后该函数将返回预先存储在某个地方的 excel 表中的值之一。这是它的样子:

月高峰期

  1. 1 月 320 176
  2. 2 月 320 128
  3. 三月 368 252
  4. 4 月 352 128
  5. 5 月 305 320

函数应该是这样的:=Hours(February, Peak) 然后它会返回二月的高峰时间等等。

感谢所有帮助。非常感谢

编辑:作为注释添加的代码

Public Function calculateHours(ByVal mo As Variant, ByVal period As Variant) As Integer    
 Dim tablette As Range 
 Set tablette = Worksheets("Hours").Range("U4:V15") 
 Set valueRange = Worksheets("Hours").Range("U4:U15") 
 period = "peak" 
 For Each ref In valueRange 
   mo = WorksheetFunction.VLookup(ref, tablette, 1, 0) 
 Next 
 ref calculateHours = WorksheetFunction.VLookup(mo, tablette, 2, False) 
End Function

当我尝试在 =calculateHours(january, peak) 中使用此函数时,无论参数是什么,我都只能从表中获取最后一个值

【问题讨论】:

  • 在您的 UDF 中使用 Application.Vlookup() 对您的值表执行查找。
  • 您要求基于您想要创建的某些设计的完整功能。请阅读一些关于 VBA 函数的初学者材料,例如Chip Pearson 的站点或 MSDN 上的简单示例,并尝试创建您的函数。然后,如果它给出了一个特定的错误,请在此处发布
  • 您可以使用 VLOOKUP 而不是 UDF,就像这样(假设数据保存在 A1:C13 范围内的工作表“小时”中,第 1 行是标题行,当前输入是A1 表示当月,B1 表示高峰/关闭):=VLOOKUP(A1,Hours!$A$2:$C$13,IF(B1="peak",2,3),FALSE)
  • 请发布您的部分工作解决方案,以免人们重新创建您的工作。
  • @user3813620 不要使用评论部分发布代码。像我一样编辑你的问题。

标签: excel vba user-defined-functions


【解决方案1】:

考虑:

Public Function ReturnVale(period As String, MinMax As String) As Variant
    months = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
    Off = Array(330, 347, 366, 393, 307, 353, 310, 347, 332, 307, 400, 333)
    Peak = Array(399, 428, 440, 446, 366, 431, 370, 413, 389, 364, 470, 421)
    For i = LBound(months) To UBound(months)
        If period = months(i) Then
            GoTo done
        End If
    Next i
    ReturnVale = "NOT FOUND"
    Exit Function
done:
    If MinMax = "Peak" Then
        ReturnVale = Peak(i)
    Else
        ReturnVale = Off(i)
    End If
End Function

您自然会修改 Array() 语句以满足您的要求。

【讨论】:

  • 我打算写一个类似的答案。我要改变的一件事:使用period = Application.Match(period, months, FALSE) 而不是显式循环。如果匹配是第一个匹配,这将返回 1 - 因此您需要 Option Base 1 或确保您在 PeakOff 中的查找具有正确的偏移量...
  • @Gary 的学生,你是救生员!这正是我一直在寻找的。我将对其进行定制并构建更多阵列以满足我的需求。非常感谢,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 2017-07-09
相关资源
最近更新 更多