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 :

Parcours et extraction de variables sur plusieurs feuilles [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Par défaut Parcours et extraction de variables sur plusieurs feuilles
    Bonjour,

    Je suis novice en matière de VBA excel, ceci est mon tout premier code et j'aimerais savoir si quelqu'un pourrait m'aider pour le problème suivant

    Je désire, extraire des variables précises dans un fichier excel constitué de plusieurs feuilles, toutes avec la même structure, et écrire le résultat qui en découle sur une nouvelle feuille.

    Voici mon code :

    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
    45
    46
     
    Sub test()
    Dim strTri As String
    Dim strApp As String
    Dim strEqp As String
    Dim i As Integer
    Dim Ws As Worksheet
    Dim Ws2 As Worksheet
     
    'Création de la nouvelle feuille
    For Each Ws In ActiveWorkbook.Worksheets
           If Ws.Name = "Resultat" Then
               Ws.Delete
               Exit For
           End If
    Next
     
    Sheets.Add after:=Sheets(7)
    ActiveSheet.Name = "Resultat"
     
    'Parcours de toutes les feuilles
    For Each Ws2 In ActiveWorkbook.Worksheets
    'Réinitialisation de i
    i = 1
     
    'Tant que la cellule n'est pas vide (j'ai moi même mis EOF à la fin de chaque feuille en colonne 1)
     
    Do While Ws2.Cells(i, 1).Value <> "EOF"   
    'Ignore le traitement si case vide ou contenant la chaine "Nom" (entete colonne)
    If Not (IsEmpty(Ws2.Cells(i, 1).Value)) Or Ws2.Cells(i, 1).Value <> "Nom" Then
     
    'Copie des valeurs recherchées
    strTri = Mid(Ws2.Cells(i, 1).Value, 2, 3)
    strApp = Ws2.Cells(i, 4).Value
    strEqp = Ws2.Cells(i, 7).Value
     
    ActiveSheet.Cells(i, 1) = strTri          'Ecrit dans la nouvelle feuille
    ActiveSheet.Cells(i, 2) = strEqp
    ActiveSheet.Cells(i, 3) = strApp
     
    End If
     
    i = i + 1                                            'Passe à la ligne suivante
    Loop
    Next
    End Sub
    Lors de l'exécution, pendant un très court instant, je peux voir que ma nouvelle feuille "Résultat" se remplit correctement (au moins sur la 1ère feuille à analyser, je ne peux pas voir pour le reste, le traitement est trop rapide).

    J'obtiens une erreur de type "Dépassement de capacité" sur i.
    Il semble que ce soit parce que la boucle analyse également la nouvelle feuille juste créée et efface également par dessus... (et n'arrive jamais au EOF puisque la page est auto générée, du coup VBA doit générer cette erreur automatiquement au bout d'un nombre d'itération trop important je pense)

    Quelqu'un aurait une solution pour contourner ce problème ?
    Je pensais peut-être à écrire sur un nouveau fichier plutôt qu'une nouvelle feuille, mais étant complètement novice dans le domaine ...

    Merci d'avance !

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Tu dois tester que la feuille traitée n'est pas la feuille Resultat :

    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
    45
    46
    47
    Sub test()
    Dim strTri As String
    Dim strApp As String
    Dim strEqp As String
    Dim i As Integer
    Dim Ws As Worksheet
    Dim Ws2 As Worksheet
     
    'Création de la nouvelle feuille
    For Each Ws In ActiveWorkbook.Worksheets
           If Ws.Name = "Resultat" Then
               Ws.Delete
               Exit For
           End If
    Next
     
    Sheets.Add after:=Sheets(7)
    ActiveSheet.Name = "Resultat"
     
    'Parcours de toutes les feuilles
    For Each Ws2 In ActiveWorkbook.Worksheets
        If Ws2.Name <> "Resultat" Then
            'Réinitialisation de i
            i = 1
     
            'Tant que la cellule n'est pas vide (j'ai moi même mis EOF à la fin de chaque feuille en colonne 1)
     
            Do While Ws2.Cells(i, 1).Value <> "EOF"
            'Ignore le traitement si case vide ou contenant la chaine "Nom" (entete colonne)
            If Not (IsEmpty(Ws2.Cells(i, 1).Value)) Or Ws2.Cells(i, 1).Value <> "Nom" Then
     
            'Copie des valeurs recherchées
            strTri = Mid(Ws2.Cells(i, 1).Value, 2, 3)
            strApp = Ws2.Cells(i, 4).Value
            strEqp = Ws2.Cells(i, 7).Value
     
            ActiveSheet.Cells(i, 1) = strTri          'Ecrit dans la nouvelle feuille
            ActiveSheet.Cells(i, 2) = strEqp
            ActiveSheet.Cells(i, 3) = strApp
     
            End If
     
            i = i + 1                                            'Passe à la ligne suivante
        Loop
        End If
    Next
    End Sub

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Par défaut
    C'est tout bête mais ça fonctionne, merci !

    Autre petit détail, la condition if ne doit pas s'exécuter comme je le souhaite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    If Not (IsEmpty(Ws.Cells(i, 1).Value)) And Ws.Cells(i, 1).Value <> "Entete-1" And Ws.Cells(i, 4).Value <> "Entete-2" And Ws.Cells(i, 7).Value <> "Entete-3" Then
     
    'Extration des données recherchées
    strTri = Mid(Ws.Cells(i, 1).Value, 2, 3)
    strApp = Ws.Cells(i, 4).Value
    strEqp = Ws.Cells(i, 7).Value
     
    'Recopie des valeurs copiées dans Resultat
    ActiveSheet.Cells(y, 1) = strTri
    ActiveSheet.Cells(y, 2) = strEqp
    ActiveSheet.Cells(y, 3) = strApp
     
    End If
    Je veux que le programme ne recopie pas les cases d'entête de colonne ou les cases vides, mais la syntaxe de la condition sur les cases vides semble incorrecte, elles sont toutes recopiées (laissant par exemple 5 lignes vides entre chaque recopie d'une feuille, ce n'est pas problème bloquant mais je souhaiterais automatiser tout ça avec une présentation correcte sans besoin de retouche)

    J'ai également tenté avec :
    If (IsNull((Ws.Cells(i, 1).Value) = False)
    ou
    If Ws.Cells(i,1).Value <> ""

    Mais avec le même résultat.

    Merci d'avance !

  4. #4
    Membre expérimenté Avatar de L'Albatros
    Homme Profil pro
    Chercheur en économie - statistique
    Inscrit en
    Avril 2012
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en économie - statistique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 150
    Par défaut
    Bonjour,

    Il me semble que c'est plus un problème logique que syntaxique:

    "Je veux que le programme ne recopie pas les cases d'entête de colonne ou les cases vides"
    ne se traduirait-il pas plutôt en:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not (IsEmpty(Ws.Cells(i, 1).Value)) Or Ws.Cells(i, 1).Value = "Entete-1" Or Ws.Cells(i, 4).Value = "Entete-2" Or Ws.Cells(i, 7).Value = "Entete-3" Then
    ...ou alors il faut que j'aille prendre un 2ème café...?

    '------------------------------------------------------------------------
    Si j'ai pu vous aider, merci de me le dire avec un pouce vert

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

Discussions similaires

  1. macro sur plusieurs feuilles
    Par lolo_bob2 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/06/2006, 17h51
  2. Variable sur plusieurs ligne
    Par krfa1 dans le forum ASP
    Réponses: 5
    Dernier message: 20/04/2006, 11h26
  3. excel VBA comment recopier sur plusieurs feuilles
    Par floflo2006 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/11/2005, 16h56
  4. [excel] même code sur plusieurs feuilles
    Par sabotage dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/11/2005, 13h23
  5. Utilisation d'une variable sur plusieurs unités
    Par Yamaneko dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2003, 12h23

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