2008-12-07 16 views
0

J'ai une procédure qui est exécutée pour beaucoup d'éléments, en ignorant certains éléments qui ne répondent pas à un critère. Cependant, je reviens ensuite et je le dirige pour certaines des personnes qui ont été oubliées au premier passage. Je le fais actuellement en ré-exécutant manuellement la procédure pour chaque personne, mais idéalement, une solution un peu plus de mains. Quelque chose que mon patron a suggéré pourrait être efficace serait de créer une liste (comme dans Data -> listes) qui contient les noms des éléments en question, puis itérer sur la liste. Malheureusement, mon fichier d'aide semble échouer - je ne sais pas si je ne sais pas quoi chercher, ou quoi.Quel est un bon moyen de créer un groupe de taille variable à boucler dans Excel 2003?

Exécution de la "Générer macro" commande montre que la VBA pour créer une liste en premier lieu est le long des lignes de ActiveSheet.ListObjects.Add (xlSrcRange, Range ("$ A $ 1"),, xlYes). Name = "List1"

Malheureusement, je n'arrive pas à comprendre comment faire ensuite avec la liste qui en résulte. Je cherche à faire une boucle le long des lignes de

For Each ListItem in List 
    Run the procedure on the text in ListItem.Value 
Next ListItem 

Des suggestions?

Répondre

0

Ma solution finale était d'importer la liste comme une requête de données externe que je donne le nom et bien référencé comme une gamme. Donc:

For each item in Sheets("Sheet1").Range("Range1") 
    Do stuff 
Next item 
0

Vous pouvez itérer sur de cette façon:

 
set rgList = Range("name_of_range")  
For i = 1 To rgList.Rows.Count 
    ' Do something using rgList.Cells(i, 1) 
    RunProcedure(rgList.Cells(i, 1)) 
Next i 

Je suppose ici que la plage est sur une colonne; était sur une rangée, vous auriez dû faire l'itération sur le deuxième index.
Bien sûr, il peut y avoir de meilleurs moyens d'itérer sur une plage; J'utilise celui-ci sur un petit script, et fonctionne très bien.

+0

Le problème avec ceci est qu'il définit explicitement quelles cellules sont incluses - ce que je cherche est un moyen d'agrandir et de rétrécir la zone en fonction du nombre d'éléments. (Sans avoir à pirater le code à chaque fois) – Margaret

+0

Je comprends votre demande. J'ai maintenant fait une version plus générique, basée sur la plage nommée - et en fait, je pense que je vais l'utiliser aussi dans mon petit script :-) –

2

Peut-être quelque chose sur ces lignes:

Dim Counter 'module level ' 

Sub RunSomeProc() 
    Counter = 0 
    '1st test ' 
    SomeProc 

    '2nd Test skipped items' 
    For Each c In Range("c1:c" & Counter) 
     SomeProc 
    Next 

End Sub 

Sub SomeProc() 
For Each c In Range("NamedRange1") 
    If SomeTest=SomeVal Then 
     'Write to 2nd test range ' 
     Range("C1").Offset(Counter, 0) = c 'Value of cell' 
     Counter = Counter + 1 
    End If 
Next 
End Sub 
+0

D ** n vous Remou, vous me battre à nouveau;) I était sur le point de poster quelque chose comme ça. –