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 :

Probleme avec each sheets


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 75
    Par défaut Probleme avec each sheets
    Bonjour tout le monde,

    Je sollicite votre aide pour un problème que je rencontre dans mon code VBA.
    Mon objectif est de transférer des données contenues dans plusieurs feuilles de mon classeur Excel (qui ont toutes la même forme) vers un autre classeur Excel. Lorsque je lance mon code, toutes les données sont correctement transférées. Le problème survient lorsque toutes les feuilles du classeur sont passées à la "moulinette". Un message d'erreur apparait car mon code ne détecte pas correctement qu'il n'y a plus de feuilles dans le classeur. Voici le bout de code qui pose problème :

    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
     
    Set WBfirst = ActiveWorkbook
    ' Ouverture du fichier Excel. Il s'appelle New
    'Workbooks.Open ("D:\Documents and Settings\...\New.xls")
    If MsgBox("Après avoir cliquer sur Oui, veuillez selectionner le fichier Excel New.xls; sinon cliquer sur non.", vbYesNo, "Recherche du fichier New") = vbYes Then
        Nom_Fichier = Application.GetOpenFilename("Fichiers Excel (*.xls), *.xls")
            If Nom_Fichier <> False Then
                Workbooks.Open Filename:=Nom_Fichier
            End If
            Else
                Exit Sub
    End If
    Set WBsecond = ActiveWorkbook
     
    WBfirst.Activate
     
     
     
     
     For Each sht In Worksheets
       Debug.Print sht.Name
      If sht.Name <> "Telecommande" Then
      sht.Select
     'Sélection de old
    WBfirst.Activate
    Voici le message d'erreur :
    "Erreur d’exécution '1004' :
    La méthode Select de la classe Worksheet a échoué."


    Avez vous déjà rencontré ce problème ? Est-ce que cela vient de ma boucle each sheet ? Connaissez vous une solution à apporter ?

    Merci d'avance pour vos réponses !!!

  2. #2
    Membre Expert
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i = 1 to Sheets.Count
       msgbox Sheets.Item(i).name
    next

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 75
    Par défaut
    Merci pour ta réponse rapide, cependant je ne vois pas comment intégrer ce code. J'ai essayé plusieurs choses mais je rencontre toujours des problèmes :

    J'ai fais :
    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
     
    Set WBfirst = ActiveWorkbook
    ' Ouverture du fichier Excel qui sera à la fin importé dans Matrisk. Il s'appelle New
    'Workbooks.Open ("D:\Documents and Settings\VXWC192\Bureau\Mission 18\New.xls")
    If MsgBox("Après avoir cliqué sur Oui, veuillez selectionner le fichier Excel New.xls; sinon cliquer sur non.", vbYesNo, "Recherche du fichier New") = vbYes Then
        Nom_Fichier = Application.GetOpenFilename("Fichiers Excel (*.xls), *.xls")
            If Nom_Fichier <> False Then
                Workbooks.Open Filename:=Nom_Fichier
            End If
            Else
                Exit Sub
    End If
    Set WBsecond = ActiveWorkbook
    WBfirst.Activate
     
     
     
     
     
    'application du code à toutes les feuilles 
     
    for i = 1 to Sheets.Count
     
    ...
    'mon code de copie/colle des données
    ...   
    next
    end sub
    Je ne comprends pas pourquoi mon code de copie/colle ne s'applique que dans une feuille. Il ne se passe rien pour les autres feuilles. Petite précision : mes feuilles de mon classeur où les données sont présentes n'ont aucun nom en commun : par exemple : feuille1, ancien, nouveau, perte, gain.

  4. #4
    Membre Expert
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Par défaut
    Re,

    Tu peux nous montrer plus de code dans ta boucle for ?

    for i = 1 to Sheets.Count

    ...
    'mon code de copie/colle des données
    ...
    next

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 75
    Par défaut
    Oui bien sûr :
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
     
    Set WBfirst = ActiveWorkbook
    ' Ouverture du fichier Excel. Il s'appelle New
    'Workbooks.Open ("D:\Documents and Settings\...\New.xls")
    If MsgBox("Après avoir cliqué sur Oui, veuillez selectionner le fichier Excel New.xls; sinon cliquer sur non.", vbYesNo, "Recherche du fichier New") = vbYes Then
        Nom_Fichier = Application.GetOpenFilename("Fichiers Excel (*.xls), *.xls")
            If Nom_Fichier <> False Then
                Workbooks.Open Filename:=Nom_Fichier
            End If
            Else
                Exit Sub
    End If
    Set WBsecond = ActiveWorkbook
    WBfirst.Activate
     
     
    For Each sht In Worksheets
      Debug.Print sht.Name
     If sht.Name <> "Telecommande" Then
      sht.Select
     
     
     
     
     
        'Sélection du premier classeur
    WBfirst.Activate
        ' 1. Copie de la feuille i
    Cells.Copy
    WBsecond.Activate
    Range("C4").Select
        ' 2. Création de la feuille Alpha dans le second classeur (New).
    Set sh = Sheets.Add
    sh.Name = "alpha"
        ' 3. Collage de la feuille copiée du premier classeur dans Alpha
    Cells.PasteSpecial
    i = 173
        ' 4. Copie des différents éléments dans les bonnes colonnes pour l'importation finale.
    Cells(14, 7).Copy
    Cells(i, 5).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    Cells(17, 6).Copy
    Cells(i, 13).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
            If (Cells(i, 13) = "avéré") Then
            Cells(i, 13) = 1
            Else
            Cells(i, 13) = 0
            End If
     
    Rows(i).Copy
    Sheets("Data").Select
    j = Range("A65536").End(xlUp).Row
    j = j + 1
    Rows(j).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
        '6. Suppression de la feuille Alpha qui n'est plus utile
    Sheets("alpha").Delete
     
       '7. Fermeture et sauvegarde
     ' Workbooks("New.xls").Close savechanges:=True
     
    End If
    WBfirst.Activate
    Next
    Donc je fais :
    Lancement de mon code depuis le fichier WBfirst. J'ouvre mon second classeur nommé new (WBsecond). Je reviens dans mon premier classeur. Boucle sur les feuilles de mon classeur. Je copie la feuille 1, j'ouvre mon second classeur. Je crée une feuille alpha. Sur cette feuille, je colle mes données. Je copie/colle mes données dans la ligne i de manière organisée. Une fois que toutes les données que je souhaite sont copiées/collées dans la ligne i, je copie cette ligne et je la colle dans ma feuille data (présente dans le classeur new à la base), à la suite des données déjà entrées. Je supprime ma feuille alpha. Je repars dans mon premier classeur (boucle) dans ma seconde feuille. Je réitère les étapes précédentes.
    ...
    Jusqu'à ce que tout soit importé.
    Enfin je ferme mon classeur en enregistrant (code mis en pause pour l'instant, tant que ça fonctionne pas correctement : étape 7 ).

  6. #6
    Membre Expert
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Par défaut
    Re,

    Il y a un truc que j'ai du mal à comprendre (j'ai peut-être regardé trop vite) :

    A l'étape 3, tu copies les données dans "alpha" et ensuite, tu fais un Sheets("alpha").Delete

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 75
    Par défaut
    Oui c'est ça.

    Je crée dans mon second classeur une feuille alpha sur laquelle je colle la première feuille de mon premier classeur. Je copie / colle les données de manière ordonnée sur cette feuille alpha à la ligne 173 (i) (ligne qui est toujours vide). Je copie cette ligne que je colle dans ma feuille data. Une fois la ligne copiée, je supprime la feuille alpha. Je reviens sur mon premier classeur, je copie la seconde feuille. Je reviens sur mon second classeur. Je re-crée une feuille alpha et c'est reparti : copie/colle en ligne i ...

  8. #8
    Membre Expert
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Par défaut
    Re,

    Cette ligne affiche bien le noms de toutes les feuilles ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Debug.Print sht.Name

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 75
    Par défaut
    Je ne comprends pas totalement à quoi sert cette ligne. D'après ce que j'ai compris avec cette ligne de code on se place sur le nom (le titre) de la feuille de mon classeur. Ensuite avec la suite du code, on cherche à savoir si le titre de la feuille est différent du mot "Telecommande". Un mot pris de manière arbitraire car je ne pense pas qu'une personne appellerait sa feuille de ce nom là. Du coup je passe en revue l'ensemble des feuilles de mon classeur une à une. sht.select permet de sélectionner la feuille en "activation".

    Suite du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For Each sht In Worksheets
      Debug.Print sht.Name
     If sht.Name <> "Telecommande" Then
      sht.Select

  10. #10
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Bonjour,

    un bon code est sans Select !

    Lire l'aide VBA intégrée de la méthode Range.Copy - et son exemple - et aussi ceci pour moins de souci …

  11. #11
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 75
    Par défaut
    Merci pour ta réponse Marc-L. Le problème est que je viens de passer une semaine sur mon code que je dois rendre d'ici demain matin. Je n'aurai pas le temps de tout reprendre. Je dois faire avec ce que j'ai, d'autant plus que tout fonctionne excepté le message d'erreur à la fin . "L'importation" et l'agencement des données marche parfaitement.
    Une idée du comment résoudre le problème "Erreur d’exécution '1004' :
    La méthode Select de la classe Worksheet a échoué. " ?

    La prochaine fois que j'aurais ce type de problème à traiter, j'utiliserai ton code qui est bien plus rapide

    Précision : le code que j'ai mis n'est qu'une partie de mon code total concernant le déplacement des données. Il y a un peu plus de 50 parties à copier / coller !

  12. #12
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Ne reste alors que le décodage manuel :

    en mode pas à pas (via la touche F8) vérifier les valeurs des variables de la ligne déclenchant l'erreur …

    Bonne continuation !

  13. #13
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 344
    Par défaut
    ahhhhhhh le pas à pas, que c'est pas ch***, mais qu'est-ce que c'est pratique

    Par contre, peux-tu nous dire sur quelle ligne ça plante dans ton code ?
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  14. #14
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 75
    Par défaut
    Le problème survient au niveau de En pas à pas le problème survient à la toute fin, une fois que toutes les feuilles sont passées. Il n'en reste plus à traiter. Excel ne détecte pas le fait qu'il n'y en a plus et tente de sélectionner une feuille supplémentaire (qu'il n'y a donc pas).

  15. #15
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut



    CQFD : Select à proscrire donc !

  16. #16
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 75
    Par défaut
    Bonjour,
    Finalement on me laisse un peu plus de temps pour finir mon projet VBA (quelques heures). Des idées sur comment résoudre mon problème ?

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

Discussions similaires

  1. [LibreOffice][Tableur] Probleme avec ThisComponent.Sheets(0)
    Par ryan44x dans le forum OpenOffice & LibreOffice
    Réponses: 6
    Dernier message: 07/09/2015, 17h30
  2. probleme avec for-each
    Par tongo dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 16/06/2008, 10h49
  3. Probleme avec For Each
    Par Seth77 dans le forum VB.NET
    Réponses: 7
    Dernier message: 22/03/2007, 14h08
  4. [VB]Probleme avec for each .....
    Par STRUFIELD dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 20/01/2006, 08h31
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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