arrays - 比较两个数组并将匹配的字符串添加到另一个数组
问题描述
所以我有两个数组。其中一个是 1D (AllAssigneesUnique),另一个是 2D (DB_Array)。我想将 (AllAssigneesUnique) 与 (DB_Array) 的第一列进行比较,当存在完全匹配时,将字符串从 (DB_Array) 的第一列和第二列存储到名为 (NewAssigneesArray) 的第三个 3D 数组中。此外,(NewAssigneesArray) 的第三列应该有字符串“New”。以下是我到目前为止的代码。PS由于匹配字符串的数量并不总是相同,我如何自动重新调整新数组的尺寸?目前,我正在使用以前制作的字典来获取匹配字符串的确切数量。
Dim NewAssigneesArray() As Variant
ReDim NewAssigneesArray(1 To NewAssigneesList.count, 1 To 3)
For a = LBound(AllAssigneesUnique) To UBound(AllAssigneesUnique)
For b = LBound(DB_Array, 1) To UBound(DB_Array, 1)
If AllAssigneesUnique(a) = DB_Array(b, 1) Then
For i = LBound(NewAssigneesArray) To UBound(NewAssigneesArray)
NewAssigneesArray(i, 1) = DB_Array(b, 1)
NewAssigneesArray(i, 2) = DB_Array(b, 2)
NewAssigneesArray(i, 3) = "New"
Next i
End If
Next b
Next a
解决方案
下面的代码由于明显的原因未经测试,可能包含拼写错误或小错误。我相信您将能够纠正它们。请注意,将数组的维度设置为大于所需的大小并在最后给出最终大小会更有效。大 UBound 不需要 RAM 空间。
Sub CreateNewArray()
Dim NewAssigneesArray() As Variant
Dim i As Long
Dim a As Long, b As Long
' set a (UBound, 2) a lot higher than what you will ever need.
' note that you can't Redim (UBound, 1), only (UBound, 2)
ReDim NewAssigneesArray(1 To 3, 1 To 5000)
For a = LBound(AllAssigneesUnique) To UBound(AllAssigneesUnique)
For b = LBound(DB_Array, 1) To UBound(DB_Array, 1)
' Use VbBinaryCompare for a case sensitive comparison
If StrComp(AllAssigneesUnique(a), DB_Array(b, 1), vbTextCompare) = 0 Then
i = i + 1
NewAssigneesArray(1, i) = DB_Array(b, 1)
NewAssigneesArray(2, i) = DB_Array(b, 2)
NewAssigneesArray(3, i) = "New"
Exit For
End If
Next b
Next a
ReDim Preserve NewAssigneesArray(1 To 3, 1 To i)
End Sub
推荐阅读
- node.js - 如果我有 CSRF,我需要 JWT 身份验证吗?
- python - 有没有办法将 Tkinter 与 Google Colaboratory 一起使用?
- bazel - 有没有办法向 Bazel 添加原生规则?
- vb.net - 如何从列表框中获取每个项目并将其存储到 VB.NET 中的多个文本框中
- flutter - 如何防止颤振应用程序在 Dio 错误后崩溃?
- r - 如果字符串包含子集
- java - 如何生成授权:使用 RestAPI 的承载令牌?
- html - 如何避免重复的 SVG 代码,但又没有 defs/symbol/use 引起的 shadow DOM 问题?
- c# - C# 查找符合特定条件的对象的属性
- javascript - SAPUI5 - 如何获取 RadioGroupButton 的选定按钮索引