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


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut Erreur 1004
    Bonjour à tous,

    voici le code que j'ai développé:


    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 alim_table()
     
    y = 2
    x = 7
    Do Until y = 40
        x = 7
        Do Until x = 58
        If Cells(x, y) = "x" Then
        Workbooks.Open Filename:=Range("c63") & "\DT" & "_" & Cells(x, 1) & "_" & Cells(5, y) & ".xls"
     
            Sheets("Temps").Select
            l = Cells(7, 21).Value
     
            x = 10
            Do Until x = 30
            Sheets("Temps").Select
            If Cells(x, 21).Value <> "vide" Then
     
            Sheets("Temps").Select
            c = Cells(x, 21).Value + 3
            t = Cells(x, 18).Value
     
     
            ThisWorkbook.Activate
            Sheets("base").Select
            Cells(l + 3, c).Select
            ActiveCell.Value = t
     
            x = x + 1
            Else
            x = x + 1
            End If
     
            Loop
     
        ActiveWorkbook.Close
        Cells(x, y + 1) = "x"
        Else
        End If
        x = x + 1
        Loop
     
    y = y + 2
    Loop
     
    End Sub

    Une erreur 1004 apparaît au niveau "Cells(l + 3, c).Select"
    Enfait, il s'agit d'alimenter une base de donnée à partir de données situées sur un fichier excel externe....
    Pouvez vous m'aider?

  2. #2
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    bonjour,

    et quel est la valeur de c et de l à ce moment là?

  3. #3
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    l=cells(7,21).value mais cette cellule provient de l'autre classeur!!

    Meme chose pour c

    c=cells(x,21).value+3, mais cette cellule provient de la feuille temps de l'autre classeur....

    Je pense également que le probleme vient de la...

    Comment faire?

  4. #4
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    dans un premier temp, simplement t'assurer que les valeurs que tu récupére ne sortent pas du champs d'action

    65536 pour l
    et 255 pour c

    aussi que tu ne récupere pas un champ de type texte.

  5. #5
    Membre Expert Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Par défaut
    bonjour

    pour les valeurs de i et de c, toi seul peut le dire

    quand tu as l'erreur, tu fais deboggage et quand tu passes le pointeur souris sur les variables, il te donne la valeur de la variable

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 288
    Par défaut
    Citation Envoyé par bykeman Voir le message
    Bonjour à tous,

    voici le code que j'ai développé:

    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 alim_table()
     
    y = 2
    x = 7
    Do Until y = 40
        x = 7
        Do Until x = 58
        If Cells(x, y) = "x" Then
        Workbooks.Open Filename:=Range("c63") & "\DT" & "_" & Cells(x, 1) & "_" & Cells(5, y) & ".xls"
     
            Sheets("Temps").Select
            l = Cells(7, 21).Value
     
            x = 10
            Do Until x = 30
            Sheets("Temps").Select
            If Cells(x, 21).Value <> "vide" Then
     
            Sheets("Temps").Select
            c = Cells(x, 21).Value + 3
            t = Cells(x, 18).Value
     
     
            ThisWorkbook.Activate
            Sheets("base").Select
            Cells(l + 3, c).Select
            ActiveCell.Value = t
     
            x = x + 1
            Else
            x = x + 1
            End If
     
            Loop
     
        ActiveWorkbook.Close
        Cells(x, y + 1) = "x"
        Else
        End If
        x = x + 1
        Loop
     
    y = y + 2
    Loop
     
    End Sub

    Une erreur 1004 apparaît au niveau "Cells(l + 3, c).Select"
    Enfait, il s'agit d'alimenter une base de donnée à partir de données situées sur un fichier excel externe....
    Pouvez vous m'aider?
    j'ai cherhcé a savoir a quoi correspond l'erreur 1004 :
    Symptômes
    Lorsque vous essayez de copier et coller par programmation des données filtrées dans un classeur Microsoft Office Excel 2003, l'un des messages d'erreur suivants s'affiche :
    Erreur d'exécution 1004 : La méthode Paste de la classe Worksheet a échoué.
    Erreur d'exécution 1004 : La méthode Copy de la classe Range a échoué.
    Vous recevez l'un de ces messages d'erreur même si les données sont collées dans le classeur.

    Remarque Ce problème ne se produit pas lorsque les données ne sont pas filtrées.
    Cause
    Ce problème peut se produire lorsque l'une des conditions suivantes est remplie : • La macro Microsoft Visual Basic pour Applications (VBA) copie et colle une ligne entière dans un classeur Excel 2003.
    • La macro Microsoft VBA copie et colle une plage de 2 516 lignes ou plus dans un classeur Excel 2003.
    Contournement
    Microsoft fournit des exemples de programmation à des fins d'illustration uniquement, sans garantie explicite ou implicite. Ceci inclut, de manière non limitative, les garanties implicites de qualité marchande ou d'adéquation à un usage particulier. Cet article suppose que vous connaissez le langage de programmation présenté et les outils utilisés pour créer et déboguer des procédures. Les techniciens du support technique Microsoft peuvent vous expliquer les fonctionnalités d'une procédure particulière, mais ils ne peuvent pas modifier les exemples en vue de vous fournir des fonctionnalités supplémentaires ou de créer des procédures répondant à vos besoins spécifiques.

    Pour contourner ce problème si votre macro VBA copie et colle une ligne entière, modifiez le code de la macro pour copier uniquement la section de la ligne contenant des données. Par exemple, utilisez un code de macro VBA semblable au suivant :Range(Range("A" & ActiveCell.Row), Range("IV" & ActiveCell.Row).End(xlToLeft)).Select
    Pour contourner ce problème si votre macro VBA copie et colle une plage de 2 516 lignes ou plus, modifiez le code de la macro pour s'exécuter en boucle pour copier et coller des plages de données plus réduites jusqu'à ce que toute la plage souhaitée soit copiée et collée.
    ce qui me parait etrange c'est que je n'ai pas vu de copier/coller dans ton code (je ne l'ai peut etre pas vu?)

    je sais pas si ca va t'aider...

    sinon ajoute des msgbox(l) et msgbox(c) pour connaitre leur valeur... c'est peut etre une valeur qui ne peut pas correspondre a un numero de ligne ou de colonne?

  7. #7
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    Bah justement, quand je passe dessus..rien ne s'affiche.....Désolé je suis un noob

  8. #8
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    juste avant la ligne en question met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    msgbox l+3 & vbcr & c

  9. #9
    Membre Expert Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Par défaut
    re:, bonjour à tous

    l'erreur 1004 est un peu un foure tout : dès qu'un objet n'existe pas, il met l'erreur 1004

    exemple : activation d'une feuille inexistante (souvent quand on travaille sur plusieurs classeur)

    une reference de cellule incorrecte : cells(1,0) la colonne 0 n'existe pas

    cette erreur c'est celle qu'il sort le plus

  10. #10
    Membre Expert
    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
    Par défaut
    Salut à tous
    Dans la série : "je me fais des noeuds aux boyaux de la tête"....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    y = 2
    x = 7
    Do Until y = 40
        x = 7
        Do Until x = 58
            x = 10
            Do Until x = 30
            Sheets("Temps").Select
    Sans réellement analyser, je trouve bizarre de faire 2 boucles imbriquées sur la même variable.
    essaie de remplacer Until...= par Until...>=
    Je suppose que la macro est sur un module général et les feuilles Temps existent dans tous les fichiers, y compris celui contenant la macro.
    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
        Workbooks.Open Filename:=Range("c63") & "\DT" & "_" & Cells(x, 1) & "_" & Cells(5, y) & ".xls"
            Sheets("Temps").Select
            l = Cells(7, 21).Value
            x = 10
            Do Until x = 30
                Sheets("Temps").Select
                If Cells(x, 21).Value <> "vide" Then
                  Sheets("Temps").......
                  ThisWorkbook.Activate
                  Sheets("base")....
                  x = x + 1
                Else
                  x = x + 1
               End If
             Loop
        ActiveWorkbook.Close
    Comprend pas bien non plus cette partie du code : si on trouve une cellule marquée "vide" en U du classeur qu'on ouvre, on repasse sur le classeur initial et on continue la boucle sur le classeur initial ? Pour moi, soit on devrait sortir de la boucle (mais il faut redéfinir X, qui peut être impaire), soit au devrait revenir au classeur qu'on testait.
    Mais le code est tellement compliqué (pas complexe)....
    If ;;;; then
    ....
    X=X+1
    else
    X=X+1
    Endif
    Si le test en OK, je fais du traitement, puis j'ajoute 1 à X, sinon j'ajoute 1 à x. Moi, je ferais mon test, avec traitement si OK, puis après, j'ajoutrais 1 à X
    If ;;;; then
    ....
    Endif
    X=X+1

    Et j'utiliserais des boucles For x=y to z step 1 ou 2 avec 3 variables déclarées.
    Tes valeurs sont fixes, pas besoin de faire une boucle Do
    Je fixerais les classeurs et feuilles en variables et je supprimerais les select et activate. Et au moins, je saurais à tout moment la cellule réellement testée.

    Mais comme je ne comprends pas le but, ni la syntaxe et que je n'ai pas les données....
    A+

  11. #11
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    Voila ou est le problème enfait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    x = 7
        Do Until x = 58
        If Cells(x, y) = "x" Then
        Workbooks.Open Filename:=Range("c63") & "\DT" & "_" & Cells(x, 1) & "_" & Cells(5, y) & ".xls"
        
            Sheets("Temps").Select
            l = Cells(7, 21).Value 
            x = 10
            Do Until x = 30
            Sheets("Temps").Select
    Je veux qu'il selectionne la feuille temps du fichier qui vient juste d'être ouvert, et que la variable "l"soit égale à la cellule "u21" de cette feuille temps. Or, la macro, en mode débogage, m'annonce que la variable "l"=vide, alors que la case "u21" de la feuille temps du fichier qui vient d'être ouvert est renseignée par un nombre....

    Pourquoi cela?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 117
    Par défaut
    euh..., cells (7,21) te renvoie la cellule u7 et non la cellule u21.(cells(21,21))

    sinon essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     l= Sheets("Temps").Cells(7, 21).Value
    mais c'est pas sur que se soit sa.
    Bon courage.

  13. #13
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    euh oui!! u7

    Mais merci, "l= Sheets("Temps").Cells(7, 21).Value" marche nickel

  14. #14
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    Par contre, après avoir rempli la baseau niveau des "XXXXX"), il faut que je le rebascule sur l'autre fichier ouvert (la ou on récupère les données) pour recommencer la boucle.... Comment faire?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sheets("Temps").Select
            c = Sheets("Temps").Cells(x, 21).Value + 3
            t = Sheets("Temps").Cells(x, 18).Value
    
            ThisWorkbook.Activate
            Sheets("base").Select
            Sheets("base").Cells(l + 3, c).Select
            ActiveCell.Value = t
            XXXXXXXXXXXXXXXXXXXX
      
            x = x + 1
            Else
            x = x + 1
            End If

  15. #15
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    basculer sur l'autre fichiers, n'est pas vraiment conseillé
    sauf si faire clignoter excel est une des base de ton programme

    il vaux mieux y faire référence comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    dim AutreFichier as Workbook
     
    ...
    ...
     
    set Autrefichier= getobject("l'autrefichierenquestion")
     
    ' et ensuite y faire appel 
    autrefichier.sheets("autresheet").range.......
    d'une manière générale, évitons les select, activate et autre si ce n'est pas indispensable

  16. #16
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    Je vois ce que tu veux dire Mayekeul...

    Mais comment faire quand l'autre fichier est une variable ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Filename:=Range("c63") & "\DT" & "_" & Cells(x, 1) & "_" & Cells(5, y) & ".xls"

  17. #17
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Comme cela a été répété de nombreuses fois et comme le dit encore Mayekeul évitez les "select" inutiles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sheets("Temps").Select
            c = Sheets("Temps").Cells(x, 21).Value + 3
            t = Sheets("Temps").Cells(x, 18).Value
    
            ThisWorkbook.Activate
            Sheets("base").Select
            Sheets("base").Cells(l + 3, c).Select
            ActiveCell.Value = t
            XXXXXXXXXXXXXXXXXXXX



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    c = Sheets("Temps").Cells(x, 21).Value + 3
            t = Sheets("Temps").Cells(x, 18).Value
     
            ThisWorkbook.Activate
            Sheets("base").Cells(l + 3, c) = t
            XXXXXXXXXXXXXXXXXXXX
    devrait donner le même résultat.

  18. #18
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    Effectivement, le tout est plus court et marche tout autant:

    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
    Sub alim_table()
     
    y = 2
    x = 7
    Do Until y = 40
        x = 7
        Do Until x = 58
        If Cells(x, y) = "x" Then
        Workbooks.Open Filename:=Range("c63") & "\DT" & "_" & Cells(x, 1) & "_" & Cells(5, y) & ".xls"
     
            l = Sheets("Temps").Cells(7, 21).Value
            x = 10
            Do Until x = 30
            l = Sheets("Temps").Cells(7, 21).Value
            If Sheets("Temps").Cells(x, 21).Value <> "vide" Then
            c = Sheets("Temps").Cells(x, 21).Value + 3
            t = Sheets("Temps").Cells(x, 18).Value
            ThisWorkbook.Activate
            Sheets("base").Cells(l + 3, c) = t
     
     
            x = x + 1
            Else
            x = x + 1
            End If
     
            Loop
     
        ActiveWorkbook.Close
        Cells(x, y + 1) = "x"
        Else
        End If
        x = x + 1
        Loop
     
    y = y + 2
    Loop
    Par contre, pour définir les classeurs, je sais pas si c'est possible, car la macro ouvre un fichier, prend les données, alimente une base, et ferme le fichier, pour ensuite en réouvrir un autre....et ainsi de suite....(au total, il devrait y avoir 12 fichiers différents par semaine) (c'est un suivi des temps que je réalise....)

    Donc le fichier à ouvrir, à lire et à fermer est une variable.....

  19. #19
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    Bon enfait il faudrait définir un nom au fichier Activeworkbook, qui est le fichier ouvert par la macro, et donc le faire juste après l'"ouverture de ce fameux fichier...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Do Until x = 58
        If Cells(x, y) = "x" Then
        Workbooks.Open Filename:=Range("c63") & "\DT" & "_" & Cells(x, 1) & "_" & Cells(5, y) & ".xls"
            XXXXXXXX
            l = Sheets("Temps").Cells(7, 21).Value
            x = 10

  20. #20
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    On suppose que le chemin est toujours : =Range("c63") & "\" ?

    Dans ce cas, en début de procédure vous utilisez une variable pour le chemin, exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chemin =Range("c63") & "\"
    Ensuite pour le fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Cells(x, y) = "x" Then
    nomfich = "DT" & "_" & Cells(x, 1) & "_" & Cells(5, y) & ".xls"
        Workbooks.Open chemin & nomfich
    Vous pouvez ensuite utiliser la variable nomfich pour activer le classeur, le fermer, le sauvegarder etc...

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Windows(nomfich).Activate
    D'autre part, tout comme pour une feuille ou une cellule, vous n'êtes pas obligé d'activer un classeur pour affecter le contenu d'une cellule ou d'une variable, exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks(nomfich).sheets("Base").cells(x , y) = mavariable
    ou utiliser l'instruction "Set" pour éviter d'avoir à répéter "Workbooks" et "Sheets", exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set mfl = Workbooks(nomfich).Sheets("Base")
     
    et en fin de boucle ou de procédure
     
    Set mfl = nothing
    Dernière modification par Invité ; 03/06/2008 à 19h37.

Discussions similaires

  1. pb Range: erreur 1004
    Par charlie105 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/11/2006, 17h10
  2. [VB-E] Erreur 1004 dans une boucle For
    Par lycaon dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 02/11/2006, 22h41
  3. [VBA][EXCEL]Erreur '1004' avec "Application.Run"
    Par Ania dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/01/2006, 10h50
  4. [Excel] Erreur 1004 avec un search
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/12/2005, 13h54
  5. Insérer une image : Erreur 1004
    Par dp_favresa dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 26/10/2005, 14h01

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