Liste déroulante désactivées par les macros
Bonjour,
je fait un excel pour aider à la configuration de nos produits, mon classeur excel s'organise comme çà :
- un première feuille avec des données brutes, toutes les différentes options, les numéros de série, les désignations. j'ai défini des listes à l'intérieur de ces colonnes pour les données qui se regroupent.
- une feuille de configuration ou l'utilisateur peut paramétrer le produit simplement, en cochant des options et avec des listes déroulantes de choix (les listes déroulantes utilisent les listes définies à la feuille 1)
- un dernière feuille qui fait la synthèse de la feuille de config en ne récupérant que les option choisies (élimination des blancs)
j'ai commencé par faire ces 3 feuilles en excel "simple" (sans VBA), et ça marchait bien.
Puis j'ai voulu ajouter une macro pour générer la feuille 3 automatiquement : prendre les infos de la feuille 2 et éliminer les cellules vides en copiant les infos vers la feuille 3. (j'ai fait comme expliqué dans ce post : https://forum.excel-pratique.com/excel/copier-supprimer-des-donners-d-une-feuille-a-une-autre-t33783.html?hilit=liste%20sans%20cellule%20vide pour la macro.)
mon problème est que quand j'ai activé les macros, mes listes déroulantes de la feuille 2 de configuration ne marchent plus. quand je vais voir dans l'outils de validation de données et que je rentre la référence de ma liste de choix, j'ai le message d'erreur :
/!\ Vous ne pouvez pas faire référence à d'autres feuilles ou classeurs pour les critères Validation des données J'avais fait une sauvegarde de mon fichier avant d'ajouter la macro et là, aucun problème, avec les mêmes données, les mêmes listes, tout pareil... la seule différence entre les deux fichier est la macro (qui pourtant ne récupère pas les infos directement dans la cellule de la liste de choix)
est-ce que ce problème vous dit quelque chose ? savez-vous comment le résoudre ou le contourner ?
merci beaucoup et bonne journée.
Ant1
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
*** edit *** :
j'ai résolu ce problème (de manière un peu barbare, tant pis pour la compréhension) : je suis reparti de mon fichier original (sans macro) j'y ai ajouté la macro et mes listes sont toujours OK... Je ferme les yeux et croise les doigts en espérant que ca dure.
maintenant, j'ai un autre souci, avec la macro (c'est celle prise dans le post cité plus haut)
Sub Transfert()
Sheets("récapitulatif commande").Select
'Range("A2:A200").ClearContents
Sheets("config").Activate
Dim MaCellule As Object
For Each MaCellule In Range("code_config")
If MaCellule.Value <> "" And IsEmpty(MaCellule) = False Then
MaCellule.Copy
Sheets("récapitulatif commande").Activate
ActiveSheet.Range("A1").End(xlDown).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End If
Next MaCellule
End SubQuand j'exécute ma macro, elle plante toujours à la ligne :
Range("A1").End(xlDown).Offset(1, 0).Selectj'ai essayé de trouver d'où ca vient, j'ai essayé de faire :
Range("A1").Selectca marche, j'écris toujours au meme endroit et d'écrase au fur et à mesure, mais ca déroule toutes mes cellules et je retrouve le code de ma derniere ligne dans la cellule.
puis j'ai essayé :
Range("A1").End(xlDown).Selecten mettant du texte ou des chiffre en dessous de A1, histoire de voir si le déroulement jusqu'en bas de la colonne fonctionne. là encore pas de pb si ce n'est que j'écrase tout dans la derniere cellule de ma colonne et que je ne garde que mon dernier code.
de meme avec :
Range("A1").Offset(1, 0).Selectca marche mais j'écris tout dans la cellule A2.
alors je me suis dit essayons avec tous les éléments :
Range("A1").End(xlDown).Offset(1, 0).Selectet surprise : ca marche ! (presque)
c'est parce que j'avais laissé les cases remplies avec des chiffres quelconques pour mon test précédents. Si A2 n'est pas vide, je peux faire ma macro qui écrit dans les lignes en dessous. si A2 est vide ca plante.
mon problème c'est que quand je relance ma macro, je veux n'avoir que les données de la dernière exécution et effacer les autres (c'est pour ca que j'ai ajouté la ligne
Range("A2:A200").ClearContentscommentée pour mes tests).
est ce que vous voyez pourquoi ca plante quand la première ligne est vide ?
merci et bonne journée.
Ant1
Bonjour
Ant1 a écrit :est ce que vous voyez pourquoi ca plante quand la première ligne est vide ?
L'instruction
Range("A1").End(xlDown).SelectPart de la cellule A1 et ne s'arrêtera soit quelle trouve une cellule vide précédée d'une cellule non vide, soit à la fin de la colonne
Dans ton cas si A1 est vide elle s'arrêtera à la fin de la colonne et la copie après la fin de la colonne ne passera jamais
2 cas particuliers dans ce cas qu'il faudrait traiter
- Si A1 est vide on obtient le dernier numéro de ligne
- Si A1 n'est pas vide mais A2 est vide on obtient le dernier numéro de ligne
Moi, sauf cas particuliers, j'utilise le contraire si je veux copier après la dernière ligne d'une colonne comportant des trous
Je teste si la cellule (supposée être la première cellule vide de la colonne) est vide, et en fonction du résultat la copie se fera à partir de cette ligne soit à la fin obtenue en partant de la fin de la colonne et en remontant pour trouver la une cellule non vide
Le code pourrait être (en reprenant ton code)
If Range("A1") = "" Then
Range("A1").Select
Else
Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select
End If
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=FalseMais sans connaitre ton fichier ce n'est pas évident de te conseiller de la meilleure manière
Bonjour Banzai64,
et merci pour ton code, ca marche impec !
Mais sans connaitre ton fichier ce n'est pas évident de te conseiller de la meilleure manière
je sais mais c'est pour le boulot, et confidentiel, c'est pour ça que j'ai fait un post de 3kms pour essayer de décrire la situation au mieux sans donner le fichier direct...
en tt cas, ca suffisait pour que tu trouves la solution !!
Bonne journée.
Ant1