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 :

Erreur 1004 sur propriété Range lors d'une copie de données d'un fichier à un autre


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 217
    Points : 66
    Points
    66
    Par défaut Erreur 1004 sur propriété Range lors d'une copie de données d'un fichier à un autre
    Bonjour,
    à l'aide d'une macro je tente de recopier une valeur d'un fichier excel à un autre (les deux ont la même structure) à partir d'un numéro qu'ils ont en commun (sur la première colonne) et qui sert de référence.

    C'est un bout de code que j'avais déjà utilisé tel quel sans souci et pourtant j'obtiens une erreur 1004 "la propriété Range de l'objet worksheet a échoué".
    Voici le 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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    Sub Copieinfos()
    Dim FL1 As Worksheet
    Dim FL2 As Worksheet
    Dim NoLigneF2 As Integer
    Dim DerniereLigneF2 As Integer
    DerniereLigneF1 As Integer
    Dim identifiant As String
    Dim PlageFL1 As Range
    Dim c As Range
     
        Set FL2 = ThisWorkbook.ActiveSheet
        'nom du classeur secondaire
        Set FL1 = Workbooks("Classeur2.xls").Worksheets("Feuil1")
     
        'test si le filtre du fichier Classeur2 est actif
        If FL1.FilterMode Then
     
        'si c'est le cas on l'enlève
        FL1.ShowAllData
     
        End If
     
     
     
     
     'Plage de recherche de l'identifiant dans FL1
        DerniereLigneF1 = FL1.Range("A65535").End(xlUp).Row
        MsgBox DerniereLigneF1
     
        Set PlageFL1 = FL1.Range(Cells(2, 1), Cells(DerniereLigneF1, 1))
     
        'Dernière ligne renseignée dans FL2
        DerniereLigneF2 = FL2.Range("A65535").End(xlUp).Row
     
        'Lecture de la cellule ds Classeur A (noligne commence à 2 car en-tête)
        For NoLigneF2 = 2 To DerniereLigneF2
     
                         'on a un affaire alors on lit l'identifiant
                 identifiant = FL2.Cells(NoLigneF2, 1).Value
                 'la recherche de l'identifiant lu dans FL2 se fait dans FL1
                 With PlageFL1
                      Set c = .Find(identifiant, LookIn:=xlValues, Lookat:=xlWhole)
                      If Not c Is Nothing Then 'donnée trouvée
                           'on colle les infos dans FL1
                           'Récupération de l'info
                            FL2.Activate
                            FL2.Cells(NoLigneF2, 47).Select
                            Selection.Copy
                            FL1.Activate
                            FL1.Cells(c.Row, 47).Select
                         End If
                      Set c = Nothing
                  End With
     
        Next
        Set PlageFL1 = Nothing
        End Sub
    Mon erreur 1004 sur la propriété Range apparaît à cet endroit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set PlageFL1 = FL1.Range(Cells(2, 1), Cells(DerniereLigneF1, 1))
    D'ou peut provenir cette erreur sachant que, comme je l'ai dit au-dessus, j'ai déjà utilisé de nombreuses fois le même code sans aucun problème.
    Merci pour vos remarques,
    M

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut
    Déjà, un dim manquant, mais bof
    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
    Sub Copieinfos()
    Dim FL1 As Worksheet
    Dim FL2 As Worksheet
    Dim NoLigneF2 As Integer
    Dim DerniereLigneF2 As Integer
    Dim DerniereLigneF1 As Integer
    Dim identifiant As String
    Dim PlageFL1 As Range
    Dim c As Range
    Set FL2 = ThisWorkbook.ActiveSheet
    Set FL1 = Workbooks("Classeur2.xls").Worksheets("Feuil1")
    If FL1.FilterMode Then FL1.ShowAllData
    DerniereLigneF1 = FL1.Range("A65535").End(xlUp).Row
    MsgBox DerniereLigneF1
    Set PlageFL1 = FL1.Range(FL1.Cells(2, 1), FL1.Cells(DerniereLigneF1, 1))
    DerniereLigneF2 = FL2.Range("A65535").End(xlUp).Row
    For NoLigneF2 = 2 To DerniereLigneF2
        identifiant = FL2.Cells(NoLigneF2, "A")
        With PlageFL1
            Set c = .Find(identifiant, LookIn:=xlValues, Lookat:=xlWhole)
            If Not c Is Nothing Then FL2.Cells(NoLigneF2, 47).Copy FL1.Cells(c.Row, 47)
            Set c = Nothing
        End With
    Next
    End Sub
    devrait sans doute mieux fonctionner
    J'en ai profité pour simplifier, mais pas forcément utile
    A+

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour,
    si tu a plus de 32000 lignes et quelques,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim DerniereLigneF2 As Integer
    'devrair être remplacer par...
    Dim DerniereLigneF2 As long
    et je ne sais pas si c'est une erreur de copier/coller mais..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DerniereLigneF1 As Integer.....??
    A+

  4. #4
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut
    Bonsoir,

    Ce code ne peut pas marcher. Tu as dû le modifier depuis l’utilisation précédente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Set FL2 = ThisWorkbook.ActiveSheet
        'nom du classeur secondaire
        Set FL1 = Workbooks("Classeur2.xls").Worksheets("Feuil1")
     'Plage de recherche de l'identifiant dans FL1
        DerniereLigneF1 = FL1.Range("A65535").End(xlUp).Row
        Set PlageFL1 = FL1.Range(Cells(2, 1), Cells(DerniereLigneF1, 1))
    Cells sans qualificatif fait référence à la feuille active, FL2 dans ton code. Tu essaies donc de définir une plage de FL1, composée exclusivement de cellules de FL2. Logique que cela plante.

    Essaie de corriger ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set PlageFL1 = Range(FL1.Cells(2, 1), FL1.Cells(DerniereLigneF1, 1))
    Je n’ai pas testé, mais je suis à peu près sûr que cela résoud le problème

  5. #5
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut
    Bonsoir,

    Citation Envoyé par LeForestier Voir le message
    Bonjour,
    si tu a plus de 32000 lignes et quelques
    Si le problème venait de là, ce ne serait pas une erreur 1004, mais plutôt une erreur 6 (dépassement de capacité) !

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Citation Envoyé par Bigalo Voir le message
    Bonsoir,



    Si le problème venait de là, ce ne serait pas une erreur 1004, mais plutôt une erreur 6 (dépassement de capacité) !
    Excact... répondu un peu trop vite

  7. #7
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut

  8. #8
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 217
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par Bigalo Voir le message
    Bonsoir,

    Ce code ne peut pas marcher. Tu as dû le modifier depuis l’utilisation précédente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Set FL2 = ThisWorkbook.ActiveSheet
        'nom du classeur secondaire
        Set FL1 = Workbooks("Classeur2.xls").Worksheets("Feuil1")
     'Plage de recherche de l'identifiant dans FL1
        DerniereLigneF1 = FL1.Range("A65535").End(xlUp).Row
        Set PlageFL1 = FL1.Range(Cells(2, 1), Cells(DerniereLigneF1, 1))
    Cells sans qualificatif fait référence à la feuille active, FL2 dans ton code. Tu essaies donc de définir une plage de FL1, composée exclusivement de cellules de FL2. Logique que cela plante.

    Essaie de corriger ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set PlageFL1 = Range(FL1.Cells(2, 1), FL1.Cells(DerniereLigneF1, 1))
    Je n’ai pas testé, mais je suis à peu près sûr que cela résoud le problème
    Salut, merci effectivement cela fonctionne!

    PS. Pour le Dim oublié c'était bien ne erreur de copier/coller, par contre j'avais oublié de mettre mon paste sur ma feuille de destination.
    Ca fonctionne impec à présent grand merci à tous!

  9. #9
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut
    Bonjour,

    Citation Envoyé par drthodt Voir le message
    Ca fonctionne impec à présent grand merci à tous!
    De rien

    Comme quoi une bonne relecture du code, sans même ouvrir Excel, peut suffire.

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

Discussions similaires

  1. [XL-2010] Erreur '1004' sur objet un Range lors d'un .copy
    Par ericjha dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/11/2014, 16h35
  2. erreur 1004 sur une méthode select
    Par lollo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2008, 19h21
  3. copier une plage de donnée d'un fichier à un autre
    Par kristoch91 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/10/2008, 10h26
  4. erreur 1004 sur un range
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 02/11/2007, 16h35
  5. Erreur 1004 sur une boucle simple
    Par ruzakruzak dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 06/07/2007, 09h00

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