Erreur d'exécution 1004

Bonjour à tous,

Je rencontre un problème avec une macro.

J'ai créé un bouton (en utilisant Forme sur Excel et non pas contrôles de formulaires) auquel je souhaite affecter une macro.

Je souhaite que lorsqu'un utilisateur clique sur le bouton Tableau de bord, cela l'envoi sur la feuille tableau de bord

J'ai donc crée une macro avec l'enregistreur puis je l'ai affecté à ce bouton. Lorsque je clique la première fois sur le bouton, cela fonctionne. Lorsque je clique sur Retour Accueil (bouton inclut dans le Tableau de bord), je reviens bel et bien sur l'Accueil. Toutefois, lorsque j'essaye de cliquer à nouveau sur le bouton Tableau de bord, le message d'erreur suivant apparaît :

"Erreur d'exécution 1004 : La méthode Select de la classe Worksheet a échoué".

Quand je clique sur débogage, Sheets ("Tdb").Select est surligné en jaune

Je n'arrive pas à trouver la solution. Pourtant j'ai créé d'autres boutons de la même façon et ils fonctionnent...

Quelqu'un a t'il une réponse à m'apporter par rapport à ce message d'erreur ?

En vous remerciant d'avance

Sysqua

Bonjour,

Tu mets ton fichier et on corrigera l'erreur !

De toutes façons, une macro enregistrée a besoin d'être entièrement réécrite pour être pleinement fonctionnelle... Cela pourra apporter un plus !

Bonjour MFerrand,

Ci-joint le fichier en question.

Merci pour ton aide

Je me souviens avoir déjà vu ce classeur, ou un proche parent, et ne pas avoir voulu y plonger car trop brouillon...

Ça n'a pas changé ! Le ménage ça se fait aussi dans les fichiers Excel ! Je viens réduire le nombre de modules à 3 en seulement supprimant les vides. Il en reste encore 2 à supprimer. En épurant le code ce qui reste devrait tenir dans un mouchoir de poche...

Ceci dit tes feuilles étant masquées, il faut les démasquer avant de les activer...

Particulièrement celle-ci (Tdb), masquée avec le paramètre xlSheetVeryHidden, qui signifie qu'elle n'est pas visible parmi les feuilles masquées et qu'on ne peut la démasquer manuellement (seulement en exécutant un code).

C'est d'ailleurs mystérieux, car ne pouvant être masquée ainsi manuellement, il a fallu exécuter un code pour la masquer... et rien de tel dans le code du classeur !

T'aurait-on fait une farce ?

En attendant, tu as la source de ton erreur 1004 et tu peux mettre ...Visible = True pour la faire apparaître.

Pour remettre le tout en forme, je verrais ça selon mes loisirs du soir !!!

En effet, j'avais déjà posté ce fichier puisque ça fait plusieurs semaines que je bloque dessus.

Si c'est brouillon, c'est probablement parce que c'est la première fois que je travaille sur des macros et que du coup je fais beaucoup de tests et que je ne savais pas forcément comment "faire le ménage sur le fichier". C'est maintenant chose faite

Merci pour ta réponse mais je ne vois pas où inscrire Visible = True ni ou il est marqué qu'elle est masquée

Justement, c'est marqué nulle part ! D'où mon post précédent.

Comme je ne la voyais nulle part, j'ai pensé que tu n'aurais normalement pas fourni un classeur sans la feuille à activer concernée par le problème, alors j'ai un peu cherché...

Le code, c'est dans ta macro d'activation, il rendre la feuille visible avant de l'activer.

Désormais mon bouton fonctionne mais l'onglet Tdb ne disparait pas lorsque clique sur retour accueil...

Problème résolu (je ne sais trop comment mais ça fonctionne!)

Bonsoir,

Nettoyage fait sur Module standard : il en reste un, de taille réduite, et module classeur.

Ça me suffira pour un bon moment, ce genre d'activité !

