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.
- 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 SubToutefois, 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
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 BooleanPour 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
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)).ClearContentsPour 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