La macro qui s'effectue une fois correctement, après plus rien!!
Résolu/Fermé
bassmart
Messages postés
277
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
30 août 2022
-
4 mars 2015 à 17:01
bassmart Messages postés 277 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 30 août 2022 - 13 mars 2015 à 14:28
bassmart Messages postés 277 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 30 août 2022 - 13 mars 2015 à 14:28
A voir également:
- La macro qui s'effectue une fois correctement, après plus rien!!
- Macro logiciel - Télécharger - Organisation
- Qu'est ce qu'une femme fait 3 fois par jour - Forum Loisirs / Divertissements
- Clémence souhaite faire calculer automatiquement les prix de 30 produits dans trois devises. elle a déjà saisi une formule de calcul pour le tarif du premier produit dans la première devise. corrigez sa formule afin que recopiée vers le bas puis vers la droite, elle remplisse correctement tout le tableau. - Forum Excel
- Macro recorder - Télécharger - Confidentialité
- Macro Recorder - Télécharger - Divers Utilitaires
3 réponses
bassmart
Messages postés
277
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
30 août 2022
1
4 mars 2015 à 17:03
4 mars 2015 à 17:03
Et voici mon fichier:
https://www.cjoint.com/?0CeoaJ4rjvc
https://www.cjoint.com/?0CeoaJ4rjvc
PlacageGranby
Messages postés
393
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
7 mars 2019
26
4 mars 2015 à 17:21
4 mars 2015 à 17:21
Bonjour,
Je n'ai malheureusement pas le temps de plonger dans ton code.
Mais, la meilleur façon de trouver le problème est avec une trace pas-à-pas.
On va dans l'éditeur VBA, et on click dans la marge de gauche pour mettre un point d'arret.
Ensuite, double click, et regarde ce que le code fait. Tu va voir.
1 - si la macro s'exécute ou non avec le double click.
Si elle ne s'exécute pas, c'est un problème relié a l'évènement. Le code n'est pas dans le bon évènement.
2- si la macro s'exécute, alors tu fais F8 pour suivre pas a pas son exécution pour trouver pourquoi elle n'agit pas comme prévu.
Bonne chance.
Je n'ai malheureusement pas le temps de plonger dans ton code.
Mais, la meilleur façon de trouver le problème est avec une trace pas-à-pas.
On va dans l'éditeur VBA, et on click dans la marge de gauche pour mettre un point d'arret.
Ensuite, double click, et regarde ce que le code fait. Tu va voir.
1 - si la macro s'exécute ou non avec le double click.
Si elle ne s'exécute pas, c'est un problème relié a l'évènement. Le code n'est pas dans le bon évènement.
2- si la macro s'exécute, alors tu fais F8 pour suivre pas a pas son exécution pour trouver pourquoi elle n'agit pas comme prévu.
Bonne chance.
bassmart
Messages postés
277
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
30 août 2022
1
4 mars 2015 à 19:58
4 mars 2015 à 19:58
Merci beaucoup PlacageGranby!
Ce que j'ai remarqué, c'est que quand je modifie la valeur d'une cellule en double-cliquant dessus, il va après la ligne
Et revient ensuite après la ligne
Donc, ce que je comprend, c'est que c'est un changement de valeur. Alors, il va dans la macro qui correspond Worlsheet_Change.
À cet endroit, j'ai une macro qui fait en sorte que toutes les entrées de données sont mis en majuscule ainsi qu'une macro qui ajoute des lignes à la fin de mon tableau lorsqu'il est plein.
Quand je double-clic de nouveau sur une nouvelle cellule, plus rien ne se passe, je reste à ligne 1 de la macro BeforeDoubleClic!
Est-ce ça mon problème, je ne sais pas trop?
Ce que j'ai remarqué, c'est que quand je modifie la valeur d'une cellule en double-cliquant dessus, il va après la ligne
Activecell = NewVal, dans la macro qui se trouve tout de suite après Worksheet_Change.
Et revient ensuite après la ligne
If Target.Row < 5 Or Target.Column <> 5 Then Exit [/contents/446-fichier-sub Sub]dans ma macro BeforeDoubleClic, à la ligne
If [/contents/1169-vbscript-les-fonctions-de-chaines-de-caracteres InStr](1, nValue, "C") = 1 Or InStr(1, nValue, "M") = 1 Then.
Donc, ce que je comprend, c'est que c'est un changement de valeur. Alors, il va dans la macro qui correspond Worlsheet_Change.
À cet endroit, j'ai une macro qui fait en sorte que toutes les entrées de données sont mis en majuscule ainsi qu'une macro qui ajoute des lignes à la fin de mon tableau lorsqu'il est plein.
Quand je double-clic de nouveau sur une nouvelle cellule, plus rien ne se passe, je reste à ligne 1 de la macro BeforeDoubleClic!
Est-ce ça mon problème, je ne sais pas trop?
PlacageGranby
Messages postés
393
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
7 mars 2019
26
4 mars 2015 à 22:34
4 mars 2015 à 22:34
Tu commences avec une assignation
nValue = ActiveCell.Value
Ensuite, tu saisie la nouvelle info
NewVal = UCase$(Application.InputBox("Nouveau numéro de sondage?", "MODIFICATION DE NUMÉRO", Type:=2))
Et tu changes activecell
ActiveCell = NewVal
Mais tu utilise
If InStr(1, nValue, "C") = 1 Or InStr(1, nValue, "M") = 1 Then
nValue est une variable qui a été assignée une seule fois, donc elle égale encore son ancienne valeur. Tu passe NewVall à ActiveCell, mais jamais a nValue.
Est-ce voulu ?
nValue = ActiveCell.Value
Ensuite, tu saisie la nouvelle info
NewVal = UCase$(Application.InputBox("Nouveau numéro de sondage?", "MODIFICATION DE NUMÉRO", Type:=2))
Et tu changes activecell
ActiveCell = NewVal
Mais tu utilise
If InStr(1, nValue, "C") = 1 Or InStr(1, nValue, "M") = 1 Then
nValue est une variable qui a été assignée une seule fois, donc elle égale encore son ancienne valeur. Tu passe NewVall à ActiveCell, mais jamais a nValue.
Est-ce voulu ?
bassmart
Messages postés
277
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
30 août 2022
1
>
PlacageGranby
Messages postés
393
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
7 mars 2019
9 mars 2015 à 15:40
9 mars 2015 à 15:40
Bonjour PlacageGranby!
Oui, c'est normal! Pour l'instant ça fonctionne bien!
J'utilise nValue pour rechercher où est situé la valeur sélectionnée dans mes autres feuilles. Ensuite avec mon inputbox, je lui assigne une nouvelle valeur qui devient ma NewVal et que j'utilise pour remplacer l'ancienne valeur par la nouvelle.
Peut-être bien que mon code n'est pas très bien écrit, mais ça fonctionne! Je suis débutant en VBA!
Merci!
Oui, c'est normal! Pour l'instant ça fonctionne bien!
J'utilise nValue pour rechercher où est situé la valeur sélectionnée dans mes autres feuilles. Ensuite avec mon inputbox, je lui assigne une nouvelle valeur qui devient ma NewVal et que j'utilise pour remplacer l'ancienne valeur par la nouvelle.
Peut-être bien que mon code n'est pas très bien écrit, mais ça fonctionne! Je suis débutant en VBA!
Merci!
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
4 mars 2015 à 22:18
4 mars 2015 à 22:18
Je n'aime pas Application.EnableEvents = False. Si dans ton code il y a une sortie dans laquelle tu as omis de remettre à True, ou si il plante avant la remise à True, les macros événementielles ne fonctionnent plus !
J'utilise une booléenne comme dans cet exemple :
Dans ton code du Double-Clic tu modifies l'onglet Coordonnées mais aussi d'autres onglets qui contiennent chacun l'événementielle Change avec des Application.EnableEvents = False. Il te faut donc vérifier ton code dans tous les onglets. Je pense que ton problème vient de là...
l'Avantage de la bolléenne c'est que les autres événementielles continuent de fonctionner même si Test n'a pas été remis à False...
Autre problème, tu déclares une variable publique dans le composant Feuil2(Corrdonnées).
Or, les variables publiques doivent être déclarées tout en haut d'un module standard, (Module1 par exemple).
Pour éviter de déproteger puis reprotéger tes onglets à tout bout de champ, je te recommande ce petit bout de code du composant Thisworkbook :
L'argument UserInterfaceOnly permet la modification par macro mais pas manuellement...
J'utilise une booléenne comme dans cet exemple :
Private TEST As Boolean Private Sub Worksheet_Change(ByVal Target As Range) If TEST = True Then Exit Sub TEST = True 'le code... TEST = False 'à mettre à toutes les sorties If/Redo/Exit For/Exit sub/etc. End Sub
Dans ton code du Double-Clic tu modifies l'onglet Coordonnées mais aussi d'autres onglets qui contiennent chacun l'événementielle Change avec des Application.EnableEvents = False. Il te faut donc vérifier ton code dans tous les onglets. Je pense que ton problème vient de là...
l'Avantage de la bolléenne c'est que les autres événementielles continuent de fonctionner même si Test n'a pas été remis à False...
Autre problème, tu déclares une variable publique dans le composant Feuil2(Corrdonnées).
Public var As Variant
Or, les variables publiques doivent être déclarées tout en haut d'un module standard, (Module1 par exemple).
Pour éviter de déproteger puis reprotéger tes onglets à tout bout de champ, je te recommande ce petit bout de code du composant Thisworkbook :
Private Sub Workbook_Open()
Dim O As Object 'déclare la variable O (Onglet)
For Each O In Sheets 'boucle sur tous les onglets du classeur
O.Protect UserInterfaceOnly:=True 'protège l'onglet en laissant les macros agir
Next O
Sheets("Accueil").Select
End Sub
L'argument UserInterfaceOnly permet la modification par macro mais pas manuellement...
bassmart
Messages postés
277
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
30 août 2022
1
Modifié par bassmart le 9/03/2015 à 16:30
Modifié par bassmart le 9/03/2015 à 16:30
Merci ThauTheme pour la réponse!
Premièrement, je comprend ce que tu dit par rapport à
Là, je suis un peu perdue! Est-ce que j'ajoute simplement les lignes de codes tel quelle?
Pour le
Quel problème, pourrais-je avoir avec le fait qu'il ne soit pas déclaré dans un module?
Et pour ta proposition pour la protection, ça fonctionne très bien! Mais seulement pour la première modification que j'effectue dans ma feuille Coordonnées. Après, j'ai un message d'erreur parce que ma feuille est vérouillée! Il arrête à la ligne ActiveCell dans le code suivant:
Merci beaucoup!
Premièrement, je comprend ce que tu dit par rapport à
Application.EnableEvents=Falsemais comment modifier mon code avec ta proposition.
Là, je suis un peu perdue! Est-ce que j'ajoute simplement les lignes de codes tel quelle?
Pour le
Public var As Variant. Il se retrouve en haut de la feuille Coordonnées. J'ai trouvé ça sur un forum, je voulais que lorsque je modifie une cellule qu'il me renvoie un message du genre "N'oubliez pas de changer le numéro dans la colonne X" à l'écran. Mais ça ne fonctionne pas, même si j'entre de nouveau la même valeur, il m'envoie le message.
Quel problème, pourrais-je avoir avec le fait qu'il ne soit pas déclaré dans un module?
Et pour ta proposition pour la protection, ça fonctionne très bien! Mais seulement pour la première modification que j'effectue dans ma feuille Coordonnées. Après, j'ai un message d'erreur parce que ma feuille est vérouillée! Il arrête à la ligne ActiveCell dans le code suivant:
If var <> Target Then
var = Target.Value
MsgBox "N'oubliez pas de changer le numéro dans la colonne ABRÉVIATION!", vbExclamation, "IMPORTANT"
ActiveCell.Offset(-1, 0).Select
End If
Merci beaucoup!
bassmart
Messages postés
277
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
30 août 2022
1
>
bassmart
Messages postés
277
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
30 août 2022
13 mars 2015 à 14:28
13 mars 2015 à 14:28
Bonjours à tous!
Problème réglé!
Effectivement, le problème venait de
Et pour le code proposé par thautheme pour la protection des feuilles, ça marche très bien! C'était encore mon problème de
Voici mon code final!:
Problème réglé!
Effectivement, le problème venait de
Application.EnableEvents=False. j'ai ajouté une expression
Application.EnableEvents=trueà la fin de ma macro et ça corrigé mon problème.
Et pour le code proposé par thautheme pour la protection des feuilles, ça marche très bien! C'était encore mon problème de
Application.EnableEvents=Falsequi fesais tout planter!
Voici mon code final!:
Private dlig As Long
Private PL As Range
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim nvalue As String
Dim NewVal As Variant
Dim f As Worksheet
Dim valueRange As Range
Dim Cpt As Integer
Application.ScreenUpdating = False
nvalue = ActiveCell.Value
If Not Intersect(Target, Range("c5:c" & [a1048576].End(xlUp).Row + 1)) Is Nothing Then
If MsgBox("Voulez-vous mofifier le numéro de ce sondage?", _
vbYesNo + vbQuestion, "MODIFER") = vbYes Then
NewVal = UCase(InputBox("Nouveau numéro de sondage?", "MODIFICATION DE NUMÉRO"))
If NewVal = "" Then
ActiveCell.Offset(-1, 0).Select
Exit Sub
Else
ActiveCell = NewVal
End If
If InStr(1, nvalue, "C") = 1 Or InStr(1, nvalue, "M") = 1 Then
Set valueRange = Sheets("CPTU").Columns(1)
ElseIf InStr(1, nvalue, "F") = 1 Then
Set valueRange = Sheets("FORAGE").Columns(1)
ElseIf InStr(1, nvalue, "Z") = 1 Or InStr(1, nvalue, "FZ") = 1 Then
Set valueRange = Sheets("Piézomètres").Columns(2)
ElseIf InStr(1, nvalue, "I") = 1 Then
Set valueRange = Sheets("Inclinomètres").Columns(2)
Else
Set valueRange = Nothing
MsgBox "La valeur n'a pas été trouvé dans les autres feuilles! Mettre à jours les feuillets sur la page d'accueil!", vbCritical
End If
If Not valueRange Is Nothing Then
valueRange.Replace nvalue, NewVal, lookat:=xlWhole, searchorder:=xlByColumns
End If
If NewVal <> nvalue Then
MsgBox "N'oubliez pas de changer le numéro dans la colonne ABRÉVIATION!", vbExclamation, "IMPORTANT"
ActiveCell.Offset(-1, 0).Select
End If
Else
ActiveCell.Offset(-1, 0).Select
End If
End If
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub