XL pour MAC Exécuter une macro selon le contenu de une liste déroulante

Valter

XLDnaute Occasionnel
Bonjour le forum, j'ai de nouveau besoin de vous, j'ai fait un petit programme de comptabilité avec ventilation automatique dans chaque compte respectif, j'utilise 1 compte par page, depuis le journal des écritures j'aimerai appeler le compte à consulter par une liste déroulante ou figurent tous les comptes, si je sélectionne le compte no 2, le compte no 2 s'affiche, si je sélectionne le compte no 5, le compte no 5 s'affiche...etc..... j'ai bien une macro qui m'ouvre chaque compte déjà faite, mais comment faire pour que la macro se mette en route selon le résultat de la listé déroulante. Je joins un petit fichier simplifié.... merci pour votre aide (sur le fichier d'exemple il n'y a aucune macro enregistrée)
 

job75

XLDnaute Barbatruc
Bonjour Valter, mapomme, le forum,
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$F$6" Then Exit Sub
On Error Resume Next 'si la feuille n'existe pas
With Sheets(CStr(Target))
    .Visible = xlSheetVisible 'si la feuille est masquée
    .Activate
    .[A1].Select
End With
End Sub
Bonne journée.
 

Fichiers joints

Valter

XLDnaute Occasionnel
Super Job 75, cela fonctionne très bien.... cependant j'ai un problème, je n'ai pas pensé de le mentionner, j'aimerai exécuter la macro qui m'ouvre la feuille et qui me la met au premier plan car cette macro exécute des opérations.... dans mon programme j'ai 50 comptes et pour chaque compte j'ai fait une macro qui s'appelle : ouvreCompte1 - ouvreCompte2...etc... y a t'il possibilité dans le code VBA d'ajouter l'exécution de la macro au lieu de faire simplement afficher la feuille.
 

job75

XLDnaute Barbatruc
dans mon programme j'ai 50 comptes et pour chaque compte j'ai fait une macro qui s'appelle : ouvreCompte1 - ouvreCompte2...etc...
Pour lancer chaque macro :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next 'si la macro n'existe pas
If Target.Address = "$F$6" Then Run "ouvre" & Target
End Sub
Cela dit je suis à peu près sûr que vos 50 macros peuvent être remplacées par une seule macro paramétrée mais puisque vous ne voulez rien nous dire faites comme ça.
 

Valter

XLDnaute Occasionnel
Pas du tout, je n'ai rien a cacher, seulement je n'ai pas pensé donner plus de détails, mais en y pensant bien, la première macro qui m'affiche le compte sélectionné selon liste déroulante, pourrait aussi fonctionner, je peux afficher en premier le compte et ensuite exécuter mes macros. Mais comme vous dites, je pourrai aussi faire une macro qui me permette de tout ramener à un seul compte, je vais y réfléchir car mon fichier excel est déjà très lourd, de toute façon merci pour ce dernier code, il va me rendre bien service.
 

Valter

XLDnaute Occasionnel
Bonsoir, Job75-Mapomme, bonsoir le forum
Je viens de faire un essai du code et cela ne fonctionne pas, justement pour ne pas avoir donné plus de détail, alors je me répète, j'aimerai améliorer un programme de comptabilité ou j'ai 50 feuilles, une feuille par compte, ou se ventilent les écritures passées dans le journal, pour sélectionner mes comptes, j'ai une page ou est inscrit le nom des 50 comptes et en cliquant sur le compte désiré, une macro m'ouvre le compte en exécutant quelque opérations comme : déprotéger la feuille, trier les opérations par date, masquer les lignes vides, reprotégér la feuille.... Or j'aimerai améliorer en mettant une liste déroulante qui me permette d'ouvrir le compté sélectionné, et pouvoir ainsi enlever la page de section de chaque compte. Je joins mon exemple revu et corrigé, ou j'ai reproduit exactement la même situation que sur mon programme de comptabilité. En espérant avoir été beaucoup plus clair cette fois-ci....

La prochaine étape sera de faire une maro (suite a l'idées de job75) qui me permettra de ramener les 50 comptes sur une seule feuille et alléger ainsi mon fichier....je dois encore y réfléchir un peu....
 

job75

XLDnaute Barbatruc
Bonjour Valter, patricktoulon, mapomme,

C'est bien ce que je disais, une seule macro paramétrée suffit :
VB:
Sub ouvreCompte(n%)
    Sheets("Compte" & n).Select
    '--------
End Sub
Elle est appelée par la macro affectée aux 9 boutons :
VB:
Sub Bouton()
Dim t$, i%, n%
t = ActiveSheet.DrawingObjects(Application.Caller).Text
For i = 1 To Len(t)
    If IsNumeric(Mid(t, i, 1)) Then n = Val(Mid(t, i)): Exit For
Next
Call ouvreCompte(n)
End Sub
ou par ce code dans la 1ère feuille (fichier joint) :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$F$6" Then If Target <> "" Then Call ouvreCompte(Application.Match(Target, [F19:F100], 0))
End Sub
A+
 

Fichiers joints

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @job75 ;),