Points à noter :

  • Tes boutons (formes dessinées) sont renommés, et lancent tous la même macro, laquelle se débrouille pour savoir qui a lancé et faire le nécessaire !
  • J'ai basculé la procédure classeur BeforeClose (qui masque les feuilles) sur BeforeSave, plus indiqué (car le classeur s'ouvre comme il a été enregistré...). Le seul élément restant sur BeforeClose était la commande Me.Save, je l'ai laissée mais désactivée.
En effet, pouvoir fermer sans enregistrer est une sécurité, lorsqu'on a eu un problème qu'on ne parvient pas à surmonter avant enregistrement. On peut ainsi retrouver un classeur fonctionnel. Et si l'on l'on n'a pas enregistré à la fermeture, Excel ne manque pas de le rappeler... A toi de voir.

- Outre l'indentation (mais ça c'est habituel) j'ai rétabli l'ordre logique dans un module, qui consiste à placer les procédures Function avant les Sub (cela fait partie des règles habituelles...)

- Inutile de chercher le pourquoi 2 procédures ont un argument optionnel de type booléen. C'est juste un truc qui empêche ces macros de s'afficher dans la boîte de dialogue macro, et donc de pouvoir être lancée autrement que par les boutons (ce qui provoquerait une erreur).

Cordialement.

Bonjour,

Vraiment un grand merci MFerrand pour ton travail et merci d'avoir pris le temps de m'expliquer ce que tu as fait sur le fichier, même si je dois avouer que je ne comprends pas forcément tout.

J'ai regardé le code dans VBA et j'avoue que je suis un peu perdue... J'aimerai retirer le mot de passe demandé lorsque je clique sur "Suggérer une amélioration", peux-tu me dire comment procéder ?

De même, pour finaliser mon fichier, je souhaitais ajouter une macro pour que le bouton "Valider la saisie" dans la feuille "Saisie proposition d'amélioration" soit fonctionnel et que les données saisies soient transférées automatiquement vers la feuille "Tableau suivi suggestions". J'avais également ajouté un code pour qu'un message d'erreur apparaisse si l'utilisateur souhaitait valider la saisie sans avoir rempli tous les champs en bleu.

Pour cela, j'étais repartie d'une macro similaire en l'adaptant (à mon niveau....) :

‘V0.5

'vérification de la saisie

Private Function SaisieOK(poSh As Worksheet) As Boolean

    SaisieOK = False

    If poSh.Range("D13").Value = "" Then

        MsgBox "Veuillez renseigner votre prénom !", vbExclamation

        poSh.Range("D13").Select

        Exit Function

    End If

        If poSh.Range("D15").Value = "" Then

        MsgBox "Veuillez renseigner votre NOM !", vbExclamation

        poSh.Range("D15").Select

        Exit Function

    End If

    If poSh.Range("D17").Value = "" Then

        MsgBox "Veuillez renseigner votre fonction !", vbExclamation

        poSh.Range("D17").Select

        Exit Function

    End If

    If poSh.Range("D19").Value = "" Then

        MsgBox "Veuillez renseigner la date !", vbExclamation

        poSh.Range("D19").Select

        Exit Function

    End If

    If poSh.Range("D21").Value = "" Then

        MsgBox "Veuillez renseigner le type d’amélioration !", vbExclamation

        poSh.Range("D21").Select

        Exit Function

    End If

    If poSh.Range("D23").Value = "" Then

        MsgBox "Veuillez renseigner le sujet !", vbExclamation

        poSh.Range("D23").Select

        Exit Function

    End If

    If poSh.Range("D25").Value = "" Then

        MsgBox "Veuillez renseigner la raison de la suggestion !", vbExclamation

        poSh.Range("D25").Select

        Exit Function

    End If

    If poSh.Range("D31").Value = "" Then

        MsgBox "Veuillez renseigner la description !", vbExclamation

        poSh.Range("D31").Select

        Exit Function

    End If

    If poSh.Range("D39").Value = "" Then

        MsgBox "Veuillez renseigner les effets attendus !", vbExclamation

        poSh.Range("D39").Select

        Exit Function

    End If

    SaisieOK = True

End Function

'V0.5-fin

