Se connecter avec
S'enregistrer | Connectez-vous

Macro automatique sur une colonne

Dernière réponse : dans Programmation

Bonjour,

J'ai réalisé une macro qui me permet de remplir la colonne 3, avec une valeur en H3, si la cellule de la colonne 1 ,est remplie. Voici le code :



  1. Sub Ecrire()
  2. Dim cellule As Range
  3. Set cellule = ActiveCell
  4. If ActiveCell <> Empty Then
  5. Cells(cellule.Row, cellule.Column + 2) = Range("H3")
  6. End If
  7. End Sub


Celui-ci marche mais je ne sais pas comment il est possible de le lancer automatiquement sur toute la colonne 3 sans avoir à lancer la macro manuellement.
Savez vous comment faire ?

Autres pages sur : macro automatique colonne

Lassé par la pub ? Créez un compte
Expert Programmation

Salut Baba,
Sois le bienvenu.

Merci de lire attentivement le règlement. Il y est notamment stipulé qu'il faut utiliser la balise [code] pour toute publication de code source.

Je te laisse le soin de modifier ça. En attendant, je me penche sur ton problème.
Expert Programmation

Pas de problème. Tu remarqueras que j'avais remarqué que tu étais nouveau ;) 

La balise [code] permet de respecter une sainte règle à laquelle tout programmeur doit obéissance, quelque soit sa religion (VB, Pascal, C/C++/J, ...). C'est règle sacrée s'appelle l'Indentation. Je crois que la punition pour ne pas la respecter, c'est le bûcher [:nyghost] T'as pas de change, t'es tombé sur l'Inquisiteur de service !

Bon, il faut parcourir toute la colonne. Par exemple, la colonne A, c'est la numéro 1, parmi toutes. Ça s'écrit : Columns(1).
Pour parcourir, on va utiliser l'instruction For Each. Et on parcours quoi ? Les cellules (Cells)
Allez, c'est parti :
  1. Dim cellule As Range
  2. For Each cellule In Columns(1).Cells
  3. ..
  4. Next

C'est facile, non ?

Bon alors maintenant, je regarde ton code, puisqu'il est lisible :whistle: 
Euh, tu devrais étudier la méthode Offset(), c'est plus sympa que tes gros calculs.

Et pis Empty, ça n'existe pas. VB est excessivement permissif, ce qui permet de faire n'importe quoi. Et c'est le cas :o 
Alors pour limiter la casse, on utilise OBLIGATOIREMENT si on veut avoir une réponse sur ce forum, l'instruction Option Explicit.
Merci de consulter l'aide pour savoir pourquoi.
Pour déterminer si une cellule est vide, on utilise la fonction IsEmpty()

Bon, ben tout est dit. Regarde :
  1. Dim cellule As Range
  2. For Each cellule In Columns(1).Cells
  3. If IsEmpty(cellule.Value)Then cellule.Offset(0, 2).Value = Range("H3").Value
  4. Next


Tu remarqueras que je fais un usage important de la propriété Value. Pourquoi ? Ben c'est un exercice pour toi à faire la maison.
[:flambyx:2]

Trés bien, merci beaucoup pour tous ces conseils qui me sont trés précieux en ces débuts difficiles. Une curiosité, quel serait le contraire de IsEmpty? Je vais prendre le soin de lire l'aide la prochaine fois. Encore merci pour tout !!
Expert Programmation

Not IsEmpty pardi !

Comment ça tu n'as pas lu l'aide :fou: 
Tu as parfaitement de droit de poser des questions, mais s'il est détecté que tu t'es dispensé de la lecture de l'aide, les réponses seront RTFM!.

En fait, le plus difficile quand on débute, est de savoir quoi chercher. C'est pourquoi même les questions qui semblent les plus bêtes sont acceptées ici. Par contre, il faut accepter certaines réponses :lol: 

En fait je ne suis pas complétement satisfaite de mon programme:
Il faudrait qu'à chaque modification de ma colonne A, ma colonne C soit modifiée. C'est à dire que si je rentre un nouveau texte alors à la pression de la touche Enter, ma touche H3 apparait dans la colonne 3.
Je ne sais pas si je suis trés claire.
Expert Programmation

Ah, ça n'a rien à voir, alors !

