Macro applicable à une seule colonne [Résolu/Fermé]

Signaler
Messages postés
490
Date d'inscription
jeudi 5 mars 2009
Statut
Membre
Dernière intervention
16 avril 2018
-
Messages postés
490
Date d'inscription
jeudi 5 mars 2009
Statut
Membre
Dernière intervention
16 avril 2018
-
Bonjour,

J'ai élaboré une macro pour déplacer des valeurs dans une feuille.

Voici le texte de la macro :

Sub test2()
'
' test2 Macro
'
Dim i As Integer

For i = 1 To 20

If Cells(i, 1).Value = "Oui" Then Cells(i, 1).Activate

ActiveCell.Offset(2, 1).Select
Selection.Copy
ActiveCell.Offset(-2, 2).Activate
ActiveSheet.Paste

Next i

Cells(1, 1).Activate
Application.CutCopyMode = False


End Sub


Quand je l'exécute, la macro défile ligne par ligne et colonne par colonne dans toute la feuille.

Compte tendu que j'aurai 6000 lignes (et non 20) à traiter, je souhaite que le défilement ne se fasse que dans la première colonne. Or, même si j'écris "cells(i, 1)", toutes les colonnes sont traitées.

J'ai essayé de trouver une méthode pour n'appliquer la macro qu'à la colonne A, mais n'ai rien trouvé de concluant.

Pire encore : je viens de constater que ma macro copie les valeurs de la cellule E3 dans la cellule G1, et ainsi de suite, ce qui n'est aucunement censé se produire.

Le but est que, pour chaque cellule de la colonne A où la valeur est = à "oui", la valeur contenue dans la cellule (2 lignes plus bas, 1 colonne à droite) se copie dans la cellule de la colonne D à la même ligne que la cellule en colonne A où se trouve la valeur "oui".

J'espère que c'est clair!!!

Pourriez-vous m'aider, svp.

1 réponse

Messages postés
12749
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 octobre 2020
708
Tu fais deux erreurs:
- les 4 instructions entre le if et le next sont toujours exécutées, elles ne sont pas contrôlées par le if
- il faut éviter d'utiliser select, activate, copy, paste dans des macros
Essaie ceci (non testé) :
For i = 1 To 20
    If Cells(i, 1).Value = "Oui" Then 
        Cells(i, 4) = cells(i+2,2)
    end if
Next i
Messages postés
490
Date d'inscription
jeudi 5 mars 2009
Statut
Membre
Dernière intervention
16 avril 2018
28
Merci!
Ça fonctionne!
Ma macro était du rapiéçage d'une macro créée manuellement (enregistrer macro) et d'informations trouvées en ligne...
Mais pourquoi il faut éviter les « select, activate, copy, paste » dans les macro?
C'est pourtant ce que le logiciel écrit automatiquement quand on enregistre une macro...
Messages postés
12749
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 octobre 2020
708
Pourquoi éviter « select, activate, copy, paste » dans les macros : principalement parce que c'est source d'erreur et de confusion pour les humains qui gèrent le code VBA.
Pour le logiciel, cela ne pose pas de problème, sinon qu'il passe un peu de temps à faire du travail inutile, à changer ce qui est affiché.
Et tout l'art, c'est de profiter des macros enregistrées automatiquement pour en faire quelque chose de bien, :-)
Messages postés
490
Date d'inscription
jeudi 5 mars 2009
Statut
Membre
Dernière intervention
16 avril 2018
28 >
Messages postés
12749
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 octobre 2020

Merci également pour les informations a/s des actions/commandes à éviter en VBA. J'en prendrai bien note pour l'avenir!
Messages postés
12749
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 octobre 2020
708
tu as compris pour le "if"?
il y a deux syntaxes possibles :
une seule instruction controlée par le if :
if condition then action

un ensemble d'instructions (0, 1, 2, ...) :
if condition then
  actions
end if

c'est plus prudent d'utiliser la deuxième syntaxe, c'est plus clair si on passe de une à plusieurs instructions...
Messages postés
490
Date d'inscription
jeudi 5 mars 2009
Statut
Membre
Dernière intervention
16 avril 2018
28 >
Messages postés
12749
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 octobre 2020

Merci, oui, en fait, plus tard, j'ai dû ajouter une action (car je vous ai soumis la macro avec des variables que j'avais à changer, n'ayant pas encore sous les yeux le fichier officiel, et finalement, il y avait deux actions à faire... j'ai donc déduis par moi-même qu'on pouvait soumettre un ensemble d'instructions.
Ce qui me manquait, c'était de simplifier le copy-paste, etc. en appelant simplement la valeur d'une cellule dans une autre cellule, comme on le fait simplement dans une feuille de calcul, mais je n'avais pas pensé le faire en VBA.
Vous avez sûrement constaté que je suis tout à fait novice en VBA!!!

Merci énormément!