Public Sub Valider()

    Dim oShSaisieProposition As Worksheet

    Dim oShSuiviProposition As Worksheet

    Dim iEcr As Integer

    Set oShSaisieProposition = Worksheets("Saisie proposition amélioration")

    Set oShSuiviProposition = Worksheets("Tableau suivi suggestions")

    'V0.5

    'vérification de la saisie

    If Not SaisieOK(oShSaisieProposition) Then

        Exit Sub

    End If

    'V0.5-fin

    'première ligne vide (colonne C)

    'iEcr = oShSuiviProposition.Range("B" & Rows.Count).End(xlUp).Row + 1

    For iEcr = 9 To 60

        If oShSuiviProposition.Range("C" & iEcr).Value = "" Then

            Exit For

        End If

    Next iEcr

    'N¡

    'oShSuiviProposition.Range("B" & iEcr).Value = oShSaisieProposition.Range("").Value

    'Prénom

    oShSuiviProposition.Range("C" & iEcr).Value = oShSaisieProposition.Range("D13").Value

    'NOM

    'oShSuiviProposition.Range("D" & iEcr).Value = oShSaisieProposition.Range("D15").Value

    'Fonction

    oShSuiviProposition.Range("E" & iEcr).Value = oShSaisieProposition.Range("D17").Value

    'Date

    oShSuiviProposition.Range("F" & iEcr).Value = oShSaisieProposition.Range("D19").Value

    'Type

    oShSuiviProposition.Range("G" & iEcr).Value = oShSaisieProposition.Range("D21").Value

    'Sujet

    oShSuiviProposition.Range("H" & iEcr).Value = oShSaisieProposition.Range("D23").Value

    'Raison de la suggestion

    oShSuiviProposition.Range("I" & iEcr).Value = oShSaisieProposition.Range("D25").Value

    'Description de la proposition

    oShSuiviProposition.Range("J" & iEcr).Value = oShSaisieProposition.Range("D31").Value

    'Effets attendus 

    oShSuiviProposition.Range("K" & iEcr).Value = oShSaisieProposition.Range("D39").Value

    'Responsable(s)

    oShSuiviProposition.Range("L" & iEcr).Value = oShSaisieProposition.Range("").Value

    'Retenue ?

    'oShSuiviProposition.Range("M" & iEcr).Value = oShSaisieProposition.Range("").Value

    'Justification

    oShSuiviProposition.Range("N" & iEcr).Value = oShSaisieProposition.Range("").Value

    'Date de validation 

    'oShSuiviProposition.Range("O" & iEcr).Value = oShSaisieProposition.Range("").Value

    'Réf. Action

    'oShSuiviProposition.Range("P" & iEcr).Value = oShSaisieProposition.Range("").Value

    'Etat

    'oShSuiviProposition.Range("Q" & iEcr).Value = oShSaisieProposition.Range("").Value

    'efface

    If MsgBox("Enregistrement terminé !" & vbCrLf & "Merci de cliquer sur Oui", vbYesNo + vbExclamation) = vbYes Then

        'V0.4

'        For iEcr = 4 To 12

'            oShSaisieProposition.Range("C" & iEcr).ClearContents

'        Next iEcr

        oShSaisieProposition.Range("D13,D15,D17,D19,D21,D23,D25, D31, D39").Value = ""

    End If

    Set oShSaisieProposition = Nothing

    Set oShSuiviProposition = Nothing

End Sub

Toutefois, avec la nouvelle organisation que tu me proposes, je ne sais pas trop comment m'y prendre. Où dois-je ajouter ceci ?

Merci d'avance pour ton aide

Belle journée

Sysqua

Bonjour,

C'est vrai que tu m'as fait un peut calculer avec ton mot de passe, un coup oui un coup non...

J'avais divisé les boutons de déplacement en 3 groupes, ceux qui ramènent à Accueil appelés "Vers0" (sauf celui du Guide : "Retour0", car la proc. n'est pas entièrement la même dans son cas) ; appelés les boutons pointant vers d'autres feuilles : "Vers1" à "Vers4" lorsque qu'aucun mot de passe n'est demandé à l'utilisateur, et "Vers5" à "Vers7" si mot de passe demandé.