Dans le code de la feuille où tu veux voir le phénomène se produire; implémente la fonction Worksheet_Change(ByVal Target As Range).
Lis l'aide sur Change et pour que ce soit encore plus clair pour toi, remplace Target par cellule.

T'as tout compris ! :sol:  Alors propose nous ton code.
T'as rien compris... :(  Relis l'aide.
T'as compris un peu mais pas tout :/  Ben je vais t'aider.

Voici mon code qui hélas ne marche pas (évidemment ça serait trop facile) :

  1. Private Sub Worksheet_Change(ByVal cellule As Range)
  2. If cellule.Address = Range("G23").Address Then
  3. Run ("Ecrire")
  4. End If
  5. End Sub
  6.  
  7.  
  8. Sub Ecrire()
  9.  
  10.  
  11. Dim cellule As Range
  12.  
  13. Set cellule = ActiveCell
  14.  
  15. For Each cellule In Columns(7).Cells
  16.  
  17.  
  18. If Not IsEmpty(cellule.Value) Then cellule.Offset(0, 2).Value = Range("H3").Value
  19.  
  20.  
  21. Next
  22.  
  23. End Sub


MODERATEUR: MERCI DE NE PAS CONFONDRE [\xxx] et [/xxx]

Même en mettant un End If, le programme tourne certes mais n'effectue pas la commande voulue.
J'aimerais qu'automatiquement en inscrivant ou en modifiant quelque chose en colonne 7, on me renvoie en colonne 9 avec écrit la case H23. cela ne me semble pas bien dur mais je n'y arrive pas. si vous pouvez m'aider encore un tout petit peu je vous serais trés reconnaissant. Mille Merci
Expert Programmation

Pourquoi demandes-tu l'option explicit et un End If, oozenot ?
La variable est bien définie, et toute l'instruction If est sur une seule et même ligne. :??: 

Bon, si tu veux dire que parce que Baba n'a pas été fichue de nous fermer correctement la balise [cpp], alors je comprends mieux que tu n'aies pas bien vu. (Et toc !)

--------------

Pour vérifier que tu es dans la plage "G23:G199", il faut vérifier 3 conditions :
  • Que la ligne soit plus grande ou égale à 23
    ET
  • Que la ligne soit plus petite ou égale à 119
    ET
  • Que la colonne soit égale à 7.

    Il est où le problème ? [:spamafote]

    Encore besoin de votre aide :

    J'aimerais qu'automatiquement en inscrivant ou en modifiant quelque chose en colonne 7, on me renvoie en colonne 9 avec écrit la case H23. cela ne me semble pas bien dur mais je n'y arrive pas. si vous pouvez m'aider encore un tout petit peu je vous serais trés reconnaissant

    1. Private Sub Worksheet_Change(ByVal cellule As Range)
    2.  
    3. If cellule.Address = Range("G23:G199").Address Then
    4. Call Ecrire
    5. End If
    6. End Sub
    7.  
    8.  
    9. Sub Ecrire()
    10.  
    11.  
    12. Dim cellule As Range
    13.  
    14. Set cellule = ActiveCell
    15.  
    16. If Not IsEmpty(cellule.Value) Then cellule.Offset(0, 2).Value = Range("H3").Value
    17.  
    18.  
    19. End Sub

    Bon bon bon , je désespère un peu, cela ne marche pas. Alors je ne sais pas s'il faut tout rentrer dans module ou dans feuille. En essayant tout rien ne fonctionne comme je le souhaite. Si vous avez des idées, d'autres idées je suis preneuse. Encore merci pour votre aide et à la prochaine
    Expert Programmation

    M'enfin, évidemment qu'il faut coder ça dans le code de la feuille et non pas dans un module. Si cela ne t'apparaît pas évident, merci de lire mes messages précédents, je l'ai précisé :
    zeb a dit :
    Dans le code de la feuille où tu veux voir le phénomène se produire; implémente la fonction Worksheet_Change(ByVal Target As Range).


    Il faut que tu nous donnes le code que tu essaies. Sinon, on ne peut pas présumer de ce que tu inventes ou pas.
    A priori, tu as tous les éléments pour réussir. Reste donc à les mettre dans l'ordre.

    Ne désespère pas, tu vas y arriver.
    Lassé par la pub ? Créez un compte