Problème importation ligne en VBA

Bonjour à tous,

Voilà j'ai une macro qui me permet d'exporter des lignes situées dans plusieurs onglets (les mois de l'année) vers un autre onglet de réception appelé "codage". Jusque là tout fonctionne.

Le problème, c'est qu'à chaque fois que j'appuie sur le bouton "Importer", il répète l'importation. Du coup, sur l'onglet "codage", je me retrouve avec des lignes en double ou en x fois que j'appuie sur le bouton.

En fait, je souhaiterais que si j'appuie sur le bouton "Importer", cela importe que les lignes qui ne sont pas présentent dans l'onglet de réception appelé "codage". Ligne présente --> pas d'importation. Ligne absente --> importation.

Ainsi, j'éviterais des doublons de lignes.

Merci à tous

Sub ImporterCodage()
    Application.ScreenUpdating = False
    Range("F15").CurrentRegion.Offset(2, 0).ClearContents
    listeF = Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre")

    For Each nom In listeF
        derln = Sheets(nom).UsedRange.Rows.Count
        If derln > 3 Then
            For i = 4 To derln
                If Sheets(nom).Range("F" & i) = "Codage" Then
                    lgn = Application.Max(5, Sheets("Codage").Range("F" & Rows.Count).End(xlUp)(2).Row)
                    Sheets(nom).Range("B" & i & ":L" & i).Copy Sheets("Codage").Range("B" & lgn)
                End If
            Next i
        End If
    Next nom
End Sub

Bonjour,

Il faut voir en fonction de ton fichier sur quelle colonne on va pouvoir identifier les doublons éventuels.

Y a-t-il une clef d'index sans doublons ?

Fournir le classeur KIVABIEN avec.

A+

Voilà,

J'ai mis un modèle.

Merci

10modele.xlsm (339.64 Ko)

Je voulais préciser qu'il n'est pas question ici de doublons de valeur (en lignes ou en colonnes) mais de doublons de lignes. Il ne faut pas importer la même ligne 2 fois.

Un modèle vide n'est pas d'une grande utilité...

S'il n'y a aucune clef d'index je pense que la seule solution est de mettre un drapeau colonne A (ou AF...) à chaque fois qu'une ligne est copiée et de modifier la condition :

If Sheets(nom).Range("F" & i) = "Codage" and Not Sheets(nom).Range("AF" & i) = "X" Then
Sheets(nom).Range("B" & i & ":L" & i).Copy Sheets("Codage").Range("B" & lgn)
Sheets(nom).Range("AF" & i) = "X"
End if

A+

Merci,

Je me suis mal exprimé, la ligne doit être copiée que si le mot "Test" figure dans la cellule "Catégorie" colonne F.

Si le mot "Test" y figure alors toute la ligne de B à L doit être copié, peu importe que les autres cellules B, C, D, E, G, H, J, K ou L soient vides ou pleines. D'ailleurs, c'est pour cela que mon modèle est presque vide, ce qui compte c'est de copier les lignes contenant le mot "Test" en colonne F. Et de les importer qu'une seule fois. Ou autrement, ne pas recopier les lignes qui ont déjà été importées.

Exemple :

si le mot "Test" figure en F15, alors importer toute la ligne 15 de B à L.

S'il le mot n'y figure pas, alors ne rien copier de la ligne.

Une fois que cette ligne a été copié, alors ne plus recopier la même ligne quand je clique sur "Importer".

Si je clique sur "Effacer", alors tout s'efface et l'opération d'importation peut se réaliser à nouveau

8modele.xlsm (340.82 Ko)

Salut le fil

C'est bien ce que t'as donné Galopin01

For Each nom In listeF
        derln = Sheets(nom).UsedRange.Rows.Count
        If derln > 3 Then
            For i = 4 To derln
               'Ici on teste la valeur  de F15 par exemple et de AF le fameux flag dont te parle Galopin
                If Sheets(nom).Range("F" & i) = "Test" And Not Sheets(nom).Range("AF" & i) = "X" Then
                    'On fait la copie
                    Sheets(nom).Range("B" & i & ":L" & i).Copy Sheets("Codage").Range("B" & lgn)
            ' si on a fait la copie on met un flag dans AF pour ne pas recopier
                    Sheets(nom).Range("AF" & i) = "X"
                End If
            Next i
        End If
    Next nom

Bonsoir à tous,

Si j'ai insisté, c'est que cela ne fonctionnait pas.

Mais au final, cela fonctionne parfaitement !

C'est juste que dans vos réponses à tous les deux, il manquait la ligne :

lgn = Application.Max(5, Sheets("Codage").Range("F" & Rows.Count).End(xlUp)(2).Row)

Et maintenant, c'est parfait !

Merci d'avoir insisté !

Vraiment merci

Merci Galopin et merci aussi à Jean-Paul.

Je marque le sujet comme résolu

Rechercher des sujets similaires à "probleme importation ligne vba"