Correction de ma macro
Bonsoir,
Petit nouveau dans l'utilisation du VBA et sur ce forum j'arrive avec un problème qui peut être vous paraîtra simple mais qui moi me pose problème ( ça fait deux fois "problème" c'est un problème...
Je précise que je suis autodidacte dans la programmation que j'ai découverte il y a environs un an.
Je cherche à faire une macro qui m'alerte si je tente de modifier une cellule qui est "incompatible" avec une autre. Le but est de gérer l’occupation de zones qui ne peuvent être occupées en simultanées.
j'ai commencé à faire une macro mais elle "coince" au niveau de la ligne: If TC02 <> "" And vligne = 8 Then
Voici la macro en elle même:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim vcol As Integer
Dim vligne As Integer
Dim vreponse As Integer
Dim vcellule As Object
Dim TC02 As Variant
vcol = Target.Column
vligne = Target.Row
TC02 = Cells(vcol, 7).Value
If TC02 <> "" And vligne = 8 Then
vreponse = MsgBox("Attention activité sur TC02 ." & Chr(10) & "voulez vous le laisser?", vbYesNo + vbInformation, "attention")
If vreponse = vbNo Then
Range(Target.Address).Activate
End If
End If
End Sub
Si quelqu'un pouvait m"aider cela m'éviterait de perdre le peu de cheveux qu'il me reste.
Par avance merci.
Bonsoir,
Pour faire une version un peu plus compacte :
Private Sub Worksheet_Change(ByVal Target As Range)
If Me.Cells(7, Target.Column) <> "" And Target.Row = 8 Then
If MsgBox("Attention activité sur TC02." & Chr(10) & "Voulez vous le laisser ?", _
vbYesNo + vbInformation, "attention") = vbNo Then
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End If
End Sub
Tu n'as pas précisé ce que tu entendais par "coincer" ?
Comme pour ton TC02 tu sembles avoir inversé ligne et colonne, cela a peut-être pu avoir une incidence.
Cordialement.
Bonsoir Cyra,
La syntaxe pour Cells() est d'abord la ligne, puis la colonne ;
et tu as mis Cells(vcol, 7) au lieu de Cells(7, vcol) ! pour :
ligne 7, colonne vcol
De plus, tu as déclaré la variable vcellule inutilement car
tu ne l'as pas utilisée.
dhany
Bonjour à tous les deux et merci davoir pris le temps de me repondre.
Effectivement ma mise en page n'était pas optimale....
Pour la variable déclarée effectivement je vais la supprimer c'est un oubli des nombreux essais que j'ai réalisé et surtout je vais inverser ligne et colone, mon problème viens sûrement de la car ma macro ne fonctionnait pas quand je testais la cellule que je voulais.
Si c est bien cela je fermerai ce post sans oublier de vous remercier.
Bonne journée à vous et bonne st valentin!
Cyra.
Ps petite question savez vous pourquoi colone et ligne sont inversées avec cells?
Bonjour Cyra,
Tu a écrit :savez vous pourquoi colonne et ligne sont inversées avec cells ?
C'est juste que la syntaxe est comme ça.
Bonne journée et bonne saint valentin à toi aussi.
Cordialement,
dhany
Bonjour,
Si c est bien cela je fermerai ce post sans oublier de vous remercier.
Je te conseille tout de même de regarder un peu plus avant sur le fond !
Dans ton code initial tu interviens si l'utilisateur tente de modifier une cellule que tu qualifies incompatible, pour le lui signaler et lui demander s'il veut conserver la modification. Il répond oui, tu la conserves, logique, il répond non, tu ne fais rien ! illogique ! Plus précisément, tu déplaces le curseur à l'endroit où il est déjà (puisque aucune commande ne l'a déplacé) ce qui n'est pas une action en soi et au demeurant un geste inutile. Sans doute veux-tu faire la suppression manuellement (ce qui aménerait d'ailleurs la procédure à se redéclencher de la même façon, la condition demeurant identique par rapport à la cellule modifiée), la logique est cependant dans ce cas d'annuler la modification (sur laquelle l'utilisateur est revenu) sans provoquer un nouveau déclenchement de la procédure...
C'est le noyau même de l'intervention, qu'il t'appartient de finaliser...
Par ailleurs, tu utilisais un nombre (relatif) de variables élevé. Je suis tout à fait partisan de mobiliser le nombre de variables dont on a besoin pour conduire une procédure à terme dans les meilleures conditions, mais il ne faut tout de même pas oublier que toute variable, c'est de la mémoire dédiée à son utilisation, soit des ressources mises en jeu, et que l'optimisation du code passe aussi par l'économie des ressources mobilisées.
On pourrait objecter que l'on n'a pas trop à s'en soucier s'agissant d'une petite procédure ponctuelle... Faussement, car c'est dans le moindre bout de code écrit que l'on acquiert le réflexe de produire un code fiable, rapide et économique. Si on ne l'a pas au niveau réflexe, on ne sera pas en mesure de le mettre en oeuvre lorsque l'on produira une application dont le code occupe plusieurs dizaines de pages...
Ainsi, l'examen de tes variables, se révélant à utilisation unique, rend peu justifié que l'on y recoure, cela ne fait rien gagner, aucun temps en particulier, et cela ne simplifie nullement l'écriture du code, puisque la version que je t'en fournis sans recourir à aucune variable est plus courte !
Ce sont deux volets que je soumets à ta réflexion, utiles me semble-t-il pour progresser en matière de prgrammation VBA...
Pour ce qui est de la syntaxe des propriétés destinées à renvoyer des objets Range, tu as pu noter que dans Excel tu as deux styles d'adressage des cellules et plage de cellules : l'un dit A1
dans lequel on associe une lettre de colonne et un numéro de ligne, l'autre dit L1C1
(R1C1 en anglais) basé sur un repérage numérique de la ligne et de la colonne, toujours dans l'ordre ligne, colonne, en vigueur depuis l'origine des tableurs, avant même l'apparition d'Excel. Tu pourras noter que la syntaxe VBA se calque sur ces deux types d'adressage...
Cordialement.
Et ça fonctionne!!!!
Un grand merci à tous pour le temps que vous m'avez consacré et surtout pour vos réponses trés très complètes!!!
J'ai finalisé aujourd'hui ma macro et elle tourne impeccable, je mets cela sur la chance des débutant et de vos conseil avisés.
Je ne "décolère" pas contre le fait que la ligne soit avant la colonne et surtout que je ne m'en souvenais pas.
mais comme en tout malheurs quelque chose est bon je me dis que là j'ai retenue la leçon!
Une très belle soirée à vous tous et une saint valentin tout aussi bonne.
VBAtiquement votre
Cyra
On a toujours fait passer les lignes avant les colonnes !
Il faut croire que tout le monde pense en majorité LigneColonne plutôt que ColonneLigne !
Cordialement.
@Cyra et MFerrand
Cyra a écrit :Je ne "décolère" pas contre le fait que la ligne soit avant la colonne et surtout que je ne m'en souvenais pas.
MFerrand a écrit :Il faut croire que tout le monde pense en majorité LigneColonne plutôt que ColonneLigne !
Avec d'anciens langages Basic de Microsoft (BASICA, QBASIC), pour positionner le curseur sur l'écran : LOCATE ligne, colonne ; avec le langage Turbo Pascal (toutes versions) de l'ancienne société Borland : gotoXY(colonne, ligne); ➯ c'est pas forcément une généralité de placer la ligne avant la colonne, et peut-être que Cyra avait programmé en Turbo Pascal ?
Cordialement,
dhany