根据其他相关数组确定一个数组的元素位置

Determining element position of one array based on other related arrays

我有 3 个数组动态数组(大小在运行时确定):

dim arrName() as String 
dim arrQty() as Integer
dim arrDate() as Date

这些数组是相互关联的:例如,

*1st 数组:我有 3 个程序,名为 Procedure1、Procedure2、Procedure3 - arrName(Procedure1、Procedure2 等),大小分别为 3。

第二个数组:每个程序规定的数量,分别- arrQty(Qty1, Qty2, etc.), 大小分别为3. Qty2 - 表示Procedure2规定的Qty2次...

第三个数组:按顺序规定的程序日期,例如,如果 arrQty(1) = 2,则表示 arrDate() 的前 2 个元素将是 Procedure1 的 2 个日期。数组的大小将是 arrQty() 的元素之和。例如,如果 arrQty() = [2,2,4] 那么 arrDate() 的大小是 8.*

问题是;知道 arrDate() 元素的位置,如何分析确定它的名称?

例如arrDate(4) 与 arrName(2) 相关,arrDate(7) 与 arrName(3) 相关,等等...

P.S。我可以创建大小为 arrDate() 的第 4 个数组,并分别用 arrName() 的元素填充它,例如[Procedure1, Procedure1, Procedure2, etc.],还有更巧妙的方法吗?


已更新

我不喜欢 Exit 语句。我想知道下面是否会产生 Brian 建议的解决方案?

Private Function FindProcedure(ByVal DateIndex As Integer) As String 
  Dim i As Integer
  Dim qty As Integer  
  i = 0  
  qty = arrQty(i)
  Do While DateIndex >= qty
       i = i + 1
       qty = qty + qty(i)
  Loop
  FindProcedure = arrName(i)
End Function

首先,与默认设置一样,VBA 使用从零开始的数组。这意味着数组元素之间的迭代从零开始。除非你确实使用 Option Base 1 或像他们那样明确声明 Dim arrName(1 To 3)。下一段代码将向您展示如何匹配问题中的示例数组。我假设一对中的两个日期(arrDate)都属于较短数组的一个元素。如果没有,您可以只选择符合您需要的线路。代码 returns 它们都在不同的行上:

Sub testArraysMatching()
 Dim arrName() As String
 Dim arrQty(2) As Integer
 Dim arrDate(5) As Date
 Dim i As Long

 arrName() = Split("Procedure1,Procedure2,Procedure3", ",")
 arrQty(0) = 3: arrQty(1) = 6: arrQty(2) = 10
 arrDate(0) = Date: arrDate(1) = Date + 1: arrDate(2) = Date + 2: arrDate(2) = Date + 3
 arrDate(3) = Date + 4: arrDate(4) = Date + 5: arrDate(5) = Date + 6
  Debug.Print LBound(arrName), UBound(arrName) 'it will return 0 and 2
 For i = LBound(arrName) To UBound(arrName)
    'return the corresponding quantity:
    Debug.Print "Quantity for " & arrName(i) & " is " & arrQty(i)
    'return the coresponding (both) dates:
    Debug.Print "Date 1 for " & arrName(i) & " is " & arrDate(i * 2)
    Debug.Print "Date 2 for " & arrName(i) & " is " & arrDate(i * 2 + 1)
 Next i

 'find name for a Date element:
 Dim testDate As Date, boolFound As Boolean
   testDate = Date + 10
   For i = LBound(arrDate) To UBound(arrDate)
        If arrDate(i) = testDate Then
            Debug.Print arrName(Int(i / 2)): boolFound = True
        End If
   Next i
   If Not boolFound Then MsgBox "The date """ & testDate & """ not found in ""arrDate""."
End Sub

当然,你可以用二维数组代替前两个。或者使用字典、集合等。代码仅尝试回答问题。

假设数组从 1 开始,以下函数将为给定日期索引给出过程名称:

Private Function FindProcedure(ByVal DateIndex As Integer) As String
   Dim i As Integer
   Dim qty As Integer

   For i = LBound(arrQty) To UBound(arrQty)
      qty = qty + arrQty(i)

      If DateIndex <= qty Then
         FindProcedure = arrName(i)
         Exit Function
      End If
   Next
End Function

根据 OP 的反馈,这是另一个不使用 Exit 语句但同样有效的版本:

Private Function FindProcedure(ByVal DateIndex As Integer) As String
   Dim i As Integer
   Dim qty As Integer

   i = 1
   qty = arrQty(1)

   Do While DateIndex > qty
      i = i + 1
      qty = qty + arrQty(i)
   Loop

   FindProcedure = arrName(i)
End Function