Решение вашей проблемы Y:
Вы можете использовать словарь для сбора всех массивов PRS-XX.
Option Explicit
Dim PRS As Object
Sub Test()
Set PRS = CreateObject("Scripting.Dictionary")
'fill dictionary
PRS.Add "PRS-02", Array("201010", "207201", "213004", "210110")
PRS.Add "PRS-03", Array("201010", "207201", "213004")
'call it
findCaMaterialsAndSumWeights caMaterials, caMaterialsW, caMat, caMatW, diMatSE(i), diMatNotSE(i), i, posCaMaterialsTaken
End Sub
И затем вы можете использоватьэто как PRS("PRS-02")
, чтобы получить массив Array("201010", "207201", "213004", "210110")
.или даже PRS("PRS-02")(1)
для непосредственного доступа к элементу 1
массива.Если вы теперь используете свою переменную diMatSE = "PRS-02"
, например PRS(diMatSE)
, она принимает правильный массив в соответствии со значением вашей переменной.
Таким образом, у вас есть код только один раз, и вы можете добавить столько PRS-xx
в свой словарь, сколько выхочу, не касаясь этой процедуры снова.
Private Sub findCaMaterialsAndSumWeights(caMaterials As Variant, caMaterialsW As Variant, caMat As Variant, caMatW As Variant, diMatSE As Variant, diMatNotSE As Variant, y As Variant, posCaMaterialsTaken As Variant)
For i = LBound(PRS(diMatSE)) To UBound(PRS(diMatSE))
Call posInTheArrayIgnoringPos(caMaterials, PRS(diMatSE)(i), posInArray, posCaMaterialsTaken)
If posInArray <> 0 Then 'If found one CA material that is a component from a Diko SE
numFound = numFound + 1
posCaMaterialsTaken(posInArray) = "x"
If caMatW(y) = "" Then
caMatW(y) = 0
End If
caMatW(y) = caMatW(y) + caMaterialsW(posInArray)
If numFound = UBound(PRS(diMatSE)) + 1 Then 'If all Diko SE materials are found in Diko materials
caMat(y) = diMatSE
For x = LBound(posCaMaterialsTaken) To UBound(posCaMaterialsTaken)
If posCaMaterialsTaken(x) = "x" Then 'Saving CA materials positions that compound a Diko SE
posCaMaterialsTaken(x) = 1
numFound = numFound - 1
If numFound = 0 Then
Exit For
End If
End If
Next x
End If
'...
Else 'Not found one SE material
End If
Next i
End Sub