VBA Copier Coller sous conditions

Bonjour, Pourriez vous m'aider je suis novice en VBA (je coince à la leçon 3)*

Je souhaiterai faire un export de données du fichier "source" vers le fichier "am" en fonction de la date.

Je m'explique dans le fichier source, j'ai inséré une macro qui rempli automatiquement la date si du texte est rentre en I et/ou M.

J'aurais aimé savoir s'il est possible de créer une macro qui puisse copier et coller toute la ligne (de A à N) dans le classeur AM si et seulement si il s'agit de la date du jour sans en effacer le contenu (tout mettre à la suite).

Je vous remercie pour votre aide.

16source-copie.xlsm (178.76 Ko)
15am-copie.xlsm (22.36 Ko)

Bonjour Jmdetoulouse,

Lorsque l'on compare les entêtes de tes 2 classeurs, il ne semble pas que les colonnes soient à la même place. Ceci complique la recopie des données :

image

Au cas où tu désires conserver ces dispositions, peux-tu préciser les correspondances de colonnes entre les 2 classeurs. Par exemple sous la forme :

image

D'autre part, peux-tu confirmer que c'est la colonne B du classeur "Source" qui déclenche la recopie.

Bonjour Gérard,

Tout d'abord merci de te pencher sur mon problème.

Les colonnes sont quasi en correspondance car dans le dossier AM il y a beaucoup de colonnes cachés.Mais effectivement il faut que la colonne A du fichier source soit collé en premier case à la colonne C du fichier AM.

capture d ecran 2021 10 05 094827

Pour le déclenchement de recopie, il s'agit de la colonne J.

Car j ai une Macro qui horodate le commentaire de la case I.

Encore merci

Bonsoir Jmdetoulouse,

Tu trouveras une proposition en P.J.

Voici ce que j'ai fait :

  • Dans l'onglet "Feuil1" du classeur 'Source', j'ai ajouté une cellule nommée en G13 qui contient le nom complet du classeur cible 'AM' et un bouton pour effectuer sa recherche :
image
  • J'ai aménagé le code de la procédure 'Worksheet_Change' pour déclencher le remplissage du classeur cible avec la macro 'CopieVersAM'.