Précise-moi la liste définitive des feuilles donnant lieu à demande de mot de passe, cela permettra de vérifier et ajuster le tout.

Comme tu l'as vu, on fait un catalogue 0 à 7 des noms de feuilles cibles, la macro récupère le numéro d'ordre qui termine le nom du bouton appelant, qui lui indique quelle feuille est visée. Donc pour ajuster, il suffit de redéfinir le catalogue 1 à 7 en regroupant les sans MP ou avec dans la liste de façon à demander le MP si avec.

J'ai vu qu'il te manquait une macro de validation... je n'ai pas eu le temps de regarder de plus près mais il m'a semblé que la trame à mettre en place était assez semblable à la validation déjà existante. Peut-être que la même procédure peut être utilisée pour les deux : les feuilles source et cible lui étant alors passées en arguments... Même chose pour la fonction (on lui passe déjà la feuille à vérifier en argument).

NB- Sais-tu qu'en sautant des lignes comme tu le fais, tu me doubles le temps nécessaire pour la lecture, et encore, si je n'ai pas à revenir en arrière pour une vérification...

En plus, j'ai réécrit cette fonction pour la raccoucir !

Tout d'abord, merci pour les explications.

Les deux feuilles donnant lieu à demande d'un mot de passe sont : "Saisie proposition d'amélioration" (càd bouton "Proposer une amélioration") et "Tableau suivi suggestions" (càd bouton "Suivre les suggestions d'amélioration"). Les autres sont accessibles librement.

Effectivement, la macro de validation manquante est similaire à celle déjà existante. Pourtant, quand j'avais essayé de la faire et de l'affecter à mon bouton Valider la saisie, cela ne fonctionnait pas.

Toutes mes excuses pour les espaces et merci pour ton aide.

Il semble qu'on ait de la chance, si je me souviens bien ! La coupure des deux groupes était entre 4 et 5, et je crois bien que c'est le 5 qu'il faut basculer d'un groupe à l'autre ! Donc rien à toucher dans les noms, ni dans la liste, juste 2 chiffres à modifier dans les Case traités...

Je vois ça demain, avec ta validation... J'ai réussi à mettre le nez dehors juste au moment où éclatait un violent orage... mais je suis séché depuis !

Effectivement la coupure se fait entre le 4 et le 5 (si j'ai bien lu le code !)

Pas de souci, je viendrai faire un tour sur le forum demain dans la journée

Merci beaucoup pour ton aide et bonne soirée à toi

Bonsoir,

Voilà modifié... mais je n'ai rien testé, donc à tester...!

Cordialement.

Bonsoir,

Merci pour ton travail et ton temps ! Je viens de tester mais malheureusement ça ne fonctionne pas. Plusieurs soucis :

1. On ne demande un mot de passe pour "proposer une amélioration" (alors qu'il n'en faut pas) et pour "Suivre les suggestions d'amélioration (ça c'est ok), mais on ne me demande plus le mdp pour "Traiter une non-conformité (alors qu'un mdp est requis).

2. Lorsque je clique sur "Valider la saisie" que ce soit sur la feuille "Saisie NC" ou "Saisie proposition amélioration", un message d'erreur apparaît "Erreur de compilation : Argument non facultatif" et "SaisieOK" est surligné

As-tu une idée de l'erreur ?

Merci d'avance

Sysqua

OK pour le 2), c'est de ma faute.

Modifier la déclaration de fonction ainsi :

Function SaisieOK(wsS As Worksheet, Optional sug As Boolean = False) As Boolean

Pour le 1) j'en suis surpris ! je pensais qu'on avait fait le point...

Dresse-moi la liste exhaustive des intitulés de boutons, la feuille que chacun doit ouvrir et si MDP ou non.

Et je reprends le tout à partir de ta liste !

Cordialement.

J'ai modifié avec le code que tu m'as donné. Excel me dit que cette modif va réinitialiser le projet. J'ai dit OK. Et après en voulant appuyer sur "Valider la saisie", le message suivant apparaît : Erreur de compilation : tableau attendu ...

