Liste déroulante avec VBA
Bonjour!
Je suis actuellement en stage et coincé par quelques formalités (si je peux dire)
J'ai reussi a faire une liste déroulante parfaitement opérationnelle (en position X9) dans laquelle on peu choisir (avec la pitite flèche sur la droite de la cellule liste) la valeur qui nous intéresse. Dans mon cas, ce sont les valeurs 1.1 1.2 1.3 et 1.4 .
Je n'arrive pas à obliger ma liste à adopter les différentes valeurs avec VBA...
Pour une cellule banale, j'aurais écrit Range("X9").Value = 1.1 (ce que jai fait meme s'il s'agit d'une liste XD) mais il écrit ensuite dans ma feuille en X9 : 1,1 (au lieu de 1.1) etc. et les autres cellules de ma feuille (qui y sont liées) m'affichent ducoup #N/A
Est-ce que je me trompe de formule ou est ce que je dois,dans la colonne (à laquelle est référée ma liste) remplacer tous les nombres de la forme x.y par des nombres de la forme x,y?
Merci à vous de vous pencher sur ce sujet, moi je me suis déjà arraché la moitié des cheveux sur ce problème... :-s
Bonjour
Essaye :
Range("X9").Value = "1.1"
Amicalement
Nad
Salut Nad,
J'avais répondu à Sym sur le post "Imprimer via Macros".
Le Range("X9").Value = "1.1" ne marche pas sur un excel français apparemment.
Par contre le code suivant marche :
Range("X9").FormulaLocal = "1.1"
Bonjour vbanew
Chez moi, ça renvoie le même résultat (du numérique)
Amicalement
Nad
Le code que j'ai donné marche chez moi, ça affiche bien 1.1, je sais pas pourquoi.
Sinon, mettre peut-être la cellule au format texte avant d'inscrire la valeur ? :
Range("X9").NumberFormat = "@"
Range("X9").Value = "1.1"
Salut à tous!
Merci beaucoup pour tous ces conseils! J'ai hâte de finir ce week end pluvieux (enfin... façon de parler
Range("X9")= 1.1
Range("X9")="1.1"
et un troisième (j'avais déjà précisé tout çà dans "imprimer via macro")
Je vous dis à mardi pour de nouvelle aventures! Ou juste pour de nouveaux résultats
Amicalement content, Sym.
J'ai essayé la formule
Range("X9").FormulaLocal = "1.1"
et çà marche niquel! Encore merci à tous! Vous m'avez permis d'avancer mon casse-tête d'une étape
-- 15 Juin 2011, 08:24 --
Bonjour!
Comme je disais, j'en suis a l'étape suivante de mon problème...
Dans la liste de "référence" de la liste déroulante, les utilisateurs auront le choix de supprimer telle ou telle ligne de cellule (tranchant alors la liste dite de référence et la liste déroulante de quelques étapes (par exemple, pour la première, elle ne comportera après coup que 1.1 et 1.3) 1.2 et 1.4 ne nous intéressant pu, il ne sera pas nécessaire d'ecrire range(X9).formulaLocal = "1.2" ou = "1.4" seulement, vous devinez que je n'ai pas du tout envie de changer mon code a chaque fois
Cependant, j'ai remarqué qu'en retranchant une ligne dans la liste dite de référence, la valeur correspondante dans la liste déroulante s'enlevait toute seule (ouff!!!
Existe il donc une ligne de code qui me permettrait de balayer les valeurs de la liste déroulante (et de pouvoir faire des actions / rajouter des lignes de codes, a chaque fois qu'il adopte une nouvelle valeur)?
Encore merci de toute votre aide
Amicalement sym
En regardant l'aide d'excel, j'ai pensé à quelques lignes de codes
Seuls problèmes étants qu'il me manque la formule magique (si elle existe) permettant de connaitre le nombre d'éléments d'une liste déroule. :
1 Sub Imprimer(nbEltsListe)
2 Sheets("THÈME 1)"
3 for counter = 1 To nbEltsListe
4 Range("X9").FormulaLocal = "1."counter " fiche1"
5 ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)"
6 Next counter
7 End Sub
Mon second problème réside à la ligne 4, pensez vous que la formule est correcte pour afficher "1.x fiche1"?
Une fois de plus, je serais très heureux d'avoir des réponses a ces problèmes
Sym
-- 15 Juin 2011, 15:53 --
Por connaitre ma "formule magique", j'ai pensé à quelques lignes de codes...
Tout d'abbord je tiens a préciser que la liste à laquelle fais ref. ma liste déroulante se situe dans une feuille "base" et qui est en fait un morceau de colonne de tableau, morceau que j'ai nomé Theme1... Voici le code:
1. Sub Afficher()
2. Sheets("Base").Select
3. nbElts = Theme1.Rows.Count
4. Style = vbYesNo
5. Réponse = MsgBox(nbElts, Style)
6. If réponse = vbYes Then
7. MyString = "oui"
8. Else
9. MyString = "Non"
10. End if
11. End sub
Et là, il me trouve une erreur à la deuxième ligne...
Savez-vous comment procéder?
Merci d'avance, sym
Bonjour sym,
Essaie avec ce code :
Sub Afficher()
nbElts = ThisWorkbook.Names.Item("Theme1").RefersToRange.Count
Style = vbYesNo
réponse = MsgBox(nbElts, Style)
If réponse = vbYes Then
MyString = "oui"
Else
MyString = "Non"
End If
End Sub
Bonjour!
Merci beaucoup pour votre aide mais, a vrai dire, j'avais essayé ce matin en remplaçant la ligne 2 par:
Range("Theme1").Select
NbElts = Sélection.Row.Count
Et ca marchait... Quelles différences avec votre code?
J'aurais ensuite une autre question...
J'avais fais une autre macros nommée "Balayer"
Qui me permettrait d'afficher les différentes valeur (1.1 à 1.nbElts)
Que j'avais introduit comme tel:
Sub Balayer(nbElts)
End Sub
Mais impossible de lire la maccro, comme si elle n'existait pas;
J'ai donc "fusionné" les deux maccros suite à quoi ca marchait,
Ma question est la suivante : pk il ne la considère pas comme une maccro et quel est l'intérêt de mettre un argument entre () comme je l'ai fait?
Je pensais le mettre car il en avait besoin et qu'il était établi à la macro "afficher" ci dessus.
-- 16 Juin 2011, 15:59 --
Rebonjour à tous!
J'ai fait le code suivant pour pouvoir afficher chacune des valeurs de ma liste (en travaillant sur la liste de "ref" nommée "Thème1" dans la feuille "Base")
Sub Balayer()
Sheets("Base").Select
Range("Thème1").Select
nbElts1 = Sélection.Rows.Count
For counter1 = 1 To nbElts1
Vale = "1." & counter1
Rep = MsgBox(Vale)
... (paragraphe pr imprimer, inintéressant ici)
Next counter1
Seulement, l'utilisateur doit pouvoir supprimer des lignes de Thème1
Ces lignes de code n'affichent suite à quoi les premières valeurs de la liste mais pas forcément les bonnes
(petit exemple: imaginez la liste 1.1 1.2 1.3 et 1.4
Après suppression de 1.2 et 1.3, le code affichera 1.1 et 1.2
Au lieu de 1.1 et 1.4...
J'avais donc imaginé:
For counter1 = 1 To nbElts1
Num = 19 + counter1 'tableau commence ligne19
Vale = Range(Inum).FormulaLocal 'tableau sur colonne I
Rep = MsgBox (Vale)
Mais vous comprendrez avant même d'avoir essayé que ça ne marche pas...
Existe-il une solution à ce problème?
Deplus, pour la suite, je ne pourrais pas savoir à quelle ligne commence le tableau, tout dépendra du nombre de lignes supprimées..
Salut sym,
Ton code est plus simple. Tu peux même l'optimiser en faisant : NbElts = Range("Theme1").CountSym a écrit :Range("Theme1").Select
NbElts = Sélection.Row.Count
Et ca marchait... Quelles différences avec votre code?
Il faudrait que tu joignes un bout de fichier si possible car là je commence à rien comprendre. Pourquoi parles-tu de supprimer des lignes ?
Bonsoir! J'avoue que je pars un peu dans toutes les directions et qu'il doit pas être facile de me suivre
voilà mon fichier excel dans les grandes lignes (celles qui sont utiles
Téléchargez le, ouvrez le et laissez moi essayer de vous guider:
Feuilles
Vous avez une feuille base et des feuilles THEME. Dans chacune des feuilles Thème, il y a une liste déroulante en position X9. Cette liste déroulante est issue de la Méga-Liste du tableau de base (fragmentée en petites parties chacune appelées "Thème") (Thème1 pour THEME 1)
Telle ou telle valeur de la liste change l'entête de la feuille et selon les besoins toutes les feuilles de chaque feuille THEME devra être imprimée. (J'espère que je ne vous emmêle pas les pinceaux avec les feuilles et les feuilles)
Macros
*La première macro est SupprimerLigne ; dans la feuille base, il faut selectionner une ligne du tableau (le grand tableau) et appuyer sur le petit bouton rouge à côté de supprimer. En effet, le personnel utilisant ce logiciel ne devra pas remplir (donc imprimer) toutes les feuilles, il aura par exemple besoin des feuilles 1.1, 1.4, 2.5, 2.8 et 2.9 ...
*La deuxième macro, Imprimer() qui a décidé de me poser problèmes à tous les niveaux, sert à imprimer toutes ces feuilles; elle a cependant besoin (début de la macro) de balayer chacune des valeurs (qui n'ont pas été supprimées) des listes. Tout marche très bien si la première macro n'est pas utilisée, seulement, dès qu'elle a servit elle décale tout. (Comme je disais tout à l'heure, supprimer les lignes de 1.1 et 1.2 fera afficher à Imprimer() les valeurs 1.1 et 1.2 au lieu de 1.3 et 1.4
En espérant avoir été assez clair...
Sym
-- 16 Juin 2011, 23:14 --
Pourquoi j'ai l'impression de ne pas avoir envoyé le fichier?
Vous l'avez?
Il était trop gros le saligo !!
Bonjour! J'ai reussi à compiler ce que je voulais mais il me reste un petit soucis...
Voyons d'abbord ce que j'ai fais :
Sub Imprimer2()
Sheets("Base").Select
Range("Thème1").Select
NbElts1 = Sélection.Rows.Count
For counter1 = 1 To nbElts1
Sheets("Base").Select
Num = 18 + counter1
Vale1 = ActiveSheet.Cells(num, 9).Formula
Sheets("THEME 1").Select
Rep = MsgBox(Vale1)
'Gros blabla pr imprimer mais inutile dans la compréhension
Next counter1
Sheets("Base").Select
Range("Thème2").Select
NbElts2 = Sélection.Rows.Count
For counter2 = 0 To nbElts2
Sheets("Base").Select
Num = 18 + nbElts1 + 1 + counter2
Vale2 = ActiveSheet.Cells(num, 9).Formula
Sheets("THEME 2").Select
Rep = MsgBox(Vale2)
'Gros blabla pr imprimer mais inutile dans la compréhension
Next counter2
...
Sheets("Base").Select
Range("Thème82").Select
NbElts8 = Sélection.Rows.Count
For counter8 = 1 To nbElts8 - 1
Sheets("Base").Select
Num = 18 + nbElts1 + nbElts2 + nbElts31 + nbElts32 + nbElts4a +
nbElts4b+ nbElts5 + nbElts6 + nbElts7 + 1 + counter8
Vale8 = ActiveSheet.Cells(num, 9).Formula
Sheets("constat libre").Select
Rep = MsgBox(Vale8)
'Gros blabla pr imprimer mais inutile dans la compréhension
Next counter8
Sheets("Base")
End Sub
Ne soyez pas choqués, j'ai volontairement enlevé du fichier (lien ci dessus) les feuilles thème 3-1, thèmes-2, thème 4a, thème 4b, thème 5, thème 6, thème 7 et constat libre pour qu'il prenne moins de place.
Mon problème est le suivant : dans la feuille base, il est possible Grace à la macro SupprimerLigne de supprimer des lignes du tableau. Celà implique que, si nous supprimons toutes les lignes d'un même thème, (par exemple Thème72), lors de l'exécution du code, arrivé à ce thème, la macro plante
En effet, si on marque
Range("Thème72").Select
Alors qu'il n'existe plus, le programme ne saura pas le sélectionner...
Je vous demande donc,
Comment créer une condition d'existence?
Quelque chose du genre:
if Thème72 existe
Range("Theme72").Select
Je suis sûre qu'il ne me manque pas plus de deux lignes de code mais... Je les trouve pas =(
Si vous avez du mal, je pourrais vous laisser le programme entier ce soir (je pourrais maintenant mais je n'ai pas envie de le retapper entieremt sur mon iPhone ^^)
En attendant, bonne compréhension et merci de m'aider
Tu peux essayer :
On Error Resume Next
Set nom = Range("Thème72")
If Not nom Is Nothing Then nom.Select
Bonjour!
Merci de ton aide mais j'avais finalement reussi à me debrouiller debrouiller d'une façon plus simple (plus simple car je ne devais pas repartir de zéro)
Enfait ça avait marché en rajoutant ligne 2 : Range("Theme1").Select
Et en changeant la ligne 3 par : nbElts = Sélection.Row.Count
Voili voilou!
Mais encore merci, ca fait plaisir de voir des réponses a
Nos questions =)