Excel 2007 : MAJ des lignes de la feuille 2 à partir de la feuil

Fermé
coolmek2014 Messages postés 6 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 25 mars 2014 - 20 mars 2014 à 16:38
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 - 21 mars 2014 à 15:19
Bonjour,


Bonjour,

J'ai un gros fichier Excel (vers les 15000 lignes) composé de 2 feuilles, feuille1 et feuille2:
- feuille1:
Idt AA BB CC Statut
111 azetest defrtest tfretest Oui
113 miracle btesr taiwan
115 azer gthy sdffg
122 reza defrgt fhgj
130 qsdftest zdefrtest fhghtest OUi
145 meknes defrgt aleatoire
180 strasbog szqadefr breve
200 wxcvtest gyjutest fhghtest OUI
235 aze defrgt ghjhjj

feuille2:


Idt AA BB CC
111 aze defr hytfre
115 azer gthy sdffg
122 reza defrgt fhgj
130 qsdf szdefr fhgh
200 wxcv gthyju fhgh
235 aze defrgt ghjhjj

j'ai besoin de mettre à jour les lignes de la feuille 2 en recupérant les lignes de la feuille 1 qui ont le statut "Oui"

ce traitement je le lance une fois par semaine.

Je vous remercie d'avance.
A voir également:

8 réponses

eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
20 mars 2014 à 18:10
Bonjour,

à tester :
Sub maj()
    Dim derlig As Long, lig As Long, col As Long, datas As Variant
    Dim sh1 As Worksheet, sh2 As Worksheet, c As Range, inconnu As Long
    Set sh1 = Sheets("Feuil1")
    Set sh2 = Sheets("Feuil2")

    'recup datas
    With sh1
        derlig = .Cells(Rows.Count, "A").End(xlUp).Row
        datas = .[A2].Resize(derlig - 1, 5)
    End With

    ' traitement
    Application.ScreenUpdating = False
    For lig = 1 To UBound(datas)
        If LCase(datas(lig, 5)) = "oui" Then
            Set c = sh2.[A:A].Find(datas(lig, 1), LookIn:=xlValues, Lookat:=xlWhole)
            If c Is Nothing Then
                inconnu = inconnu + 1
            Else
                For col = 2 To 4
                    sh2.Cells(c.Row, col) = datas(lig, col)
                Next col
            End If
        End If
    Next lig
    If inconnu Then MsgBox inconnu & " références non trouvées."
End Sub 

https://www.cjoint.com/?DCusiXCqa0k
Au cas où, le nombre de références à mettre à jour non trouvées dans feuil2 est annoncé à la fin.

eric
0
coolmek2014 Messages postés 6 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 25 mars 2014
20 mars 2014 à 18:18
merci pour la réponse, mais j'avoue que je n'ai rien compris.
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
20 mars 2014 à 19:31
Tu as ouvert le fichier joint et lancer la macro ?
Si tu ne connais pas lire ça :
https://www.commentcamarche.net/faq/37089-vba-premiers-pas-dans-l-editeur-microsoft-visual-basic-for-applications
et ça :
Mise à jour d'une procédure

Si tu as d'autres questions il faudra ta version d'excel.
eric
0
Slt Eric,

ça l'air de marcher, je vais la terser demain sur le gros fichier excel.

est ce que c'est possible d'insérer les lignes qui n'ont pas le statut "Oui" au lieu de : If inconnu Then MsgBox inconnu & " références non trouvées."

Je te remercie beaucoup Eric et bonne soirée.
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
21 mars 2014 à 09:05
Bonjour,

