根据其他相关数组确定一个数组的元素位置
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
我有 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