2013-03-07 3 views
1

Ce que j'ai est une colonne dans laquelle j'ai utilisé la fonction de correspondance pour générer les positions des valeurs trouvées. Chaque cellule de cette colonne aura donc une valeur de position. ex. 3, 4, 5, # N/A, 7, 8, etc. Enregistrer pour certaines cellules avec la valeur "# N/A" là.vba retirer des collections en les bouclant

Mon but est de générer une collection avec ces valeurs de collection manquantes. Par exemple ma collection aurait la valeur "6" basée sur l'exemple ci-dessus. Ma méthode actuelle consiste à remplir une collection avec toutes les positions possibles, puis à parcourir la colonne et à la supprimer en fonction de la valeur de la cellule de la colonne.

Dim arrPos As New Collection 
Dim bottomRow, matchRow As Long 
bottomRow = Range("A" & Rows.Count).End(xlUp).Row 
matchRow = Range("C" & Rows.Count).End(xlUp).Row 

' fill collection 
For i = 3 To bottomRow 
arrPos.Add i 
Next i 

' remove selects 
For h = 3 To matchRow 
    For g = 1 To arrPos.Count 
    If Range("C" & h).Value = arrPos(g) Then 
    arrPos.Remove (g) 
    End If 
    Next g 
Next h 

Mon problème est que je semble avoir du mal à enlever fonction de l'indice tout en boucle. J'obtiens une erreur Run-time error '9': Subscript out of range sur l'instruction If. Je suppose que c'est parce que je suis en train de supprimer en boucle et les index continuent de réorganiser. Alors pourquoi se demander comment réaliser ces suppressions en boucle, ou s'il y a une meilleure façon de réaliser ce que je tente.

Veuillez noter que ces résultats de correspondance ne sont pas dans un ordre parfaitement ascendant ou descendant. donc ça ressemblerait plus à "5, 8, 4, 3, 7, # N/A, etc."

+0

La question ici semblerait être que vous ajoutez les valeurs avec le numéro de ligne comme la clé, mais lorsque vous supprimez les éléments, vous êtes les supprimer par position. Les numéros de rangée commencent à 3, mais les positions dans la collection commencent à 1, donc il y a une disparité évidente entre les deux. Je ne suis pas sûr qu'il est même possible d'avoir des valeurs entières en tant que clés dans une collection car la méthode Item par défaut semble considérer ces valeurs comme des positions plutôt que comme des clés. – barrowc

Répondre

1

Vous devriez commencer par la dernière position, et compter à rebours:

For h = matchRow To 3 Step -1 
    For g = arrPos.Count To 1 Step -1 
     If Range("C" & h).Value = arrPos(g) Then 
      arrPos.Remove (g) 
     End If 
    Next g 
Next h 
+0

Merci pour la réponse. Je suis sûr que c'est correct, mais mes résultats ne sortent pas comme prévu. acceptera dans une seconde. – mango

+2

@mango - pourriez-vous mettre à jour votre question avec quelques exemples de lignes et de colonnes, le résultat que vous obtenez et le résultat attendu? Je serais plus heureux sachant que ma réponse a été acceptée pour aider réellement avec votre problème :) – LittleBobbyTables

+0

merci pour l'inquiétude. mais je ne sais pas combien je peux en divulguer. Je pense que je dois faire une pause aujourd'hui. Et regardez avec une nouvelle paire ou des yeux plus tard. Merci encore. – mango

Questions connexes