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 :

Problème d’exécution "1004"


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Août 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Août 2020
    Messages : 9
    Par défaut Problème d’exécution "1004"
    Bonjour, à tous !

    Grâce à l'aide d'un de vos collègues j'ai pu développer une macro qui interroge un répertoire pour en extraire des données contenues dans des fichiers excel de nombre inconnu.

    Cette macro utilise le MSR.

    J'encontre en revanche un petit souci ...

    Jusqu’à présent je faisais tourner la macro sur le "Thiswoorkbook" et elle faisait des extractions sur la "Feuil1"
    Pour un souci de pratique je voudrais qu'elle fasse une extraction sur la "Feuil2"
    Je pensais que ça allait être relativement simple à faire, mais je n'ai vraiment pas réussi à la faire changer ...

    Sauriez-vous comment je pourrais faire ce petit changement svp ??

    Au passage je n'ai pas forcément compris toutes les lignes de cette macro si vous avez quelques explications je suis preneur

    Code originel :

    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
    Sub ParcourirDossier()
     
    Dim FichierSélectionné As String
    Dim NumFichier As Integer
    Dim fs As FileDialog
    Dim DossierSélectionné As Folder
     
        Application.CutCopyMode = False
        Application.ScreenUpdating = False
     
     
        Set FichierPrincipal = ThisWorkbook
        Set FeuilleCompil = FichierPrincipal.Sheets("Feuil1")
        Set fs = Application.FileDialog(msoFileDialogFolderPicker)
        fs.Title = "Selection du dossier à parcourir"
        fs.AllowMultiSelect = False
        fs.InitialFileName = Chemin
        fs.Show
        If fs.SelectedItems.Count < 1 Then Exit Sub
        Set fso = New FileSystemObject
        Set DossierSélectionné = fso.GetFolder(fs.SelectedItems(1))
     
        Call scan(DossierSélectionné)
     
    End Sub
     
    Sub scan(ByVal Dossier As Folder)
     
    Dim NomFichier As String
    Dim Classeur As Workbook
     
        For Each Fichier In Dossier.Files
            Select Case Right(Fichier, 3)
                Case "xls", "lsx", "lsm", "lsb"
                    If Left(Fichier.Name, 1) <> "~" Then 'Permet d'exclure les fichier temporaires
                        Workbooks.Open Fichier
                        Set Classeur = ActiveWorkbook
     
                        Classeur.Sheets(2).Range("A1").CurrentRegion.Copy
     
                        ThisWorkbook.Sheets(1).Range("A1").End(xlDown).Offset(1, 0).PasteSpecial xlPasteValues
     
     
                        Classeur.Close False
                    End If
            End Select
        Next Fichier
     
        For Each Sousdossier In Dossier.SubFolders
            Call scan(Sousdossier)
        Next
     
        Application.CutCopyMode = True
        Application.ScreenUpdating = True
     
    End Sub
    Code rectifié (Défectueux) :

    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
    Sub ParcourirDossier()
     
    Dim FichierSélectionné As String
    Dim NumFichier As Integer
    Dim fs As FileDialog
    Dim DossierSélectionné As Folder
     
        Application.CutCopyMode = False
        Application.ScreenUpdating = False
     
     
        Set FichierPrincipal = ThisWorkbook
        Set FeuilleCompil = FichierPrincipal.Sheets("Feuil2")
        Set fs = Application.FileDialog(msoFileDialogFolderPicker)
        fs.Title = "Selection du dossier à parcourir"
        fs.AllowMultiSelect = False
        fs.InitialFileName = Chemin
        fs.Show
        If fs.SelectedItems.Count < 1 Then Exit Sub
        Set fso = New FileSystemObject
        Set DossierSélectionné = fso.GetFolder(fs.SelectedItems(1))
     
        Call scan(DossierSélectionné)
     
    End Sub
     
    Sub scan(ByVal Dossier As Folder)
     
    Dim NomFichier As String
    Dim Classeur As Workbook
     
        For Each Fichier In Dossier.Files
            Select Case Right(Fichier, 3)
                Case "xls", "lsx", "lsm", "lsb"
                    If Left(Fichier.Name, 1) <> "~" Then 'Permet d'exclure les fichier temporaires
                        Workbooks.Open Fichier
                        Set Classeur = ActiveWorkbook
     
                        Classeur.Sheets(2).Range("A1").CurrentRegion.Copy
     
                        ThisWorkbook.Sheets(2).Range("A1").End(xlDown).Offset(1, 0).PasteSpecial xlPasteValues
     
     
                        Classeur.Close False
                    End If
            End Select
        Next Fichier
     
        For Each Sousdossier In Dossier.SubFolders
            Call scan(Sousdossier)
        Next
     
        Application.CutCopyMode = True
        Application.ScreenUpdating = True
     
    End Sub
    Merci d'avance pour vos réponses !

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonjour,

    À vue de nez,,et sans avoir tester, je dirais que la ligne incriminé est la 39, tu essaies de copier la feuille 2 de ton classeur cible, probablement inexistante dans celui-ci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Classeur.Sheets(2).Range("A1").CurrentRegion
    Devait rester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Classeur.Sheets(1).Range("A1").CurrentRegion

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une feuille de calcul est un objet Worksheet qui fait partie de la collection Worksheets.
    Le membre d'une collection peut être appelé soit par son numéro d'indice, exemple Worksheets(1) ou par son nom, exemple Worksheets("Chiffre d'affaires")
    Sauf si c'est pour parcourir une collection, il est fortement déconseillé d'utiliser le numéro d'indice car celui-ci dépend de la position de la feuille dans le classeur.

    Pour s'affranchir de toute modification du nom d'une feuille par l'utilisateur, il est hautement conseillé d'utiliser le CodeName de la feuille (voir ce billet VBA – CodeName d’une feuille Excel)

    Pour info : Sheet est un objet feuille qui fait partie de la collection Sheets (cela peut-être une feuille de calcul, graphique ou macro). Dans la majeure partie des cas en VBA, on utilise des feuilles de calcul. Il est donc préférable d'utiliser l'objet Worksheet
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2018
    Messages : 14
    Par défaut
    Excuse moi j'ai oublié de spécifier mais je souhaiterais copié les cellules qui sont sur le feuille 2 pour les collés sur la feuille 2 de mon fichier de synthèse.

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Lorsque l'on copie des cellules il y a toujours une source et une cible. La syntaxe est toujours la même quelque soit l'endroit où se trouve la source et la cible, il suffit de préciser la parentalité complète de celles-ci, soit le classeur et la feuille.
    Idéalement on prévoit deux variables objets de type Range (par exemple rngSource et rngTarget) où l'on précisera le classeur (Workbook) et la feuille (Worksheet) de chacun)

    La syntaxe sera alors tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rngSource.Copy Destination:=rngTarget
    Exemples de déclarations et assignations des variables à placer avant le code ci-dessus
    Pour ces deux exemples, j'ai ajouté deux variables de type Worksheet pour définir les feuilles "cible" et "source"

    Exemple 1 : La plage "source" et la cellule "cible" sont dans le même classeur (ici ThisWorkbook) mais dans des feuilles distinctes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      ' Déclaration
      Dim shtSource As Worksheet ' Feuille source
      Dim shtTarget As Worksheet ' Feuille cible
      Dim rngSource As Range     ' Plage source
      Dim rngTarget As Range     ' Cellule cible
      ' Assignation
      With ThisWorkbook
        Set shtSource = .Worksheets("CA").Range("A1").CurrentRegion
        Set shtTarget = .Worksheets("Synthèse").Range("F8")
      End With
      Set rngSource = shtSource.Range("A1").CurrentRegion
      Set rngTarget = shtTarget.Range("F8")
    Exemple 2 : La plage "source" et la cellule "cible" sont dans des classeurs différents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      ' Déclaration
      Dim shtSource As Worksheet ' Feuille source
      Dim shtTarget As Worksheet ' Feuille cible
      Dim rngSource As Range     ' Plage source
      Dim rngTarget As Range     ' Cellule cible
      ' Assignation
      Set shtSource = Workbooks("Mes affaires.xlsx").Worksheets("CA").Range("A1").CurrentRegion
      Set shtTarget = ThisWorkbook.Worksheets("Synthèse").Range("F8")
      Set rngSource = shtSource.Range("A1").CurrentRegion
      Set rngTarget = shtTarget.Range("F8")
    Attention, écrit de mémoire donc non testé
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. [Système] Problème de quote
    Par mikebranque dans le forum Langage
    Réponses: 1
    Dernier message: 25/05/2006, 17h38
  2. Problème de quote avec XPath
    Par fadjerx dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 23/03/2006, 14h45
  3. [JS] Problème de quotes pour enregistrer un formulaire.
    Par polnioumane dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 24/10/2005, 17h04
  4. Problème de quotes sous PostGre
    Par Philhz dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 11/07/2004, 13h03
  5. Problème de quote
    Par kennini dans le forum ASP
    Réponses: 4
    Dernier message: 20/11/2003, 09h40

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