【问题标题】:VBA Excel Return values from an array with loopVBA Excel从带有循环的数组中返回值
【发布时间】:2015-04-14 21:18:37
【问题描述】:

我的 vba 函数中有一个小循环,它为每个月提供我 - 即参数 - 列表中的相应合同,除 12 月之外的每个月都有效。 Contractlist 是一个垂直数组 (3,5,7,9,12)。这是代码:

k = 1
Do Until Month(Parameter) < contractlist(k, 1)
k = k + 1
Loop

nextcontract = MonthName(contractlist(k, 1))

问题是:当月份是 12 月时,month(December) 永远不会小于 contractlist(k, 1),因为 12 是该数组中的最小值。在这种情况下,我只想跳转到数组的第一个值,即“3”。换句话说,在最后一行 nextcontract 应该是 MonthName(contractlist(1, 1))。有人可以给我一个提示吗?

谢谢,非常感谢您的帮助!

【问题讨论】:

    标签: arrays excel vba loops


    【解决方案1】:

    有一种偷偷摸摸的作弊方式,使用MOD
    由于 mod 将在等于查找的值(和倍数)时将值减小为 0,我们可以使用它,因此当您从参数中获取 12 月时的月份将为零,而不是 12.. .

    Do Until (Month(Parameter) Mod 12) < contractlist(k, 1)
    

    这将每隔一个月单独保留一次,但在 12 月将返回 0。

    【讨论】:

      【解决方案2】:

      我现在更了解你在做什么了。我在下面编辑了我的解决方案。不要害怕使用更多变量。有时,您可能会使用一个变量做太多事情,从而很难找到解决方案。

      ' My test data
      Dim contractlist(1 To 5, 1 To 1) As Integer
      contractlist(1, 1) = 3
      contractlist(2, 1) = 5
      contractlist(3, 1) = 7
      contractlist(4, 1) = 9
      contractlist(5, 1) = 12
      
      Dim month As Integer ' represents Month(Parameter)
      month = 12
      
      ' Solution
      Dim contractCount As Integer
      Dim nextContractNum As Integer
      Dim nextcontract As String
      contractCount = UBound(contractlist, 1)
      
      ' Next contract is the first in the list
      ' if we don't find a later one
      nextContractNum = contractlist(1, 1)
      
      For i = 1 To contractCount
          If month < contractlist(i, 1) Then
              nextContractNum = contractlist(i, 1)
              Exit For
          End If
      Next i
      
      nextcontract = MonthName(nextContractNum)
      

      【讨论】:

      • 谢谢!我试过了,但是函数的返回仍然是#VALUE! .如果月份(参数)= 12,k 似乎没有值。但它仍然适用于每隔一个月...
      • 我现在明白了。如果您循环查看您拥有的合同月份数,而不是日历中的所有月份,这会使事情变得更容易。它还有助于将您的“答案”月份和“循环计数器”分成单独的变量。
      • (Sean 的解决方案很有趣,但如果您有合约月份(3、5、7)和参数月份 10,则失败。)
      猜你喜欢
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      相关资源
      最近更新 更多