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. Microsoft a conçu sa fonction Cells() de façon que le 1er argument transmis est la ligne et le 2ème argument transmis est la colonne ; tu peux le vérifier avec l'aide VBA :

screen

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 ! L'ancêtre d'Excel, Multiplan dans les années 80 sous DOS, avant Windows) procédait uniquement en L1C1. Le mode A1 est apparu plus tard. Et pareil pour tous les tableurs.

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 ?

screen

Cordialement,

dhany

Rechercher des sujets similaires à "correction macro"