image
  • J'ai ajouté le module 'GVS' contenant la macro 'CopieVerAM' :
    Sub CopieVersAM(zRange As Range)
        Const cColSource = "A;B;C;D;E;F;G;H;I;J;K;L;M;N"
        Const cColCible = "C;D;E;F;G;H;I;J;K;L;M;N;O;P"
    
        Dim oWBCible As Workbook
        Dim oSheetCible As Worksheet
        Dim oSheetSource As Worksheet
        Dim oCell As Range
        Dim oFS As Object
    
        Dim aColSource() As String
        Dim aColCible() As String
        Dim lRowSource As Long, lRowCible As Long
        Dim sWBName As String
        Dim Name() As String
        Dim i As Integer
    
        sWBName = ThisWorkbook.Names("ClasseurAM").RefersToRange.Value
        Set oFS = CreateObject("Scripting.FileSystemObject")
        If Not oFS.FileExists(sWBName) Then
            MsgBox "Le classeur cible '" & sWBName & "' n'existe pas!", vbCritical, "Traitement impossible"
            Exit Sub
        End If
    
        On Error Resume Next
        Set oWBCible = Application.Workbooks(sWBName)
        If oWBCible Is Nothing Then
            Name = Split(sWBName, "\")
            Set oWBCible = Application.Workbooks.Open(sWBName)
            Windows(Name(UBound(Name()))).Visible = False
        End If
        On Error GoTo 0
    
        aColSource = Split(cColSource, ";")
        aColCible = Split(cColCible, ";")
    
        Set oSheetCible = oWBCible.Worksheets("Données")
    
        'Recupération de la ligne modifiée dans la source
        lRowSource = zRange.Row
    
        'Recherche de la dernière ligne renseignée dans la feuille cible
        Set oCell = oSheetCible.Cells(oSheetCible.Rows.Count, 11).End(xlUp)
        lRowCible = oCell.Row
        lRowCible = lRowCible + 1
    
        'On recopie les cellules une à une
        For i = 0 To UBound(aColCible)
            oSheetCible.Range(aColCible(i) & CStr(lRowCible)).Value = zRange.Worksheet.Range(aColSource(i) & CStr(lRowSource)).Value
        Next
        oWBCible.Save
        oWBCible.Close True
    
    End Sub

Enfin, j'ai ajouté le code suivant dans le module 'Thisworkbook' du classeur 'AM' :

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ActiveWorkbook.Save
    ActiveWorkbook.Saved = True
End Sub

Private Sub Workbook_Open()
    Dim sWBName As String
    Dim Name() As String

    sWBName = ThisWorkbook.Name
    Name = Split(sWBName, "\")
    Windows(Name(UBound(Name()))).Visible = True
End Sub

Pour que tout ça fonctionne, tu dois d'abord remplir toutes les colonnes du classeur 'Source' sauf la colonne "I" que tu dois remplir en dernier. En espérant avoir bien compris ta demande...

Allez le Stade Toulousain !

17jmdetoulouse.zip (171.03 Ko)

Mais comment fais tu ça ?

Où peut on apprendre cela quand on est débutant.

En tout cas un grand merci

j experimente cela demain à la première heure et te tiens au courant

.... Tu m as démasqué en tant que supporter du ST. Sur ça pas de commentaires ce sont des champions autant que toi!

Bonjour Jmdetoulouse,

Tu as tout à fait raison de vouloir te former au VBA et je t'encourage dans cette voie. Cela peut être très utile pour automatiser les tâches et calculs dans EXCEL.

Tu peux commencer par les cours gratuits disponibles sur ce site : https://www.excel-pratique.com/fr/vba.

Beaucoup d'autres formations au VBA (gratuites ou payantes) sont accessibles sur le net.

Mais, comme dans tout apprentissage (le rugby par exemple) un fois les bases acquises, il te faut pratiquer, te planter, buter sur des problèmes et trouver la solution.

Bonjour Gérard,

J'ai mis du temps à répondre car je voulais essayer de résoudre le problème avec mes connaissances mais visiblement je n'en ai toujours pas assez !

Ton fichier marche super bien mais lorsque j'ai voulu compiler avec le fichier original j' ai des erreurs

capture d ecran 2021 10 11 115950

celle ci en premier et lorsque je demande le debogage:

capture d ecran 2021 10 11 120021

Voila ce qui est surligné, là je sèche complètement

Merci à toi ou tout autre personne pouvant m'aider!

Bonjour JmFanduST,

L'erreur que tu rencontres se produit du fait que le code ne trouve pas la cellule nommée : 'ClasseurAM' dans laquelle doit être stocké le dossier et le nom du classeur 'AM'.

As-tu repris ceci dans le classeur 'Source' ? :

image

Si oui, il suffit que tu nommes 'ClasseurAM' la cellule D3 (et nom la G13 comme indiqué par erreur...oups...) en cliquant sur 'Gestionnaire de noms' dans le bandeau 'Formules' :

image

Voilà L'info qu'il me manquait.

J'ai testé vite fait mais cela me semble résolu.

Encore un grand merci pour non pas l'épine sortie du pied mais le tronc d'arbre!!

Au plaisir

Bonjour Gerard penses tu possible de rajouter une ligne de code pour que la cellule A2 de la source soit copié en même temps dans la colonne B de AM ?

Merci

Bonjour Jmdetoulouse,

Oui, c'est possible mais dans ma version de classeur 'Source', A2 est vide. Est-ce bien cette cellule que tu veux copier ?

Oui car elle est appellée à etre rempli ulterieurement il s'agit du MSN

Bonjour Jmdetoulouse,

En ce cas, il te suffit d'ajouter la ligne de code :

        'On recopie MSN
        oSheetCible.Range("B" & CStr(lRowCible)).Value = zRange.Worksheet.Range("A2").Value

dans la boucle de recopie des valeurs module 'CopieAM'. Ce qui donne :

image

Bonjour Gerard, peut on faire en sorte que ce soit la colonne L qui soit le declencheur?

Cdlt

A force de chercher j'ai trouve il fallait juste changer la colonne

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Count > 1 Then Exit Sub

If Not Intersect(Target, Columns(12)) Is Nothing Then

If Target.Offset(0, 1) = "" Then
Target.Offset(0, 1) = Now()
CopieVersAM Target
End If

End If

End Sub

9 en 12

Bonjour je cherche à faire évoluer mon fichier Comme vous pouvez le voir j'air rajouté une colonne (Creat DC) avec une mise en forme conditionelle.

Yes en vert No en rouge.

J'aimerai pouvoir créer une boite de dialogue qui rempli automatiquement la case F avec hoix Yes ou No lorsque J est rempli.

Compliquons le sujet, avec la très belle macro que gérard m'a concoctione, lorsque une case en M est rempli, elle copie vers le fichier AM.

Ma question est il possible de créer sur ce fichier une case par ligne qui lorsqu 'elle est cochée copie sur feuille 1 et décoché la sort automatiquement.

Voilà j'espère m'etre bien exprime en PJ les fichiers

Merci à vous.

11source.xlsm (176.88 Ko)
10am.xlsm (68.24 Ko)
Rechercher des sujets similaires à "vba copier coller conditions"