Copier/coller sur un autre fichier avec fonction SI ?

Bonjour,

Comment fait on pour copier/coller une ligne d'un fichier à un autre fichier mais que pour certaines références ? ex je veux copier du fichier 1 dans le fichier 2 les références réf1 réf5 et réf10 ?

Si quelqu'un pouvait m'aider ce serait sympa, merci

Bonjour,

Un fichier pour illustrer ton problème serait plus que bienvenu. Je suppose que tes références sont stockées dans une colonne particulière de ton classeur ? Et pour te proposer une macro adaptée, il nous faudrait les noms et chemins d'accès et 2 documents concernés (document source et document de destination).

Bonjour Pedro,

merci de prendre le temps de m'aider. ci-joint les 2 fichiers. Les références spécifiques qui doivent être collées dans le fichier à Alimenter sont dans l'onglet réf articles. Les réf spécifiques à copier/coller sont dans le fichier ventes de la colonne P à U.

1fichier-ventes.xlsx (417.78 Ko)

Visiblement c'est plus compliqué que de copier des lignes, puisque tes tableaux n'ont ni le même nombre de colonnes, ni le même contenu. Que doit-on copier exactement de l'onglet "ventes" vers l'onglet "RECAP" ?

Voilà le code VBA que j'ai réalisé à partir de tes explications, mais comme celles-ci, il est incomplet...

Sub CopieRef()

Nlig As Integer, Ncol As Integer, Lmax As Integer, RefMax As Integer, Lref As Integer, DerLig As Integer, Source As Workbook, Destination As Workbook

Set Source = ActiveWorkbook 'Fichier source
Set Destination = "Fichier à alimenter.xlsx" 'Fichier cible

With Source.Sheets("ventes")
    Lmax = .Range("A" & Rows.Count).End(xlUp).Row 'Dernière ligne utilisée du fichier source
    RefMax = Destination.Sheets("REF ARTICLES").Range("A" & Rows.Count).End(xlUp).Row 'Dernière ligne utilisée du fichier cible (REF ARTICLES)
    DerLig = Destination.Sheets("RECAP").Range("A" & Rows.Count).End(xlUp).Row 'Dernière ligne utilisée du fichier cible (RECAP)
    For Nlig = 2 To Lmax 'Boucle pour parcourir les lignes du tableau "ventes"
        For Ncol = 16 To 21 'Boucle pour parcourir les colonnes "P" à "U" du tableau "ventes"
            If Not IsEmpty(.Cells(Nlig, Ncol)) Then
                For Lref = 1 To RefMax 'Boucle pour parcourir les références d'intérêt
                    If .Cells(Nlig, Ncol) = Destination.Sheets("REF ARTICLES").Cells(Lref, 1) Then
                        'MANQUE : instructions précises pour savoir quelles données copier
                        DerLig = DerLig + 1
                        Destination.Sheets("RECAP").Cells(DerLig, 1) = .Cells(Nlig, 1) 'Date
                        Destination.Sheets("RECAP").Cells(DerLig, 2) = 0
                        Destination.Sheets("RECAP").Cells(DerLig, 3) = 0
                        Destination.Sheets("RECAP").Cells(DerLig, 4) = 0
                        Destination.Sheets("RECAP").Cells(DerLig, 5) = .Cells(Nlig, Ncol) 'Ref article
                        Destination.Sheets("RECAP").Cells(DerLig, 6) = 0
                        Destination.Sheets("RECAP").Cells(DerLig, 7) = 0
                        Destination.Sheets("RECAP").Cells(DerLig, 8) = 0
                        Exit For
                    End If
                Next Lref
            End If
        Next Ncol
    Next Nlig
End With

End Sub

Voila j'ai fait un tableau identique pour les 2 fichiers et je cacherai les colonnes qui ne sont pas nécessaires dans le Fichier à Alimenter.

Il faut qu'à chaque vente d'une référence spécifique que la ligne vienne se copier. Je te renvoi le tableau A alimenter modifié.

(liste des références dans onglet REF ARTICLES)

0fichier-ventes.xlsx (417.78 Ko)

Dans le cas où tu copies toute une ligne, utilise l'instruction suivante à la place des 8 instructions similaires du code précédent :

.Rows(Nlig).Copy Destination.Sheets("RECAP").Rows(DerLig)

Mais si j'ai compris ta problématique, si tu as 5 références article dans une ligne de ton fichier de ventes, cela devient 5 lignes dans ton fichier RECAP. Donc je pense que copier une ligne entière à chaque fois n'est pas une bonne idée...

si parce ce qu' on copie une ligne à l'horizontal donc si j'ai par exemple fait une vente avec 2 références articles (6 max) et comme maintenant les tableaux sont identiques, une seule ligne sera copiée... enfin je pense

Tel que le code est conçu, une ligne sera copiée autant de fois qu'il y a de référence article valide, c'est à dire 6 fois au maximum.

Tout ça pour dire que la première version de ton fichier et du code était peut-être la plus adaptée, mais dans ce cas il faut compléter le code pour inscrire les bonnes infos au bon endroit.

Ok alors dans ces cas là, est ce que je peux coller uniquement la colonne Nom et Référence... ça ne serait pas plus simple ?

Je suppose que tu n'as fait que survoler mes réponses, car depuis le début je te demande quelles informations tu souhaites récupérer. Je suppose également que tu n'as pas essayé de comprendre le code que je t'ai proposé car il suffisait de compléter 2 instructions (remplacer "= 0" par "= la cellule où se trouve ton info" pour réaliser ce que tu demandes...

Voilà donc le code révisé d'après ce que j'ai compris de ton besoin :

Sub CopieRef()