Comme ça ?
Sub maj()
    Dim derlig As Long, lig As Long, col As Long, datas As Variant
    Dim sh1 As Worksheet, sh2 As Worksheet, c As Range
    Dim cpt1 As Long, cpt2 As Long, inconnu As Long, msg As String
    Set sh1 = Sheets("Feuil1")
    Set sh2 = Sheets("Feuil2")

    'recup datas
    With sh1
        derlig = .Cells(Rows.Count, "A").End(xlUp).Row
        datas = .[A2].Resize(derlig - 1, 5)
    End With

    ' traitement
    Application.ScreenUpdating = False
    For lig = 1 To UBound(datas)
        If LCase(datas(lig, 5)) = "oui" Then
            cpt1 = cpt1 + 1
            Set c = sh2.[A:A].Find(datas(lig, 1), LookIn:=xlValues, Lookat:=xlWhole)
            If c Is Nothing Then
                inconnu = inconnu + 1
            Else
                For col = 2 To 4
                    sh2.Cells(c.Row, col) = datas(lig, col)
                Next col
            End If
        Else
            cpt2 = cpt2 + 1
        End If
    Next lig
    msg = "Oui : " & vbTab & cpt1 & vbLf
    msg = msg & "Autres : " & vbTab & cpt2 & vbLf & vbLf
    msg = msg & "Références 'Oui' non trouvées : " & inconnu
    MsgBox msg
End Sub 

eric
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
coolmek2014 Messages postés 6 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 25 mars 2014
21 mars 2014 à 10:34
merci Eric,

j'ai 2 autres questions stp ,

- J'ai un décalage des colonnes entre les 2 feuilles:

Feuille1 :

ColA ColE ColF ColG
idt info1 info2 info3


Feuille2:

ColA ColB ColC ColD DateMaj
idt info1 info2 info3 Date

- Dans colonne "DateMaJ", je dois mettre la date du jour pour les lignes qui ont été mises à jour.

Est ce que tu peux m'aider à modifier le prog?

Merci beaucoup
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
21 mars 2014 à 11:32
Il faut mettre le fichier correct dès le début...
J'ai un décalage des colonnes entre les 2 feuilles
Avec 'oui' en colH je suppose ?

Sub maj()
    Dim derlig As Long, lig As Long, col As Long, datas As Variant
    Dim sh1 As Worksheet, sh2 As Worksheet, c As Range
    Dim cpt1 As Long, cpt2 As Long, inconnu As Long, msg As String
    Set sh1 = Sheets("Feuil1")
    Set sh2 = Sheets("Feuil2")

    'recup datas
    With sh1
        derlig = .Cells(Rows.Count, "A").End(xlUp).Row
        datas = .[A2].Resize(derlig - 1, 8)
    End With

    ' traitement
    Application.ScreenUpdating = False
    For lig = 1 To UBound(datas)
        If LCase(datas(lig, 8)) = "oui" Then
            cpt1 = cpt1 + 1
            Set c = sh2.[A:A].Find(datas(lig, 1), LookIn:=xlValues, Lookat:=xlWhole)
            If c Is Nothing Then
                inconnu = inconnu + 1
            Else
                sh2.Cells(c.Row, 2) = datas(lig, 5)
                sh2.Cells(c.Row, 3) = datas(lig, 6)
                sh2.Cells(c.Row, 4) = datas(lig, 7)
                sh2.Cells(c.Row, 5) = Now
            End If
        Else
            cpt2 = cpt2 + 1
        End If
    Next lig
    msg = "Oui : " & vbTab & cpt1 & vbLf
    msg = msg & "Autres : " & vbTab & cpt2 & vbLf & vbLf
    msg = msg & "Références 'Oui' non trouvées : " & inconnu
    MsgBox msg
End Sub

J'ai mis date-heure de modif. Changer format de cellule si tu ne veux afficher que la date.

eric
0
coolmek2014 Messages postés 6 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 25 mars 2014
21 mars 2014 à 13:52
Merci Eric,

Il fait quoi ce bout de code Stp ?

datas = .[A2].Resize(derlig - 1, 8)
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
21 mars 2014 à 15:17
Il stocke en mémoire, dans la variable datas, toutes les données sur 8 colonnes.
0
coolmek2014 Messages postés 6 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 25 mars 2014
21 mars 2014 à 14:05
Eric,

une dernière demande,
je vais te joindre un exemple de fichier excel, ou ils sont exactement les collens de la feuille1 et de la feuille2. car je n'arrive pas à les trouver dans le code.
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
21 mars 2014 à 15:19
sh2.Cells(c.Row, 2) = datas(lig, 5)
2 et 5 sont les colonnes
0