VBA XL : balayage d'onglets

Résolu
PVS -  
 PVS -
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

  1. melanie1324
     
    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
  2. Info
     
    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
  3. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  4. PVS
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
  7. PVS
     
    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
  8. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
  9. PVS
     
    Effectivement cela marche et je ne crois aps que l'on puisse faire plus compact.
    Merci à tous.
    0