Concernant les feuilles et mdp (désolée si l'on s'est mal compris) :

Le bouton "Déclarer une non-conformité" doit ouvrir la feuille "Saisie NC" sans mdp

Bouton "Traiter une non-conformité" doit ouvrir la feuille "Tableau de suivi des NC" avec un mdp (sysqua)

Bouton "Identifier un risque / une opportunité" doit ouvrir la feuille "Risques et opportunités" sans mdp

Bouton "Déclencher une action" doit ouvrir la feuille "Plan d'actions" sans mdp

Bouton "Proposer une amélioration" doit ouvrir la feuille "Saisie proposition amélioration" sans mdp

Bouton "Suivre les suggestions d'amélioration" doit ouvrir la feuille "Tableau suivi suggestions avec mdp (sysqua)

Bouton "Tableau de bord" doit ouvrir la feuille "Tdb" sans mdp

Merci

Ouille !

Sub Valider(Optional sug As Boolean = False)
    Dim wsS As Worksheet, wsC As Worksheet, iEcr%, i%, rS, kC
       [...]
    If SaisieOK(wsS, sug) Then
        [...]

Enlève les % après rS et kC dans les déclarations (c'est vrai que c'était un peu confus pour s'y retrouver, mais là je ne sais pas à quoi je pensais... )

Autre correction à faire sur cette autre ligne (sinon c'est la validation des NC saisies qui ne fonctionnera plus !)

Cela te familiarise avec le débogage...

(Pour préciser, l'erreur de compilation sur attente tableau vient du fait que rS et kC sont des variables Variant accueillant des tableaux affectés au moyen de fonctions Array ou Split ; les déclarer en Integer fait que les tableaux ne peuvent y être affectés, d'où l'erreur de compilation. Le problème niveau débogage, c'est que ce type d'erreur surligne en jaune la déclaration de procédure (la première ligne) et un endroit quelconque en bleu, censé localiser (plus ou moins) l'erreur ; là était surligné en bleu un UBound dans l'initialisation de la boucle : For i = 0 To UBound(kC) ce qui me fait remonter à la définition de kC [ kC = ...], constater que cette ligne affecte bien un tableau... et attendre l'inspiration , alors que si la ligne kC = ... avait été surlignée, cela m'aurait fait remonter tout de suite au maillon précédent, la déclaration... là il a fallu attendre que je lève les yeux pour réfléchir, que ce que je vois arrive jusqu'au cerveau, et que ce dernier réagisse... mais on y arrive !)

Cordialement.

A plus tard (pour la mise au point des déplacements et/ou la prochaine erreur !)

J'ai intégré tes corrections, ça fonctionne ! Super ! Merci beaucoup !

Suite à tes explications, je me dis que je ne suis pas prête d'être calée en macro

J'ai testé les deux formulaires à remplir (Saisie NC et Saisie proposition amélioration), après avoir cliqué sur "Valider la saisie", j'ai bien le message "Enregistrement terminé ! Merci de cliquer sur oui !" qui est apparu. Quand j'ai cliqué sur OK, j'ai un message d'erreur qui est apparu : 'Erreur d'exécution 1004 : Impossible de modifier une cellule fusionnée et la ligne suivante était surlignée

.Range("D" & rS(i)).ClearContents

Pour régler le problème, j'ai annulé la fusion des cellules (même si je dois avouer que c'est moins pratique pour les utilisateurs, au moins ça fonctionne!)

Concernant les mdp, je visualise l'erreur puisque c'est marqué Case 6 to 7 avec mdp ce qui correspond aux feuilles "Saisie proposition amélioration" et "Tableau suivi suggestions". J'ai voulu tenté de modifier en inversant l'appellation des feuilles 5 et 6 (puisque c'est Tableau de suivi des NC qui doit être protégé par mdp) mais du coup ça n'ouvre plus les bonnes feuilles (en même temps c'était bien tenté mais trop simple pour fonctionner )

Rechercher des sujets similaires à "erreur execution 1004"