Copie de cellules d'une feuille à l'autre (Excel 2013)

Bonjour le Forum,

Tout d'abord merci a ceux qui voudront bien m'aider. J'ai parcouru plusieurs forums, sans trouver réellement réponse à ma question. Surtout que je suis sure que c'est très simple à réaliser pour des experts, mais moi... pff je n'y arrive pas.

Voici mon problème à résoudre. Je voudrais par une procédure VBA copier des cellules de ma feuille 1(base) vers ma feuille 2(fiche de production). Mais je ne veux pas copier toute la ligne. Dans ma feuille base, j'ai toutes les données d'un fichier, je souhaiterai pouvoir extraire quelques une des colonnes dans une 2ème feuille de synthèse (fiche de production) qui ne se suivent pas. Cette extraction doit se faire lorsque la valeur de ma cellule K est = à "Terminée". Ma feuille "fiche de production", dans l'idéal s'actualise automatiquement.

Je mets en PJ un tableau exemple, j'ai réduit ce tableau tant en nombre de lignes que de colonnes.

Je cherche, je cherche, je trouve des bouts de codes mais rien ne va. Si quelqu'un pouvait m'aider. Merci beaucoup

Sandrine

Bonsoir,

Je mets en PJ un tableau exemple, j'ai réduit ce tableau tant en nombre de lignes que de colonnes.

Visible où ?

Tu parcours ta base, si la ligne est terminée, tu prrelèves les cellules à prélever pour les affecter à un tableau. Tu ajoutes ainsi au tableau toutes les lignes qui répondent à la condition.

Sur ton feuille cible il ne te reste plus qu'à affecter le tableau (en une seule fois et sans rien copier... )

Il reste des points à préciser : savoir si cela s'ajoute sur la feuille cible à des données déjà présentes, ou si cela les remplace (on efface pour mettre l'extraction).

Egalement si on doit supprimer la mention Terminé sur la feuille source ou quelle autre action destinée le cas échéant à empêcher la duplication de l'opération.

Cordialement.

Merci d'avoir pris le temps de me répondre. Je sais pas quelle mauvaise manip j'ai fait pour que la PJ n'y soit pas...

Pour répondre aux 2 questions ça doit remplacer mes données dans la feuille cible et aucune action ne doit être faite dans la feuille source.

Merci pour votre aide

C'est noté, il ne manque que ton fichier pour matérialiser les références à utiliser...

Bonjour,

Voici un extrait de fichier en question.

Un grand merci et une très bonne journée.

Bonjour,

A confirmer les correspondances entre la fiche de production et la base :

fiche : A B C D <= J M E F base

fiche : E <= pas trouvé de correspondance dans base ?

fiche : F G H <= B G Q base

fiche : I J K L <= R S T U base

fiche : M N O P <= Z AA AB AC base

fiche : Q R S T U => pas d'utilisation ?

Bonjour,

Sans vouloir exiger quoi que ce soit, je tiens à vous préciser, comme dit dans mon 1er post que mon fichier final risque d'être beaucoup plus long que celui présenté. Il peut y avoir plus de colonnes. Il est important pour moi de bien comprendre le code afin de pouvoir faire évoluer ce fichier au besoin.

Je joins un autre fichier avec toutes les colonnes présentes aujourd'hui dans mon fichier avec la concordance.

Dans tous les cas merci encore pour votre aide.

Bonsoir,

Sub TftFichProd()
    Dim Ttm(), ColB, tm%, n%, i%, k%
    ColB = Array(15, 16, 21, 5, 6, 34, 2, 29, 30, 31, 44, 22, 23, 24, 8, 33, 25, 26, 28)
    With Worksheets("Base")
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 3 To n
            If .Cells(i, 11) = "Terminé" Then
                ReDim Preserve Ttm(18, tm)
                If .Cells(i, ColB(0)) <> "" Then Ttm(0, tm) = .Cells(i, ColB(0)).Value2
                For k = 1 To 18
                    If .Cells(i, ColB(k)) <> "" Then Ttm(k, tm) = .Cells(i, ColB(k))
                Next k
                tm = tm + 1
            End If
        Next i
    End With
    With Worksheets("FICHE DE PRODUCTION")
        .Range("A1").CurrentRegion.Offset(1).ClearContents
        .Range("A2").Resize(tm, 19).Value = WorksheetFunction.Transpose(Ttm)
        .Range("A2").Resize(tm).NumberFormat = "dd/mm/yyyy"
    End With
End Sub

pas de difficulté pour comprendre le code :

on établit un tableau des numéros de colonnes de la base à prélever (ColB) : si des adaptations à faire en la matière, il suffit donc de modifier cette liste et d'ajuster le nombre de colonnes (actuellement : 19 col., indices de 0 à 18 !)

on parcourt les lignes de la base (après s'être dimensionné pour cela : n), et on teste sur chaque ligne la cellule en K

si "Terminée", on incrémente un tableau (Ttm) avec la variable tm [1er incrément et 1er indice = 0]

on sert l'élément 0 de la ligne en utilisant la propr. Value2 car il s'agit d'une date (ce qui permet d'éviter des déconvenues...)

on sert les autres en utilisant une boucle et le tableau ColB...

on teste la présence d'une valeur dans la cellule avant affectation au tableau de façon que l'élément reste vide si pas de valeur (évite renvoi de 0 éventuel...)

on incrémente tm

le tableau constitué on passe à la fiche :

on efface les données antérieures

on affecte le tableau (nb de lignes fourni par tm) en le transposant [nous avons un tableau(colonnes, lignes), la partie variable constituant nécessairement sa 2e dimension, en le transposant on rétablit un tableau(lignes, colonnes)...]

on met au format date la 1re colonne au cas où elle ne le serait pas.

Cordialement.

Bonjour et MILLE FOIS MERCI.....

Je viens de le tester, et j'ai bien compris le code..... C'est magnifique !

J'ai juste rajouté un "On Error Resume Next", car si je n'ai pas de critère "Terminée", il me renvoi une erreur.

Maintenant il me reste à continuer l'élaboration de ce fichier.

Très bonne soirée.

Plutôt qu'un On Error... il vaudrait mieux faire :

    ...
    With Worksheets("FICHE DE PRODUCTION")
        .Range("A1").CurrentRegion.Offset(1).ClearContents
        If tm > 0 Then
            .Range("A2").Resize(tm, 19).Value = WorksheetFunction.Transpose(Ttm)
            .Range("A2").Resize(tm).NumberFormat = "dd/mm/yyyy"
        End If
    End With
End Sub

Bonne continuation.

J'ai corrigé, merci.....

Rechercher des sujets similaires à "copie feuille 2013"