Blocage sur une macro

kazede -  
 kazede -
Bonjour à tous,

Je vous expose mon problème, je n'arrive pas à me lancer (je débute en vba).

J'ai une base de donnée à mettre à jour en fonction d'un autre fichier lui aussi mis à jour mais par quelqu'un d'autre.

En gros les choses se presentent de la manière suivante:

Fichier 1:

Colonnes A à G par exemple.

Fichier 2:
Colonne A à Z.

J'ai besoin de comparer les colonnes A du fichier 1 à la colonne A du fichier 2.

La ligne 1 de la colonne A du fichier 1 correspond à (exemple) "abcd".
J'ai besoin de retrouver cette valeur qui peut être sur n'importe qu'elle ligne de la colonne A du fichier 2.

Une fois la valeur "abcd" trouvée dans le fichier 2 en colonne A, j'ai besoin de copier ce qu'il y a dans les cellules H à Z de la ligne ou est trouvée "abcd" (dans le fichier 2) pour ensuite venir les copier en colonne H de mon fichier 1 (sur la bonne ligne bien sur).

Une fois l'opération terminée, je dois passer à la ligne 2 du fichier 1 prendre la valeur et à nouveau scanner la colonne A du fichier 2 pour la retrouver, puis pour copier a nouveau les valeurs correspondantes.

Voila.

J'espère avoir été clair dans mon explication, désolé si ce n'est pas le cas.

Merci d'avance.

Ps: Je ne cherche pas une solution toute faite, j'aime apprendre, me mettre sur la voie m'aiderait tout autant.

Edit: J'ai réussi à faire quelque chose:

Sub test()    
'    
' test Macro    
' Macro enregistrée le 21/02/2011 par a869143    
'    

Application.ScreenUpdating = False    

Sheets("essai").Select    
Dim toto As Range    
Dim Compteur1 As Double    
Dim Compteur2 As Double    
Compteur1 = 0    
Compteur2 = 0    
For Each toto In Range("A2:A20")    
If toto.Value <> "" Then Compteur1 = Compteur1 + 1    
Next    

Range("A2").Select    
donnee1 = ActiveCell    
Sheets("test").Select    
Range("A1").Select    
ActiveCell.Offset(1, 0).Select    
While Compteur2 < Compteur1    

If ActiveCell = donnee1 Then    
Ligne = ActiveCell.Row    
Range("B" & Ligne, "E" & Ligne).Select    
Selection.Copy    
Sheets("essai").Select    
ActiveCell.Offset(0, 1).Select    
ActiveSheet.Paste    
ActiveCell.Offset(1, -1).Select    
donnee1 = ActiveCell    
Sheets("test").Select    
Range("A1").Select    
ActiveCell.Offset(1, 0).Select    
Compteur2 = Compteur2 + 1    
Else    
Sheets("essai").Select    
ActiveCell.Offset(1, 0).Select    
donnee1 = ActiveCell    
Sheets("test").Select    
Range("A1").Select    
ActiveCell.Offset(1, 0).Select    
Compteur2 = Compteur2 + 1    
End If    
Wend    

Application.ScreenUpdating = True    

End Sub   


Seulement quand je fais un pas à pas détaillé, je vois que le problème, c'est qu'une fois que j'ai scanné ma première case sur ma feuille 2 je ne passe pas a la suivante...

Quelqu'un peut m'éclairer?

Edit2: je pense avoir trouvé, mais j'aimerais être sur:

j'ai remplacé le Else par ceci:
Else 
ActiveCell.Offset(1, 0).Select 

Tout simplement, et sa à l'air de fonctionner maintenant...

A voir également:

4 réponses

michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
Bonjour

Ps: Je ne cherche pas une solution toute faite, j'aime apprendre, me mettre sur la voie m'aiderait tout autant.

voici une solution "toute faite": tu progresseras mieux en étudiant des solutions apportées à des problèmes que tu as du mal à résoudre. l'aide en ligne (F1) est très utile pour piger le pourquoi du comment

Option Explicit 

Sub comparer() 
Dim cellule As Range 
Dim lig As Byte, ligne As Byte 

'fige le défilement de l'écran 
Application.ScreenUpdating = False 
With Sheets("essai") 
    For Each cellule In .Range("A2:A20") 
        'utilisation d'une fonction feuille Excel NB.SI --> si la valeur de la cellule est dans la colonneA de "test" 
        If Application.CountIf(Sheets("test").Columns("A"), cellule) > 0 Then 
            'trouve la ligne dans "test" 
            lig = Sheets("test").Columns("A").Find(cellule, Range("A1"), xlValues).Row 
            'ligne de la cellule en cours dans "essais" 
            ligne = cellule.Row 
            'reporte les valeurs test vers essai 
            .Range("H" & ligne & ":Z" & ligne).Value = Sheets("test").Range("H" & lig & ":Z" & lig).Value 
        End If 
    Next 
End With 
End Sub


déjà, note que les select-selection sont bannis...

un tuto qui pourra t'aider
https://bidou.developpez.com/article/VBA/

Michel
1
mic13710 Messages postés 1165 Date d'inscription   Statut Membre Dernière intervention   360
 
Donc finalement, vous n'avez plus besoin d'aide ?

Michel
0
kazede
 
Si.

Je m'aperçois que quand la valeur de ma feuille 1 que j'ai mise dans la variable donnee1 n'est pas présente dans la feuille 2, la macro fait une erreur, et ne termine pas son travail...

Un moyen de gèrer les valeurs non trouvées? Par exemple si donnee1 non trouvée dans la feuille 2, ne rien faire et passer à la valeur de donnee1 suivante.

Je bloque un peu la...

Si quelqu'un voit comment simplifier la macro aussi, je veux bien un coup de main.

Merci.
0
kazede
 
Merci Michel_m,

C'est vrai que d'analyser quelque chose de bien programmé apporte plus qu'un programme fait soit même mais très brouillon. C'est vraiment très propre et cela correspond parfaitement à mes attentes.

Je note ta remarque pour les select-selection.

Ok pour le tuto, j'y vais de ce pas.

Encore merci.

Edit: Dis moi, comment faire pour mettre en évidence les lignes de la feuille 2 qui n'ont pas été copiées dans la feuille 1??

Comment pourrais-je les faire ressortir par exemple en supprimant de la feuille 2 celles qui ont été copiées?
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
comment pourrais-je les faire ressortir par exemple en supprimant de la feuille 2 celles qui ont été copiées?

bin tu connais la ligne et la colonne donc... je te laisse chercher

et à la fin si tu veux supprimer les "trous" sans faire de boucle regarde avec l'enregistreur de macro du coté de "atteindre-cellules" puis de supprimer
0
kazede
 
Je pense avoir trouvé.
Il reste cependant une petite chose à voir, la copie des cellules copie uniquement les valeurs de la plage de cellule, j'aimerais également que la macro copie la mise en forme (texte, couleur, bordure etc). Comment m'y prendre?
Je pense qu'il faut remplacer sur la ligne :
.Range("BH" & ligne & ":CB" & ligne).Value = Sheets("tableau de suivi 2").Range("BA" & lig & ":BV" & lig).Value  

J'ai essayé de remplacer value par Cells, mais sa ne marche pas. Je cherche autre chose...

Ps: ton post avec ta macro a été supprimé ? elle ne s'affiche plus...
0