Использование содержимого переменной в инструкции - PullRequest
0 голосов
/ 13 февраля 2019

Я объясняю одну проблему Y: это вызов, и diMatSE(i) может иметь разные значения, например PRS02 и PRS03 для этого примера.

Call findCaMaterialsAndSumWeights(caMaterials, caMaterialsW, caMat, caMatW, diMatSE(i), diMatNotSE(i), i, posCaMaterialsTaken)

Здесь приведено определение массивов:

PRS02 = Array("201010", "207201", "213004", "210110")
PRS03 = Array("201010", "207201", "213004")

Вот подытожная сводка:

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)
    Select Case diMatSE
        Case "PRS-02"
             For i = LBound(PRS02) To UBound(PRS02)
                Call posInTheArrayIgnoringPos(caMaterials, PRS02(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(PRS02) + 1 Then 'If all Diko SE materials are found in Diko materials
                        caMat(y) = "PRS-02"
                        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
         Case "PRS-03"  
            (same code as PRS-02 case but PRS03 instead PRS02)
        Case "PRS-04"
            (same code as PRS-02 case but PRS04 instead PRS02)
        ...
        Case else

Теперь у меня есть несколько случаев с повторением кода для различных значений.

1 Ответ

0 голосов
/ 14 февраля 2019

Решение вашей проблемы 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...