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 une macro de copie de lignes


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    enquiquineur d'unparia
    Inscrit en
    Février 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : enquiquineur d'unparia

    Informations forums :
    Inscription : Février 2014
    Messages : 82
    Points : 48
    Points
    48
    Par défaut Erreur 1004 sur une macro de copie de lignes
    Bonjour,

    Je cherche actuellement à faire une macro qui va copier la ligne x_source de la feuille source jusqu'à la colonne numéro stop_col, vers une ligne x_destination de la feuille destination.
    On n'écrira dans la feuille destination uniquement si la cellule source est non vide en texte et non nulle.
    Cependant j'obtient une erreur du type 1004, qui provient je pense, de mes variables sources et destination qui sont des feuilles.
    Je crois qu'il n'a pas accès à ces feuilles, je ne sais pas...
    Voilà 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
     
     
    Public Sub copie_ligne(source As Worksheet, x_source As Integer, destination As Worksheet, x_destination As Integer, stop_col As Integer)
     
        Dim y, z As Integer
        source.Activate
        Do While y <> stop_col
     
             If (source.Cells(x_source, y) <> "") And (Not (IsEmpty(source.Cells(x_source, y)))) Then
                destination.Cells(x_destination, z) = source.Cells(x_source, y)
                z = z + 1
             End If
     
            y = y + 1
        Loop
     
    End Sub
    Merci !

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 931
    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 : 12 931
    Points : 28 926
    Points
    28 926
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    A quelle ligne à lieu cette erreur 1004 ?
    Comment passes-tu les arguments Destination et Source ?
    Pourrais-tu afficher la ligne qui appelle la procédure copie_ligne.
    Même si ce n'est peut-être pas la cause de ton erreur, l'argument x_source étant un numéro de ligne si j'en crois ton instruction source.Cells(x_source, y), il serait préférable de lui donner un type Long plutôt qu'Integer. En effet il y a plus de 32767 lignes dans une feuille d'excel, c'est donc un risque d'erreur.
    Cette remarque vaut également pour l'argument x_destination

  3. #3
    Invité
    Invité(e)
    Par défaut Bonjour,
    je trouve deux chose de bizarre!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim y, z As Integer
        source.Activate
        Do While y <> stop_col
    tu es consciente que Y et Z sont à zéro par défaut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     If (source.Cells(x_source, y) <> "") And (Not (IsEmpty(source.Cells(x_source, y)))) Then 'Y=0
                destination.Cells(x_destination, z) = source.Cells(x_source, y) 'Z=0
    deplus,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If (source.Cells(x_source, y) <> "") And (Not (IsEmpty(source.Cells(x_source, y)))) Then 'si IsEmpty(source.Cells(x_source, y))=true alor source.Cells(x_source, y) <> "" erreur!  
                destination.Cells(x_destination, z) = source.Cells(x_source, y)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Sub copie_ligne(source As Worksheet, x_source As Integer, destination As Worksheet, x_destination As Integer, stop_col As Integer)
        Dim y, z As Integer
        source.Activate
     y=1: z=1
        Do While y <> stop_col
     
             If Trim("" & source.Cells(x_source, y)) <> "" Then
     
                destination.Cells(x_destination, z) = source.Cells(x_source, y)
     z = z + 1
             End If
      y = y + 1
        Loop
    End Sub

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 931
    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 : 12 931
    Points : 28 926
    Points
    28 926
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ajouterais encore que dans cette ligne de déclaration
    La variable y est de type Variant et pas Integer. La bonne syntaxe est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim y As Integer, z As Integer

  5. #5
    Membre du Club
    Homme Profil pro
    enquiquineur d'unparia
    Inscrit en
    Février 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : enquiquineur d'unparia

    Informations forums :
    Inscription : Février 2014
    Messages : 82
    Points : 48
    Points
    48
    Par défaut
    Bonjour!
    J'ai laissé Integer et non Long, car dans mon cas il est quasi improbable que je dépasse la taille maximale.
    Je pense que le problème venait de ma décalaration de variable "...z, x, y As Integer"

    Je vous joint mon code, qui marche désormais !
    Si vous voyez des choses " peu propres" ou maladroites, n'hésitez pas je reste à l'écoute !

    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
     
    Sub format_data_m()
     
        Dim y As Integer, x As Integer, cible As Integer
        y = 4
        Do While Not (IsEmpty(Worksheets(3).Cells(y, 1)))
            y = y + 1
        Loop
        ' MsgBox "Est vide : " & y
        cible = y + 1
        x = 1
        y = 1
     
        Do While x <> 18
     
            If Worksheets(3).Cells(cible, x) <> "" And Not (IsEmpty(Worksheets(3).Cells(cible, x))) Then
                Worksheets(1).Cells(2, y) = Worksheets(3).Cells(cible, x)
                y = y + 1
            End If
            x = x + 1
        Loop
     
        Call copie_ligne(Worksheets(3), cible, Worksheets(2), 2, 18)
     
     
    End Sub
     
    Public Sub copie_ligne(source As Worksheet, x_source As Integer, destination As Worksheet, x_destination As Integer, stop_col As Integer)
     
        Dim y As Long, z As Long
        source.Activate
        y = 1
        z = 1
     
        Do While y <> stop_col
     
             If (source.Cells(x_source, y) <> "") And (Not (IsEmpty(source.Cells(x_source, y)))) Then
                destination.Cells(x_destination, z) = source.Cells(x_source, y)
                z = z + 1
             End If
     
            y = y + 1
        Loop
     
    End Sub

  6. #6
    Expert éminent sénior
    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
    Points : 18 674
    Points
    18 674
    Par défaut

    Bonjour,

    il y a tellement de choses qui pourraient être revues que je préfère ne rien tenter !
    Par exemple, mauvaise définition de variables pouvant engendrer des erreurs,
    pas besoin de boucle pour trouver la dernière cellule saisie ou la première libre,
    pas besoin de boucle non plus pour recopier sous condition des données …
    Bref, cela devrait nécessiter moins de dix lignes de codes !

    Mieux vaut joindre un classeur exemple avec une feuille source et une autre résultat
    accompagné d'une présentation claire & exhaustive, là un code optimisé pourrait être proposé …

  7. #7
    Membre du Club
    Homme Profil pro
    enquiquineur d'unparia
    Inscrit en
    Février 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : enquiquineur d'unparia

    Informations forums :
    Inscription : Février 2014
    Messages : 82
    Points : 48
    Points
    48
    Par défaut
    Merci

  8. #8
    Expert éminent sénior
    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
    Points : 18 674
    Points
    18 674
    Par défaut

    Exemple dans cette discussion dans laquelle des solutions prennent plus de dix lignes,
    une même à plus de trente, et la mienne n'en nécessitant que quatre …

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

Discussions similaires

  1. Erreur 1004 sur une feuille protégée
    Par lilou315 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/09/2011, 14h48
  2. [XL-2003] erreur 1004 sur une instruction (VB)
    Par Adweuz dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/04/2011, 12h06
  3. Erreur 1004 sur Range(cells,cells).copy
    Par Sebastien57 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/10/2009, 11h33
  4. 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
  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