Première fois que j'essaie, tout seul, d'utiliser le VBA.
J'ai créé, via la barre d'outil "contrôle formulaire" des cases d'option.
Suivant ce qui est coché (une seule coche possible), ca me renvoie les valeurs de chaque case (3 au total) dans des cellules fixes.
j'aurai aimé ajouté, via VBA, un commentaire directement sur cette case d'option.
En passant par un commentaire de cellule, ce dernier est caché par la case, et donc ne s'affiche pas.
j'ai essayé de developper qqchose mais j'ai un message d'erreur :
"Erreur d'exécution '424' : Objet requis"
et voici le code que j'ai essayé de mettre en place (piqué sur un autre fichier trouvé sur la toile) :
Code:
Private Sub OptionButton1_Click()
OptionButton1.Font.Size = 16
End Sub
Private Sub OptionButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Label.Visible = False Then Label1.Visible = True
End Sub
Private Sub Label2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Label.Visible = False
End Sub
Si l'un d'entre vous avait les compétences pour corriger mon code et/ou, si ce n'est pas faisable, me proposer une autre solution ?
Après revue de ta solution, je n'ai plus les numéros qui apparaissent en A1 et B1 comme dans le fichier originel ! (je les ai mise en blanc sur fond blanc il me semble mais j'en ai besoin).
Après revue de ta solution, je n'ai plus les numéros qui apparaissent en A1 et B1 comme dans le fichier originel ! (je les ai mise en blanc sur fond blanc il me semble mais j'en ai besoin).
j'ai essayé sur mon fichier, mais malgré tes pistes j'ai toujours des erreurs.
Dans le fichier joint, je souhaite que lorsque "Ligne à créer" est renseigné, alors les lignes 24 à 33 disparaissent. De même lorsque le type de modification renseigné est "Ouverture" (pas implémenté dans mon essai car bug déjà pour ligne à créer)
:s
Merci de ton retour !
Pièces jointes
Procédure Modification budgétaire Exemple à suivre test.xlsm
déjà penser à remettre les Protect et UnProtect aux bons endroits
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("D7")) Is Nothing And Target.Count = 1 Then
ActiveSheet.Unprotect Password:="toto"
Target = "¤"
[F7] = "¡": [H7] = "¡": [A1] = 1
ActiveSheet.Protect Password:="toto"
End If
If Not Intersect(Target, Range("F7")) Is Nothing And Target.Count = 1 Then
ActiveSheet.Unprotect Password:="toto"
Target = "¤"
[D7] = "¡": [H7] = "¡": [A1] = 2
ActiveSheet.Protect Password:="toto"
End If
If Not Intersect(Target, Range("H7")) Is Nothing And Target.Count = 1 Then
ActiveSheet.Unprotect Password:="toto"
Target = "¤"
[F7] = "¡": [D7] = "¡": [A1] = 3
ActiveSheet.Protect Password:="toto"
End If
If Not Intersect(Target, Range("D9")) Is Nothing And Target.Count = 1 Then
ActiveSheet.Unprotect Password:="toto"
Target = "¤"
[F9] = "¡": [B1] = 1
Rows("24:33").EntireRow.Hidden = True
ActiveSheet.Protect Password:="toto"
End If
If Not Intersect(Target, Range("F9")) Is Nothing And Target.Count = 1 Then
ActiveSheet.Unprotect Password:="toto"
Target = "¤"
[D9] = "¡": [B1] = 2
Rows("24:33").EntireRow.Hidden = True
ActiveSheet.Protect Password:="toto"
End If
End Sub
à+
Philippe
Edit: je serai absent du forum pendant quelques jours, Papy s'occupe de ses petiots
Je me suis un petit peu lancé dans le VBA ... mais du coup mon fichier est lent.
je voulais savoir si vous pouviez m'aider à remodéliser mon code de manière à ce qu'il soit plus rapide ?
Pour mieux comprendre : normalement j'ai une base Power Query qui vient mettre à jour automatiquement un onglet "Base" dans le fichier. D'après cette base, dans l'onglet "liste de validations", je me fais mes petits TCD pour alimenter des listes de validations et les mettre à jour automatiquement.
Ici j'ai du faire intervenir VBA car la coche "mise à jour à l'ouverture du fichier" dans les parametres du TCD ne fonctionnaient pas (peut être que les TCD se mettaient à jour alors que l'onglet sur lequel ils - les TCDs - se basaient n'était pas encore à jour => du coup pas de modification) de fait j'ai demandé à Excel de m'actualiser les TCD à chaque fois qu'on changeait de cellule.
C'est lourd mais ça fonctionne. Si il y a un code qui peut prioriser les mise à jour (d'abord mettre à jour Power Query et ensuite seulement les TCD).
Ensuite, suivant les différentes cases cochées, il faut faire apparaitre soit les lignes 25 à 32 quand on coche "Ligne existante" et 33 à 35 lorsque l'on coche "Ligne à créer".
La coche "Ouverture" doit cacher les lignes 9 à 10 et par défaut faire comme si la "Ligne Existante" était cochée.
Pour me simplifier la tache, j'ai essayé de remettre les parametres à 0 (Ligne à modifier) à chaque fois qu'un nouveau paramètre dans "Type de modification" était coché, car ma macro s'emmêlait les pinceaux mais si vous pouvez modéliser un code qui ne remet pas 0 les paramètres (qui garde la saisie dans les coches) ce serait top !
je souhaite garder les chiffres dans les cellules A1 et B1 car je base mes formules et mise en page dessus.
Ci joint un fichier exemple qui j'espère sera plus explicite que mon discours =)
Si besoin d'information est, je reste évidemment pas loin pour y repondre le plus promptement possible car je sais que vous êtes très réactif et je vous remercie d'ailleurs pour votre temps passé sur mon problème (et plus généralement à aider les néophytes dans mon genre).
je me suis dépatouillé comme un grand !
Effectivement mes TCD s'actualisaient mal car il n'attendaient pas que ma requete Power Query soit actualisée : j'ai décoché l'actualisation des données power query en arrière plan et maintenant mes TCD se mettent bien à jour à l'ouverture du fichier.
Du coup j'ai pu alléger mon code qui n'est plus lent.
j'ai rajouté un bout de code pour enlever le message d'erreur à l'actualisation des TCD (comme quoi il y a des données à droite ou en dessous) :
Code:
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Application.DisplayAlerts = False
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("D7")) Is Nothing And Target.Count = 1 Then
Target = "¤"
[F7] = "¡": [H7] = "¡": [A1] = 1
Rows("9:9").EntireRow.Hidden = False
Rows("25:32").EntireRow.Hidden = False
Rows("33:36").EntireRow.Hidden = True
End If
If Not Intersect(Target, Range("F7")) Is Nothing And Target.Count = 1 Then
Target = "¤"
[D7] = "¡": [H7] = "¡": [A1] = 2
Rows("9:9").EntireRow.Hidden = False
Rows("25:32").EntireRow.Hidden = False
Rows("33:36").EntireRow.Hidden = True
End If
If Not Intersect(Target, Range("H7")) Is Nothing And Target.Count = 1 Then
Target = "¤"
[F7] = "¡": [D7] = "¡": [A1] = 3: [D9] = "¤": [F9] = "¡": [B1] = 1
Rows("9:9").EntireRow.Hidden = True
Rows("25:32").EntireRow.Hidden = True
Rows("33:36").EntireRow.Hidden = False
End If
If Not Intersect(Target, Range("D9")) Is Nothing And Target.Count = 1 Then
Target = "¤"
[F9] = "¡": [B1] = 1
End If
If Not Intersect(Target, Range("F9")) Is Nothing And Target.Count = 1 Then
Target = "¤"
[D9] = "¡": [B1] = 2
End If
If [F7] = "¤" And [D9] = "¤" Then
Rows("25:32").EntireRow.Hidden = False
Rows("33:36").EntireRow.Hidden = True
End If
If [F7] = "¤" And [F9] = "¤" Then
Rows("25:32").EntireRow.Hidden = True
Rows("33:36").EntireRow.Hidden = False
End If
End Sub
Si le code est toutefois optimisable, je suis preneur