Je tiens à préface en disant que je n'ai aucune idée de quoi que ce soit pourquoi mon code fait ce qu'il fait. J'espère vraiment qu'un des gourous de VBA ici peut aider. Aussi, ceci est mon premier post alors j'ai fait de mon mieux pour suivre les règles, mais si j'ai fait quelque chose de mal, veuillez le signaler. J'ai un sous qui itére à travers une colonne de données et crée un tableau. Il appelle une fonction qui vérifie si la valeur particulière est déjà dans le tableau. Si ce n'est pas le cas, le tableau est redimensionné, la valeur est insérée et le processus recommence, jusqu'à ce que la fin de la liste soit atteinte. Je me retrouve avec un tableau totalisant 41 valeurs, mais 4 d'entre elles ont été dupliquées deux fois, donc il n'y a que 37 valeurs uniques dans le tableau.VBA tableau dynamique duplication de certaines valeurs par erreur
Je ne peux pas pour la vie de moi comprendre ce qui distingue ces valeurs ou pourquoi ils sont en cours de duplication. La liste totale est longue de plus de 700 valeurs donc j'ai pensé que je devrais voir d'autres valeurs dupliquées, mais je ne le suis pas.
Voici le code pour la sous qui crée le tableau:
Sub ProductNumberArray(strWrkShtName As String, strFindColumn As String, blAsGrp As Boolean, iStart As Integer)
Dim i As Integer
Dim lastRow As Integer
Dim iFindColumn As Integer
Dim checkString As String
With wbCurrent.Worksheets(strWrkShtName)
iFindColumn = .UsedRange.Find(strFindColumn, .Range("A1"), xlValues, xlWhole, xlByColumns).Column
lastRow = .Cells(Rows.Count, iFindColumn).End(xlUp).row
For i = iStart To lastRow
checkString = .Cells(i, iFindColumn).Value
If IsInArray(checkString, arrProductNumber) = False Then
If blAsGrp = False Then
ReDim Preserve arrProductNumber(0 To j)
arrProductNumber(j) = checkString
j = j + 1
Else
ReDim Preserve arrProductNumber(1, 0 To j)
arrProductNumber(0, j) = .Cells(i, iFindColumn - 1).Value
arrProductNumber(1, j) = checkString
j = j + 1
End If
End If
Next i
End With
End Sub
Et voici le code qui vérifie si la valeur checkString
est dans le tableau:
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
Dim bDimen As Byte, i As Long
On Error Resume Next
If IsError(UBound(arr, 2)) Then bDimen = 1 Else bDimen = 2
On Error GoTo 0
Select Case bDimen
Case 1
On Error Resume Next
IsInArray = Application.Match(stringToBeFound, arr, 0)
On Error GoTo 0
Case 2
For i = 1 To UBound(arr, 2)
On Error Resume Next
IsInArray = Application.Match(stringToBeFound, Application.Index(arr, , i), 0)
On Error GoTo 0
If IsInArray = True Then Exit For
Next
End Select
End Function
Toute aide sera la bienvenue. J'ai été capable de trouver des réponses à toutes mes questions précédemment (ou au moins débugger et voir un problème évident) mais celui-ci m'a bloqué. J'espère que quelqu'un peut comprendre ce qui se passe.
[EDIT] Voici le code où le sous est appelé:
Sub UpdatePSI()
Set wbCurrent = Application.ActiveWorkbook
Set wsCurrent = wbCurrent.ActiveSheet
frmWorkbookSelect.Show
If blFrmClose = True Then 'if the user closes the selection form, the sub is exited
blFrmClose = False
Exit Sub
End If
Set wsSelect = wbSelect.Sheets(1)
Call ProductNumberArray("Forecast", "Item", True, 3)
wbCurrent
, wsCurrent
et blFrmClose
sont définis dans les déclarations générales.
Pouvez-vous ajouter du code pour montrer comment le premier sous-appelant est appelé? wbCurrent ne semble pas être défini nulle part. Et pourquoi le tableau est-il redimensionné si la valeur est trouvée. Pourquoi ne pas simplement ajouter la valeur si elle existe déjà? – SJR
Vous devriez plutôt utiliser un 'Scripting Dictionary', car il a une méthode' .Exists' que vous pouvez utiliser pour créer facilement une liste distincte. Il peut ensuite être transformé en 'Array'. – braX
@braX Dans certains cas, j'ai besoin de 2 parties pour mon tableau, dans d'autres seulement 1. J'ai fait ça de cette façon pour pouvoir réutiliser mon sous-tableau à plusieurs endroits. D'après ce que je peux dire, les «Dictionnaires de script» ne me permettent pas de faire ça. @SJR Si la valeur n'est pas trouvée, la fonction renvoie False et la valeur est ajoutée. Si la valeur est trouvée, la fonction renvoie 'True' et l'instruction' If' est ignorée. – PrimeTurtler