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 - QQun peut m'aider ?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 3
    Par défaut Erreur 1004 - QQun peut m'aider ?
    Bonjour,

    Il se trouve que pour un fichier Excel, j'ai décidé de faire ma petite macro.

    Le principe est assez simple, mais un peu long à expliquer, je vais essayer d'être le plus clair possible :

    Il s'agit d'un tableau à deux entrées, dans la colonne H8, les cellules possèdent une liste déroulante de choix contenant une trentaine de valeur différentes.
    Les colonnes de I8 à N8, contiennent des valeurs qui dépendent de H8.

    Lorsque les colonnes de I à N de la ligne sélectionnée ne doivent pas contenir de valeurs, elles doivent être bloquées, et j'ai rajouté un fond de couleur différent, histoire de rendre le tableau plus lisible.
    Quand on change la valeur de la colonne H8, les colonnes de I à N changent en conséquence, et si H8 devient la valeur par défaut (""), la colonnes de I à N redeviennent à la couleur par défaut ( soit blanc, soit bleu clair selon si la ligne est paire ou impaire ).

    Tout marchait bien au début, puis, comme la colonne C contient une date, j'ai voulu rajouter un calendrier en feuille 2 ( ceci n'a peut être rien à voir avec mon pb, mais c'est la seule chose ayant changée ).

    J'ai donc fait mon calendrier avec la macro correspondante, histoire de griser et bloquer les jours fériés.

    Seulement voilà, maintenant, quand je change la valeur de H8, j'ai un message d'erreur qui me dit : "Erreur 1004, erreur définie par l'application ou par l'objet"
    Si je lance le débug, ça ne m'apprend pas grand chose, hormis que l'erreur est censé venir d'un contrôle ActiveX qui ne peut pas créer d'objet, alors qu'il n'existe pas de contrôle ActiveX dans ma feuille.

    Ne sachant pas d'où vient exactement l'erreur, mon code me semblant bon, je vous le copie :


    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    
    If Target.Row >= 8 And Target.Row <= 38 And Target.Column = 8 Then
    
    
    ActiveSheet.Unprotect "admin"
    
    Dim lig As Integer
    Dim temp As String
    Dim temp2 As String
    
    
    lig = Target.Row
    
    temp = "I" & lig & ":N" & lig
    Range(temp).Select
    Selection.Locked = False
    Selection.FormulaHidden = False
    'On vide les cases de la colonne I à N
    Cells(lig, 9).Value = ""
    Cells(lig, 10).Value = ""
    Cells(lig, 11).Value = ""
    Cells(lig, 12).Value = ""
    Cells(lig, 13).Value = ""
    Cells(lig, 14).Value = ""
    
    
    If lig Mod 2 = 0 Then 'Si la ligne est paire
    With Selection.Interior 'On colorie le fond en blanc
            .Pattern = xlSolid ' C'est ici que le compilo indique une erreur, ( si la ligne sélectionnée est paire, sinon c'est un peu plus bas ) sachant que le code en lui-même fonctionne parfaitement, puisqu'il provient d'un enregistrement, et fonctionne si on l'exécute en solo
            .PatternColorIndex = xlAutomatic
            .ThemeColor = xlThemeColorDark1
            .TintAndShade = 0
            .PatternTintAndShade = 0
    End With
    Else 'Si la ligne est impaire
    With Selection.Interior 'On colorie le fond en bleu clair
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .ThemeColor = xlThemeColorAccent1
            .TintAndShade = 0.799981688894314
            .PatternTintAndShade = 0
    End With
    End If
    
    
    
    'Cas n°1, que le compilo n'atteind plus...
    If Cells(lig, 8).Value = "Autres frais de séjour avec repas midi" Then
    temp = "I" & lig
    Range(temp).Select
    Selection.Locked = True
    Selection.FormulaHidden = True
        With Selection.Interior
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .ThemeColor = xlThemeColorLight2
            .TintAndShade = 0.599993896298105
            .PatternTintAndShade = 0
        End With
    Cells(lig, 11).Value = 1
    Cells(lig, 12).Value = 0
    Cells(lig, 13).Value = 0
    Cells(lig, 14).Value = 0
    temp = "L" & lig & ":N" & lig
    Range(temp).Select
    Selection.Locked = True
    Selection.FormulaHidden = True
    With Selection.Interior
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .ThemeColor = xlThemeColorAccent5
            .TintAndShade = 0.599993896298105
            .PatternTintAndShade = 0
    End With
    End If
    
    'Suivent ensuite les 30 autres cas, ainsi que la fin du programme :
    
    Range("H8").Select
    
    ActiveSheet.Protect "admin", True, True, True
    
    End Sub
    Donc a priori cela ne vient pas du code en lui-même, du moins pas de la ligne qui est censée être boguée.

    Je précise quand même que lors de l'exécution, temp prend bien la valeur souhaitée, dans le cas présent, "I8:N8", le Range(temp).Select fonctionne donc, en théorie, puisqu'il fonctionne sur d'autres macro ( d'autres classeurs ).


    Merci d'avance à ceux qui plancheront sur mon problème

    Bonne journée !

  2. #2
    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
    Citation Envoyé par Erevan Voir le message
    Bonjour,

    Il se trouve que pour un fichier Excel, j'ai décidé de faire ma petite macro.

    Le principe est assez simple, mais un peu long à expliquer, je vais essayer d'être le plus clair possible :

    Il s'agit d'un tableau à deux entrées, dans la colonne H8, les cellules possèdent une liste déroulante de choix contenant une trentaine de valeur différentes.
    Les colonnes de I8 à N8, contiennent des valeurs qui dépendent de H8.

    Lorsque les colonnes de I à N de la ligne sélectionnée ne doivent pas contenir de valeurs, elles doivent être bloquées, et j'ai rajouté un fond de couleur différent, histoire de rendre le tableau plus lisible.
    Quand on change la valeur de la colonne H8, les colonnes de I à N changent en conséquence, et si H8 devient la valeur par défaut (""), la colonnes de I à N redeviennent à la couleur par défaut ( soit blanc, soit bleu clair selon si la ligne est paire ou impaire ).

    Tout marchait bien au début, puis, comme la colonne C contient une date, j'ai voulu rajouter un calendrier en feuille 2 ( ceci n'a peut être rien à voir avec mon pb, mais c'est la seule chose ayant changée ).

    J'ai donc fait mon calendrier avec la macro correspondante, histoire de griser et bloquer les jours fériés.

    Seulement voilà, maintenant, quand je change la valeur de H8, j'ai un message d'erreur qui me dit : "Erreur 1004, erreur définie par l'application ou par l'objet"
    Si je lance le débug, ça ne m'apprend pas grand chose, hormis que l'erreur est censé venir d'un contrôle ActiveX qui ne peut pas créer d'objet, alors qu'il n'existe pas de contrôle ActiveX dans ma feuille.

    Ne sachant pas d'où vient exactement l'erreur, mon code me semblant bon, je vous le copie :



    Donc a priori cela ne vient pas du code en lui-même, du moins pas de la ligne qui est censée être boguée.

    Je précise quand même que lors de l'exécution, temp prend bien la valeur souhaitée, dans le cas présent, "I8:N8", le Range(temp).Select fonctionne donc, en théorie, puisqu'il fonctionne sur d'autres macro ( d'autres classeurs ).


    Merci d'avance à ceux qui plancheront sur mon problème

    Bonne journée !
    Salut
    Si ta macro fonctionnait, et que tu n'as fait que rajouter un calendrier (?!?), c'est pas ta macro qui est en cause directement, mais ce qui la déclenche.
    Moi, le code de ta macro, je le modifierais, mais chacun sa méthode.
    et la première chose qui me vient à l'esprit et que tu ne bloque pas les évènements. Or, comme tu modifies des cellules (cells(Lig,10)="" etc.., à chaque modif tu relances ta macro :
    tu "testes" target (et en cas d'effacement de 2 cellules, ou de copier/coller de 2 cellules ?)
    tu déprotèges tes cellules
    tu modifies Cells(lig,9)="" (.clearcontents serait plus adapté)
    => donc, tu relances la macro de changement de feuille qui
    --- teste la nouvelle target => faux => va à enfif
    --- reprotège la feuille
    --- finit la macro lancée par le changement et retourne à la macro en cours
    Changes la cellules (lig, "J") => lance la macro
    etc...
    Jusqu'à ton dernier changement après la ligne
    Cells(lig, 14).Value = ""
    Donc, à ce moment précis, juste avant d'exécuter le reste de ta macro, la feuille est protégée (si le code fournit est celui que tu utilises)
    Pour vérifier :
    tu mets en commentaire ta protection :
    ActiveSheet.Protect "admin", True, True, True
    devient
    'ActiveSheet.Protect "admin", True, True, True

    et tu testes
    Si c'est ça, donne ta macro en intégralité, qu'on la nettoie : Proscrire les Select, bloquer les évènement et gérer les erreurs, faire que la modification de 2 cellules ne plante plus ta macro, etc...

    P'tite question : tu utilises les motifs (hachures, etc...), ou seulement la couleur de fond ?
    A+

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Rien à ajouter si ce n'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If not (Target.Row >= 8 And Target.Row <= 38 And Target.Column = 8) Then exit sub
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Cells(Lig,9),Cells(Lig,14)).clearContents
    à la place de
    Cells(lig, 9).Value = ""
    Cells(lig, 10).Value = ""
    Cells(lig, 11).Value = ""
    Cells(lig, 12).Value = ""
    Cells(lig, 13).Value = ""
    Cells(lig, 14).Value = ""

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 3
    Par défaut
    Merci de votre aide

    Pour les .clearcontents, étant un noob du VB ( 3 jours ^^ ), je ne connaissais pas, mais ça a l'air bien pratique effectivement

    Pour ce qui est de la macro, elle est en otalité, manque que les autres cas, mais c'est quasiment du copier coller du cas n°1, seules les valeurs et couleurs changent.
    (J'ai préféré faire 30 if en pensant qu'au niveau de l'execution on avait un gain de temps, par rapport à une boucle, et ça permet une lecture plus simple des différents cas, surtout pour les MaJ des valeurs.)

    Il n'y a rien avant le teste de la "target", et rien après, les autres macro ne se déclenchent qu'en fonction d'évenement particuliers, comme des clics, et non des changements de cellules.

    J'vais faire les modifs et voir si ça change qqchose ou pas


    Edit : J'ai fait les rectifs et ça remarche
    Merci à tous !

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu as une autre solution que tes 30 if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Select case Target.row
         Case 3 To 5, 10 To 15, 18, 22
             'Traitement
         Case 6
             'Traitement
         Case 7
             'etc
         Case else 'toutes les autres lignes
             'traitement
    End select
    Si ça peut simplifier ton code

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 3
    Par défaut
    Effectivement, ça peut simplifier le code, mais je ne suis pas sûr qu'à l'exécution on gagne du temps, mes 30 cas étant proches, mais les valeurs variant tout le temps, on ne peut factoriser que la mise en forme...

    Ceci étant, dans d'autres cas ça doit être assez pratique, donc merci du tuyau ^^

    Toujours est-il que je n'ai pas vraiment compris l'histoire de l'erreur 1004 :S

    C'est censé être une histoire d'ActiveX, celon Microsoft, du moins l'aide, le débugueur, et le support.
    Pourtant plus je regarde les différents posts sur cette erreur, et plus je me dis qu'elle est en fait l'erreur qui sert à dire : "Microsoft n'a aucune idée de la provenance de l'erreur, ça doit venir de ton code gros boulet, mais comme notre débugueur est merdique, mieux vaut éviter d'essayer de l'utiliser, va plutôt demander conseil à qqun qui s'y connait"

    M'enfin bon.....


    Bref, merci à tous, si vous avez des conseils pour le noob du VBA que je suis n'hésitez pas

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Citation Envoyé par Erevan
    mais je ne suis pas sûr qu'à l'exécution on gagne du temps, mes 30 cas étant proches,
    Là-dessus je peux te le dire avec certitude, tu gagnes tu temps... Imagine trente if à examiner à chaque fois... même sur un if... Elseif... Elseif... tu gagnes du temps ET DE LA CLARTÉ (!)
    Ma tou peux faire ça que tou voeux

  8. #8
    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
    Citation Envoyé par Erevan Voir le message
    Effectivement, ça peut simplifier le code, mais je ne suis pas sûr qu'à l'exécution on gagne du temps, mes 30 cas étant proches, mais les valeurs variant tout le temps, on ne peut factoriser que la mise en forme...

    Ceci étant, dans d'autres cas ça doit être assez pratique, donc merci du tuyau ^^

    Toujours est-il que je n'ai pas vraiment compris l'histoire de l'erreur 1004 :S

    C'est censé être une histoire d'ActiveX, celon Microsoft, du moins l'aide, le débugueur, et le support.
    Pourtant plus je regarde les différents posts sur cette erreur, et plus je me dis qu'elle est en fait l'erreur qui sert à dire : "Microsoft n'a aucune idée de la provenance de l'erreur, ça doit venir de ton code gros boulet, mais comme notre débugueur est merdique, mieux vaut éviter d'essayer de l'utiliser, va plutôt demander conseil à qqun qui s'y connait"

    M'enfin bon.....


    Bref, merci à tous, si vous avez des conseils pour le noob du VBA que je suis n'hésitez pas
    Salut
    Le problème des codes d'erreurs, c'est qu'il y en a trop, et pour se simplifier la vie, ce sont des descriptions vagues, qui s'appliquent à tous les cas "pas trop éloignés".
    Le problème d'une macro longue ne se pose, en général, que quand tu une modif urgente à faire et que "de l'eau est passée sous les ponts". Tant que tu as ton code en tête, pas de problème, mais dans 6 mois ou 1 an, tu auras évolués, tes besoins aussi, sans doute, et te remettre sur 200 ou 300 lignes de code est plus dur que de retrouver le fonctionnement d'une boucle de 50 lignes.
    Si la rapidité est suffisante actuellement, une boucle ne la ralentira pas, puisque tu derais un seul test (target ne bougeant pas pendant l'évolution de la macro).

    Par contre, on pourra peut-être la faire évoluer différemment de ce que tu penses faire, puisque tu auras différentes formes de traitement, et différents points de vue.
    C'est pour ça que je traîne sur les forums : chacun y va de sa petite astuce, et en final, tu apprends à utiliser un tas d'instructions dont tu n'avais même pas soupsçonné l'existence.

    La question pour tout le code est aussi pour le limiter aux instrctions utiles.
    Ton code est issue d'une macro "apprentissage" (nouvelle macro).
    Pour comprendre :
    Code issue d'une mise en coukeur rouge du fond en macro apprentissage
    Barre d'outils ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Range("A2").Select
        With Selection.Interior
            .ColorIndex = 3
            .Pattern = xlSolid
        End With
    du menu contextuel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Range("A2").Select
        With Selection.Interior
            .ColorIndex = 3
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
        End With
    Le même code en plus efficace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A2").Interior.ColorIndex = 3
    résultat : A2 à un fond est rouge

    A+

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/11/2013, 22h21
  2. Réponses: 3
    Dernier message: 04/03/2011, 09h30
  3. [Excel] Erreur 1004 avec un search
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/12/2005, 13h54
  4. 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