Forum Clubic

Novice en VBA

Bonjour je suis novice en vba et je voudrai créer une macro de comparaison je vous explique:
voici mon tableau:

         A          :         B         :         C       :          D          :

_____________ :::____________ :__
1 dupont 10 dupont 20
::::
2 durant 7 dupré 10
:::___:
__
3 : durant 20

et voici le resultat que j’aimerai avoir:

        A          :         B         :         C       :          D          :

_____________ :::____________ :__
1 dupont 10 dupont 20
::::
2 dupré 0 dupré 10
:::___:
__
3 durant : 7 : durant 20

en fait mon but est de comparer 2 cellules ,si elles ne sont pas égales
alors il faudrai inserer une ligne en A2:B2 dans le cas si dessus et copier
le contenu de A2 ET B2 en A3 ET B3 puis copier c2 et d2 dans a2 et b2

voila j’espere m’etre bien expliquer
merci pour votre aide

J’ai supprimé le doublon, en espérant avoir supprimé le bon.

Si jamais il y avait un souci, je peux restaurer l’ancien topic et supprimer celui là. Au choix :wink:

As-tu essayé de faire à la lettre (manuellement, pas par programme) le scénario que tu nous proposes ?
en fait mon but est de comparer 2 cellules
au hasard? sans doute plutôt celles des colonnes A et C ?

si elles ne sont pas égales alors il faudrait insérer une ligne en A2:B2
Si tu insères une ligne, ce sera obligatoirement de A1 à A256
Là tu insères simplement deux cellules ; et dans ce cas tu as le choix entre décaler l’existant vers la droite ou vers le bas
D’après la suite tu dois avoir choisi l’option de décaler vers le bas ?

et copier le contenu de A2 ET B2 en A3 ET B3
C’est fait automatiquement par la fonction insertion/décalage vers le bas

puis copier c2 et d2 dans a2 et b2
Ce n’est pas ce que tu nous montres dans ton exemple (C2=dupré A2=dupré; D2=10 B2=0)

A quelle règle obéis-tu pour passer le contenu des (anciennes) cellules A3-B3 en C3-D3 ?

Essaie de reformuler ton problème de façon correcte, je pense que ça te donnera directement la solution à ton problème d’écriture de code

Edit:
D’après la forme de l’exemple, j’ai supposé que c’était du VBA sous excel.
Si c’est pour winword ça change un peu les choses
Edité le 07/09/2010 à 10:47

voila un montage en image pour mieux me faire comprendre
[Photo supprimée]

Il faut que tu travailles en deux temps

  • d’abord, tu écris la fonction (macro) qui te permet de faire l’opération que tu décris en images ci dessus, en partant de l’hypothèse que tu sais déjà à quelle ligne l’appliquer
  • ensuite tu te pencheras sur le problème de l’exploration ligne par ligne du fichier (avec une boucle) pour voir à quelles lignes devront s’appliquer cette fonction.

Une piste pour la première partie : le plus simple est de partir d’une macro auto-enregistrée :
tu fais Outils > Macro > Nouvelle macro, puis tu fais toutes les manoueuvres que tu as décrites.
ensuite tu arrêtes ton enregistrement, puis par Outils > Macro > Macros > Editer tu nettoies le code pour le rendre indépendant des numéros de ligne et colonne.

ok j’ai avancé et ca marche voici mon code

If [a9] = [c9] Then Exit Sub
If [a9] <> [c9] Then Range(“A9:B9”).Select
Application.CutCopyMode = False
Selection.Insert Shift:=xlDown
Range(“C9:D9”).Select
Selection.Copy
Range(“A9”).Select
ActiveSheet.Paste
Range(“B9”).Select
ActiveCell.FormulaR1C1 = “0”

par contre j’aimerai faire ca pour toute mes cellules
j’ai environ 400 ligne par fichier ca va etre long d’écrire le code
merci pour votre aide

Pour que tu puisses appliquer facilement ton code à chaque ligne du fichier excel, il faut que tu travailles en références relatives et non en références absolues (le choix se fait dans la barre d’outils macro, juste avant le début de l’enregistrement).
Et ensuite tu passes la cellule de référence en argument de ta fonction

Le code devrait plus ou moins ressembler à ce que j’ai mis en gras (pas testé) :
Sub ModifLigne(celRef as Range)
If [a9] = [c9] Then Exit Sub --> If celRef = celRef.offset(0,2) Then Exit Sub
If [a9] <> [c9] Then Range(“A9:B9”).Select
–> le If est inutile, vu que dans le cas contraire on est sorti à la ligne précédente
–> le Range sera intégré directement à la ligne insert
Application.CutCopyMode = False
Selection.Insert Shift:=xlDown --> Range(celRef, celRef.offset(0,1).Insert Shift:=xlShiftDown
ATTENTION : la cellule de référence a été décalée par l’insertion ; la rétablir
set celRef = celRef.offset(-1)
Range(“C99”).Select --> pourquoi C99 ? je croyais qu’on travaillait en ligne ? peut être C9 ?
Selection.Copy --> inutile ; on peut affecter les valeurs directement
Range(“A9”).Select --> celRef.value = celRef.offset(0,2).value
ActiveSheet.Paste --> plus besoin
Range(“B9”).Select --> idem
ActiveCell.FormulaR1C1 = “0”–> pourquoi les guillemets ? celRef.offset(0,1).value = 0
End Sub

Ensuite, tu n’as plus qu’à appliquer une boucle sur l’ensemble des cellules actives de ta colonne A
Sub Principal()
set R = range(“A1”)
While R.value <> “”
ModifLigne R
Set R = R.offset(1)
Wend
End Sub

ok merci mais il faudrai me mettre des commentaire pour toute les lignes je ne comprend pas
je vais essayer d’etre clair dans ma fonction:

il faut que je compare une cellule d’une colone a une autre :
en francais si A1=B1 alors je compare A2 et B2 et si
A2 est différent de B2 alors j’insère UNE CELLULE DEPUIS A2(decalage vers le bas) donc valeur de A2 passe en A3
A2 DEVIENT VIDE et copie B2 en A2 voila !

Non, habituellement, les forums, c’est dans l’autre sens que ça marche :
1- Tu écris ton programme en y incorporant les lignes qu’on t’a données (dans le cas précis ci dessus, tu as déjà toutes les lignes, pas la peine d’en rajouter.
2- Tu testes et tu vois ce qui ne va pas, et tu fais remonter les messages d’erreur, ou les résultats qui ne correspondent pas à ce que tu attends
3- Au passage, tu essaies de comprendre comment fonctionne le programme, et à chaque fois qu’une (ou plusieurs) ligne en particulier te pose problème, tu n’hésites pas à demander de l’aide, mais bien spécifique.

Qu’est qui ne fonctionne pas dans ce que je t’ai donné ?

il faut que je compare une cellule d'une colone a une autre :
en francais si A1=B1 alors je compare A2 et B2 et si
A2 est différent de B2 alors j'insère UNE CELLULE DEPUIS A2(decalage vers le bas) donc valeur de A2 passe en A3
A2 DEVIENT VIDE et copie B2 en A2 voila ! 

Ca n’a plus rien à voir avec ton énoncé d’origine …
Avant, tu avais 4 colonnes et tu comparais les colonnes 1 et 3, maintenant tu n’en as plus que deux …

ok désolé mais je me casse la tete depuis quelque jour et je m’en sort pas oubli mon message précédant!
merci encore pour ton aide , je n’ai toujours pas trouvé je n’arrive pas a faire fonctionner ton code ,
je pense que je vais arrêter de m’acharner , je sais je baisse les bras mais bon c’est pas grave voila merci a toi