IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Effectuer la macro sur les onglets commencant par [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2014
    Messages : 77
    Par défaut Effectuer la macro sur les onglets commencant par
    Bonjour,

    Je voudrais effectuer cette macro sur chaque onglet du classeur commentcant par Valor cependant cela ne semble pas marcher... A priori, le code est bon je ne comprends pas :/ j'ai essayé ces deux facons

    For Each Worksheet In ActiveWorkbook.Sheets
    If Left(sh.Name, 5) = "Valor" Then

    et With Worksheets("Valor") If LCase(Left(Worksheets.Name, 5)) = "Valor" Then

    Voici mon code :


    Merci beaucoup pour votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    Sub Histo()
     
        Dim Plage As Range
        Dim Cel As Range
     
       For Each Worksheet In ActiveWorkbook.Sheets
       If Left(sh.Name, 5) = "Valor" Then
     
            Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
     
        For Each Cel In Plage
     
            'Condition 1) Si colonne A, B, non vide et si colonne F est en % alors copier E dans G
            If Cel.Value <> "" And Cel.Offset(, 1).Value <> "" And Cel.Offset(, 5).NumberFormat = "0.00%" Then
     
     
                Cel.Offset(, 10).Value = Cel.Offset(, 6).Value
     
            'Condition 2 ) Si colonne A, B, non vide, et si colonne F n'est pas en % alors copier F dans G
            ElseIf Cel.Value <> "" And Cel.Offset(, 1).Value <> "" And Cel.Offset(, 5).NumberFormat <> "0%" Then
     
                Cel.Offset(, 10).Value = Cel.Offset(, 5).Value
     
            End If
     
        Next Cel
     
      ActiveWorkbook.Save
        ActiveWorkbook.Close
     
     
    End Sub

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    En fait, je vous suggère dans ce type de pb, de:

    1. mettre un point d'arrêt sur la partie qui vous embête
    2. de dérouler ensuite le code en mode pas à pas pour voir ce qui se passe

    Votre test est bon il me semble, mais que se passe-t-il quand <> "Valor"? Vous avez un " End With" sans With il me semble .... Vous passez peut-être quand même à
    Donc, pour un peu que Plage reste définie par la feuille d'avant, vous continuez votre procédure

    Il suffit donc juste de remonter le traitement sur "Plage" dans votre partie test, comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
      If Left(sh.Name, 5) = "Valor" Then
     
            Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
       ' End With C'est quoi???????????????????????????
     
     
        For Each Cel In Plage
     
            'Condition 1) Si colonne A, B, non vide et si colonne F est en % alors copier E dans G
            If Cel.Value <> "" And Cel.Offset(, 1).Value <> "" And Cel.Offset(, 5).NumberFormat = "0.00%" Then
     
     
                Cel.Offset(, 10).Value = Cel.Offset(, 6).Value
     
            'Condition 2 ) Si colonne A, B, non vide, et si colonne F n'est pas en % alors copier F dans G
            ElseIf Cel.Value <> "" And Cel.Offset(, 1).Value <> "" And Cel.Offset(, 5).NumberFormat <> "0%" Then
     
                Cel.Offset(, 10).Value = Cel.Offset(, 5).Value
     
            End If
     
        Next Cel
     
    End If
    Bonne journée

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2014
    Messages : 77
    Par défaut
    Merci !
    Mais en faisant point par point j'ai une erreur de compliation avec une erreur de reference au niveau de .cell de Range(.Cells(2, ..........

    En parcourant l'aide je trouve "Un identificateur commençant par un point n'est valide qu'au sein d'un bloc With. Cause et solution de cette erreur : "

    Est ce que je devrais mettre ce code ci dessous au sein d'un bloc with et end with pour contourner ce problème ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If Left(sh.Name, 5) = "Valor" Then
     
            Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
    Très bonne journée également,

  4. #4
    Membre Expert Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 909
    Par défaut
    Bonjour,

    La première partie de ton code ne peut fonctionner tel que c'est écrit.

    Essayes par contre, quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim xlwksheet as worksheet
    for each xlwksheet in activeworkbook.sheets
    if ucase(xlwksheet.name) like "VALOR*" then
     Set Plage = xlwksheet.Range(xlwksheet.Cells(2, 1), xlwksheet.Cells(xlwksheet.Rows.Count, 1).End(xlUp))
    end if
    next
    Après, je me suis pas attardé sur ton code car j'ai été demandé entre deux...

    Cordialement,

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2014
    Messages : 77
    Par défaut
    Hello,

    merci mais du coup votre code n'effectue pas mon code peut etre est ce à ucase(xlwksheet.name) like "VALOR*" then qui met tout en Majuscule alors que je voudrais "commencant par Valor et donc qu'il ne reconnait aucun onglet ? Le problème c'est que c'est ca que je ne sais pas faire.
    J'ai remplacé Ucase par => mais ca bloque au niveau de Left... je ne comprends pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Dim Plage As Range
        Dim Cel As Range
      Dim xlwksheet As Worksheet
     
    For Each xlwksheet In ActiveWorkbook.Sheets
    If Left(xlwksheet.Name) = "Valor" Then
     Set Plage = xlwksheet.Range(xlwksheet.Cells(2, 1), xlwksheet.Cells(xlwksheet.Rows.Count, 1).End(xlUp))
    End If
    Next

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    ci-après à tester

    j'ai nettoyé les coquilles du code et rétabli le bon comportement sur la recopie des cellules pour que le comportement soit celui de tes commentaires

    il faut juste ajouter le nom du classeur au début du code, dans l'instanciation de la variable Wb

    attention : "valor" ne sera pas détecté, c'est du stricto "Valor" || le format de la cellule en pourcentage doit être avec deux chiffres après la virgule

    à toi de nous dire s'il faut assouplir tout ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    Sub Histo()
     
    Dim Plage As Range
    Dim Cel As Range
    Dim Wb As Workbook
    Dim Sh As Worksheet
     
    Set Wb = Workbooks("LeNomDeTonClasseur")
     
    For Each Sh In Wb.Sheets
     
        If Left(Sh.Name, 5) = "Valor" Then
     
            Set Plage = Sh.Range(Sh.Cells(2, 1), Sh.Cells(Sh.Rows.Count, 1).End(xlUp))
     
            For Each Cel In Plage
     
                'Condition 1) Si colonne A, B, non vide et si colonne F est en % alors copier E dans G
                If Cel.Value <> "" _
                And Cel.Offset(0, 1).Value <> "" _
                And Cel.Offset(0, 5).NumberFormat = "0.00%" Then
     
                    Cel.Offset(0, 6).Value = Cel.Offset(0, 4).Value
     
                'Condition 2 ) Si colonne A, B, non vide, et si colonne F n'est pas en % alors copier F dans G
                ElseIf Cel.Value <> "" _
                And Cel.Offset(0, 1).Value <> "" _
                And Cel.Offset(0, 5).NumberFormat <> "0.00%" Then
     
                    Cel.Offset(0, 6).Value = Cel.Offset(0, 5).Value
     
                End If
     
            Next Cel
     
        End If
     
    Next Sh
     
    Set Plage = Nothing
    Wb.Close True
     
    End Sub

  7. #7
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2014
    Messages : 77
    Par défaut
    Bonjour,

    Merci beaucoup !

    Cependant il y a une macro initiale qui appelle cette Macro Histo pour effectuer l'action sur une centaine de classeur, donc comment pourrais modifier la ligne Set Wb = Workbooks("LeNomDeTonClasseur"), j'ai essayé ThisWorkbook mais ca ne marche pas..

    Merci !

  8. #8
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Il faudrait donc la passer avec des paramètres de type Workbook, du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Histo(Wbk As Workbook)
     
    Dim Plage As Range
    Dim Cel As Range
    Dim Wb As Workbook
    Dim Sh As Worksheet
     
    For Each Sh In Wbk .Sheets
    ....
    et dans la procédure d'appel, le faire de la forme Call Histo(ActiveWorkbook)

  9. #9
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    il faudrait voir le contenu de cette macro pour te donner la bonne méthode

    mais il faut probablement passer un argument à ta Sub "Histo" qui provient de la macro qui l'appelle

    dans ta macro principales, tu affectes le classeur sur lequel il travaille à une variable
    et quand on appelle la macro histo, on lui passe le classeur en argument

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub MacroPrincipale()
     
    ' blabla du code
     
    ' ici j'utilise le classeur où la macro est écrite
    ' mais il suffit de mettre sous variable le classeur sur lequel ça travaille
    ' et mettre la variable à la place de ThisWorkBook
    Call Histo(ThisWorkbook)
     
    ' blabla du code
     
    End Sub

    et la macro histo devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    Sub Histo(Wb As Workbook)
     
    Dim Plage As Range
    Dim Cel As Range
    Dim Sh As Worksheet
     
    For Each Sh In Wb.Sheets
     
        If Left(Sh.Name, 5) = "Valor" Then
     
            Set Plage = Sh.Range(Sh.Cells(2, 1), Sh.Cells(Sh.Rows.Count, 1).End(xlUp))
     
            For Each Cel In Plage
     
                'Condition 1) Si colonne A, B, non vide et si colonne F est en % alors copier E dans G
                If Cel.Value <> "" _
                And Cel.Offset(0, 1).Value <> "" _
                And Cel.Offset(0, 5).NumberFormat = "0.00%" Then
     
                    Cel.Offset(0, 6).Value = Cel.Offset(0, 4).Value
     
                'Condition 2 ) Si colonne A, B, non vide, et si colonne F n'est pas en % alors copier F dans G
                ElseIf Cel.Value <> "" _
                And Cel.Offset(0, 1).Value <> "" _
                And Cel.Offset(0, 5).NumberFormat <> "0%" Then
     
                    Cel.Offset(0, 6).Value = Cel.Offset(0, 5).Value
     
                End If
     
            Next Cel
     
        End If
     
    Next Sh
     
    Set Plage = Nothing
    Wb.Close True
     
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Macro qui ne s'exécute pas sur les onglets voulus
    Par Runsh63 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 20/05/2011, 17h17
  2. [MySQL] Faire une recherche sur tous les champ commencant par ..
    Par bullrot dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 31/10/2008, 11h45
  3. Petites question sur les onglets...
    Par jarod_bx dans le forum Access
    Réponses: 1
    Dernier message: 20/12/2005, 18h45
  4. Rechercher les occurences commencant par un chiffre
    Par tony slayer dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/05/2005, 14h48
  5. [langage] Trouvé les lignes commencant par [
    Par Nervix dans le forum Langage
    Réponses: 2
    Dernier message: 13/07/2004, 10h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo