VBA XL : balayage d'onglets

Résolu/Fermé
PVS - 4 févr. 2011 à 10:29
 PVS - 4 févr. 2011 à 15:59
Bonjour,

Pour appliquer un traitement identique aux onglets d'un fichier, je voulais en faire la liste (par exemple sur une table en zone B3:B6) et faire une boucle comme la suivante :

For Each LOT In range("B3:B6")

Sheets(LOT).Select

' action appliquée à l'onglet

Next LOT

Mais j'ai une erreur d'éxécution, peut-être liée au type de ma variable.

Que dois-je corriger ?

Merci d'avance de votre aide

8 réponses

Bonjour,

voici la correction :
i = 3
do while cells(i,2) <> ""
feuille = cells(i,2)
Sheets(feuille).Select

' action appliquée à l'onglet

i=i+1
loop
0
Bonjour PVS,

En effet, il y a un mauvais type dans votre exemple !

Option Explicit

Sub BalayageFeuille()

    Dim Plage As Range, LOT As Range, Feuille As Worksheet

    Set Plage = Range("B3:B6")

    For Each LOT In Plage
        Set Feuille = Sheets(LOT.Value)
        Feuille.Select
        Range("A1").Value = "Visité"
        
    Next LOT

End Sub
'


Info
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 4/02/2011 à 14:18
Bonjour tou(te)s
Option Explicit 

'A PLACER IMPERATIVEMENT DANS UN MODULE .BAS 
'Module1 par exemple 
Sub SurToutesFeuilles() 
Dim F As Integer, Cel As Range 
    For F = 1 To Sheets.Count 
        For Each Cel In Sheets(F).Range("B3:B6") 
           ' pour l'exemple mettre nombre aléatoire dans ces cellules 
            Cel.Value = Int(Rnd * 100) 
        Next Cel 
    Next F 
End Sub

A+
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
NOTE : Je ne répond pas aux MP pour les questions techniques.
Ça doit se passer sur le forum pour que tous puisse y participer ou en profiter.
0
Bonjour,

Merci pour vos réponses.
Entre temps, en tatonnant, j'avais écris ceci :

Sub Actu_onglets()
'
Dim C As Variant
Dim LOT As Variant

For Each C In range("B11:B52")
LOT = C
Sheets(LOT).Select
application.Run "mon traitement"
Next C

Et cela marche très bien, même si je n'ai pas compris pourquoi il fallait que j'utilise deux variables car si j'écris Sheets(C).Select cela ne marche pas.

J'aurais bien voulu remplacer range("B11:B52") par un nom de zone pour augmenter le niveau de paramétrage et ne pas avoir à entrer dans la macro en cas de modification, mais cela n'a pas marché.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
4 févr. 2011 à 15:33
bonjour à tous

RQ1. si la plage B11:B52 contient
- des noms de feuilles LOT est de type string (dim LOT as string)
- des numéros de feuilles, LOT est de type long (dim LOT as long)
et
LOT = C
devient
LOT = C.Value

RQ2. on peut remplacer B11:B52 par un nom de plage par exemple TabFeuilles
et
for Each C In range("B11:B52")
devient
for Each C In range("TabFeuilles")

bonne suite
0
Effectivement cela marche bien avec le nom de zone en repectant la syntaxe.
Par contre si j'écris

Dim C As string

J'ai un message d'erreur car dans une boucle For....Each on ne peut utiliser que des variables Variant ou bien Object.

Ma version actuelle :

Sub Actu_onglets()
'

Dim C As Variant
Dim LOT As Variant

For Each C In range("Liste_onglets")
LOT = C
Sheets(LOT).Select
application.Run "RetData"
Next C
'
Sheets("INIT").Select

For Each C In range("Liste_onglets")
LOT = C
Sheets(LOT).Select
application.Run "Disconnect"
Next C

Sheets("INIT").Select

End Sub
0
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
Modifié par ccm81 le 4/02/2011 à 15:50
re

C est la cellule et C.Value sa valeur dans la feuille, donc

Sub Actu_onglets()   
Dim C As Range   

For Each C In range("Liste_onglets")   
  Sheets(C.Value).Select   
  application.Run "RetData"   
Next C   
 
Sheets("INIT").Select   

For Each C In range("Liste_onglets")   
  Sheets(C.Value).Select   
  application.Run "Disconnect"   
Next C   

Sheets("INIT").Select   

End Sub


devrait fonctionner

bonne suite
0
Effectivement cela marche et je ne crois aps que l'on puisse faire plus compact.
Merci à tous.
0