Dim Nlig As Integer, Ncol As Integer, Lmax As Integer, RefMax As Integer, Lref As Integer, DerLig As Integer, Source As Workbook, Destination As Workbook

Set Source = ActiveWorkbook
Set Destination = Workbooks("Fichier à alimenter.xlsx")

With Source.Sheets("ventes")
    Lmax = .Range("A" & Rows.Count).End(xlUp).Row
    RefMax = Destination.Sheets("REF ARTICLES").Range("A" & Rows.Count).End(xlUp).Row
    DerLig = Destination.Sheets("RECAP").Range("A" & Rows.Count).End(xlUp).Row
    For Nlig = 2 To Lmax 'Boucle pour parcourir les lignes du tableau "ventes"
        For Ncol = 16 To 21 'Boucle pour parcourir les colonnes "P" à "U" du tableau "ventes"
            If Not IsEmpty(.Cells(Nlig, Ncol)) Then
                For Lref = 1 To RefMax 'Boucle pour parcourir les références d'intérêt
                    If .Cells(Nlig, Ncol) = Destination.Sheets("REF ARTICLES").Cells(Lref, 1) Then
                        DerLig = DerLig + 1
                        Destination.Sheets("RECAP").Cells(DerLig, 1) = .Cells(Nlig, 1) 'Date
                        'Destination.Sheets("RECAP").Cells(DerLig, 2) = 0
                        Destination.Sheets("RECAP").Cells(DerLig, 3) = .Cells(Nlig, 4) & " " & .Cells(Nlig, 3) 'Nom + prénom
                        'Destination.Sheets("RECAP").Cells(DerLig, 4) = 0
                        Destination.Sheets("RECAP").Cells(DerLig, 5) = .Cells(Nlig, Ncol) 'Ref article
                        Destination.Sheets("RECAP").Cells(DerLig, 6) = Destination.Sheets("REF ARTICLES").Cells(Lref, 2) 'Nom de la référence
                        'Destination.Sheets("RECAP").Cells(DerLig, 7) = 0
                        'Destination.Sheets("RECAP").Cells(DerLig, 8) = 0
                        Exit For
                    End If
                Next Lref
            End If
        Next Ncol
    Next Nlig
End With

End Sub

Il n'y a pas de copié/coller dans ce code. La valeur de chaque cellule d'intérêt du tableau "ventes" est reportée dans la cellule correspondante du tableau "RECAP". Précision utile : le fichier à alimenter doit-être au préalable ouvert.

J'essaie de comprendre mais pour une novice comme moi c'est un peu dur. En fait je crois que je m'explique très mal et du coup on ne comprend pas ma demande. Alors voila je vais faire simple

A chaque référence (voir onglet REF ARTICLE il y en a une quinzaine environ) saisie dans le fichier ventes, les colonnes date, Audio, et référence doivent se copie sur le fichier à Alimenter.

Est ce que c'est plus clair pour toi ?

Je renvoi mes fichiers. Merci

1fichier-recap.xlsb (11.44 Ko)
1fichier-ventes.xlsx (414.51 Ko)

J'essaie de comprendre mais pour une novice comme moi c'est un peu dur. En fait je crois que je m'explique très mal et du coup on ne comprend pas ma demande. Alors voila je vais faire simple

A chaque référence (voir onglet REF ARTICLE il y en a une quinzaine environ) saisie dans le fichier ventes, les colonnes date, Audio, et référence doivent se copie sur le fichier à Alimenter.

Est ce que c'est plus clair pour toi ?

J'ai bien compris, mais pour commencer, il n'y a pas de colonne "Audio" dans ton fichier ventes. Pour le reste, c'est déjà ce que le code que je t'ai envoyé est censé faire. L'as-tu testé ? Aussi, comme on a tous été débutant un jour, s'il n'est pas suffisamment clair, redis-moi.

Bonjour Pedro,

Dans quel fichier est ce que je dois mettre le script ? Je l'ai mis dans le fichier de Ventes et j'ai un message d'erreur (en pj)

Merci de ton aide

message erreur

Bonjour,

Envoie moi ton fichier avec macro au format ".xlsm".

Bonjour Kassou, Pedro,

j'ai vu ta copie d'écran ; pour ta ligne en bleu, il manque Dim devant ! Dim NLig As Integer...

tant que j'y suis, tu devrais corriger des types ! ce serait plutôt :

Dim Nlig As Long, Ncol As Byte, Lmax As Long, RefMax As Long, Lref As Long, DerLig As Long, Source As Workbook, Destination As Workbook

OU en notation abrégée :

Dim Nlig&, Ncol As Byte, Lmax&, RefMax&, Lref&, DerLig&, Source As Workbook, Destination As Workbook

note qu'en général, c'est le type Long pour une ligne et Integer pour une colonne ; mais comme ton Ncol va de 16 à 21, un Byte suffit ; s'il avait fallu NCol As Integer, tu aurais pu l'abréger en Ncol%


attention : tu as mis Set Destination = "Fichier à alimenter.xlsx"

* soit c'est ça et faut mettre Dim Destination As String OU Dim Destination$

* soit faut mettre Set Destination = Workbooks("Fichier à alimenter.xlsx")

(j'me suis pas plongé dans ton code en détail ! )


@Pedro : t'as oublié d'prendre ton café ?

dhany

@Pedro : t'as oublié d'prendre ton café ?

Ca doit être ça ! J'ai modifié mon script...

@Pedro

oui, ça j'te comprends ; c'est pareil pour moi ! mais là, j'ai regardé la sub car elle était pas très longue.


edit :

t'as modifié ton post : t'avais écrit que tu préfères éviter d'regarder le code VBA d'une copie d'écran.

dhany

Rechercher des sujets similaires à "copier coller fichier fonction"