Sur un plan pratique, il me semblerait plus sûr de tester un élément des feuilles qui contiendrait la référence textuelle au compte. On n'est jamais à l’abri qu'un zouave change l'ordre des feuilles.
Tel était le sens de ma question pour Valter...
 

Valter

XLDnaute Occasionnel
Bonjour Job75 et ma pomme, bonjour le forum, de retour de quelques jours de vacances je reprend mon programme.
Après bonne réflection j'ai modifié mon petit programme et supprimé les 50 comptes, le fichier était arrivé a 8 mo et était bien trop lourd, j'ai remplacé par une seule feuille quand je sélectionne un numero de compte dans la liste déroulante, tout le compte se compose a l'instant, c'est beaucoup plus rapide et le fichier bien plus léger, bien entendu j'ai une tout autre situation et d'autres problèmes à régler. Je bute actuellement sur effacer la cellule de la colonne A,B,C,E,G,H de la ligne sélectionnée. J'ai récupéré ce code qui sélectionne toute la ligne d'une cellule sélectionnée n'importe ou dans la même ligne : ActiveSheet.Rows(ActiveCell.Row).EntireRow.Select - Je n'arrive pas a le modifier pour que à son exécution il m'efface les cellules des colonnes A,B,C,E,G,H e la ligne selectionnée. merci pour votre aide.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @Valter,

Essayer :
VB:
ActiveSheet.Range(Replace("a_,b_,c_,e_,g_,h_", "_", ActiveCell.Row)).ClearContents
Attention! Ne confondez pas Selection et ActiveCell.

Avec ActiveCell:
Si vous sélectionnnez A3:A5 en partant de A3, les cellules effacées sont celles de la ligne 3
Si vous sélectionnnez A3:A5 en partant de A5, les cellules effacées sont celles de la ligne 5

Avec Selection à la place de ActiveCell:
Quelque soit la méthode de sélection, les cellules effacées seront celles de la ligne 3
 

Valter

XLDnaute Occasionnel
oui merci cela fonctionne très bien, juste une question pourquoi ces dignes après le H : "-"
puisque il n'y a plus rien a effacer après la colonne H
 

mapomme

XLDnaute Barbatruc
Supporter XLD
juste une question pourquoi ces dignes après le H : "-"
puisque il n'y a plus rien a effacer après la colonne H
C'est une astuce pour pouvoir faire la substitution: On remplace le "_" par le numéro de la ligne. Ainsi si Le numéro de ActiveCell.row est 3:
Replace("a_,b_,c_,e_,g_,h_", "_", ActiveCell.Row) donne: "a3,b3,c3,e3,g3,h3"
et
ActiveSheet.Range("a3,b3,c3,e3,g3,h3").ClearContents est une instruction valable au niveau VBA (et qui réalise ce qu'on cherche à faire)

Le choix de "_" est arbitraire. On pourrait aussi utiliser un autre caractère qui n'apparait jamais dans les adresse de Range comme £ ou ê ou bien d'autres...
 

Valter

XLDnaute Occasionnel
Bonsoir, je vais encore faire appel à vos connaissances... j'ai récupéré ce code en cherchant sur le forum, ce code copie les données d'une ligne (uniquement les cellules de la ligne sélectionnée se trouvant dans les colonnes (B à E) + (G et I)) et les colle en dessous de la dernière ligne. Cela fonctionne parfaitement bien, mais j'aimerai y apporter un complément, ce code se déclenche par un simple double clic, c'est trop facile de se tromper et le déclencher par erreur, y-a-t'il la possibilité d'ajouter au double clic l'appui sur la touche Option ou Commande pour que la macro s'exécute ? (je suis sur mac).

Aussi un autre complément utile serait que la colonne D contient des valeurs numériques : 1-2-3-4-5...etc... lorsque je viens coller la ligne supplémentaire, j'aimerai quelle valeur de la nouvelle ligne prenne la valeur de la ligne précédente +1(en format valeur)... (uniquement la colonne D)

Voilà sinon le reste tout est parfait.

Merci pour votre aide.


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
Dim LigneCopie As Integer
Dim LigneColle As Integer
LigneCopie = ActiveCell.Row
LigneColle = Range("B65536").End(xlUp).Row + 1
Range("B" & LigneCopie & ":E" & LigneCopie).Copy
ActiveSheet.Paste Range("B" & LigneColle)
Range("G" & LigneCopie).Copy
ActiveSheet.Paste Range("G" & LigneColle)
Range("I" & LigneCopie).Copy
ActiveSheet.Paste Range("I" & LigneColle)
Application.CutCopyMode = False

End Sub
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas