[Resolu] Recopie conditionnelle depuis plusieurs classeurs

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

fb62840

XLDnaute Impliqué
Bonjour à toutes et à tous,

J'aimerais réussir à recopier sur 3 onglets du classeur Recap le contenu présents dans plusieurs classeurs sous conditions.

Sur l'onglet R1 je souhaiterais ne recopier que les lignes dans lesquelles on trouve en colonne D une date avec un retard jusqu'à 1 mois

Sur l'onglet R2 les lignes dans lesquelles on trouve en colonne D une date avec un retard compris plus d'1 mois et jusqu'à 3 mois

Sur l'onglet R3 les lignes dans lesquelles on trouve en colonne D une date avec un retard supérieur à 3 mois

Merci pour votre aide c'est assez urgent
 

Pièces jointes

Dernière édition:
Re : Recopie conditionnelle depuis plusieurs classeurs

Bonjour,

Voir fichier joint, j'ai traiter les différences de date en nombre de jour <0, 1 à 30, 31 à 90, au-delà.
Les fichiers doivent être dans le même répertoire et s'appeler "CONSO aaaa.xls"
Traitement des fichier 1 à 1 avec demande préalable de l'année concernée.

A+
 
Re : Recopie conditionnelle depuis plusieurs classeurs

Bonjour,

Voir fichier joint, j'ai traiter les différences de date en nombre de jour <0, 1 à 30, 31 à 90, au-delà.
Les fichiers doivent être dans le même répertoire et s'appeler "CONSO aaaa.xls"
Traitement des fichier 1 à 1 avec demande préalable de l'année concernée.

A+

Merci beaucoup, ça va permettre d'avancer si on parvient à régler une erreur.

A l'exécution avec votre proposition j'ai une erreur sur la ligne :
Code:
With shSource.Cells(lig, 7)
C'est une erreur d'exécution 91 Variable ou objet de bloc with non défini.

J'ai placé les deux fichiers que je souhaite tester dans le même dossier du fichier qui lance la macro.
 
Re : Recopie conditionnelle depuis plusieurs classeurs

Re,

J'ai trouvé l'erreur:

Mettre: Set shSource = Nothing
après la ligne : Next lig
et non avant comme je l'ai Fait
Code:
Sub Traitement(ByVal an As Integer)
Dim wkSource As Workbook, shDest As Worksheet, shSource As Worksheet
Dim lig As Long, dif As Integer, idxFeuille As Integer
    
    'Récupérer le fichier idoine ou sortir
    Set wkSource = GetWorkbook("Conso " & an & ".xls", True, ThisWorkbook.Path)
    If wkSource Is Nothing Then Exit Sub
    
    'Récupérer la feuille source ou sortir
    Set shSource = GetSheet(CStr(an), wkSource, True)
    If shSource Is Nothing Then Exit Sub
    
    'Traiter les données de la feuille source de la ligne 2 à n
     For lig = 2 To shSource.Cells(Rows.Count, 1).End(xlUp).Row
        
        'travailler à partir de la feuille source
        With shSource.Cells(lig, 7)
            If IsDate(.Value) Then
                    'établir un index de nom de feuille suivant la valeur de dif
                    dif = Date - .Value
                    idxFeuille = (((dif <= 0) * 0) + ((dif >= 1 And dif <= 30) * 1) + ((dif >= 31 And dif <= 90) * 2) + ((dif > 90) * 3)) * -1
                    
                    'Récupérer la feuille destination en fonction de son index
                    Set shDest = GetSheet("R" & idxFeuille, ThisWorkbook, False)
                    
                    If Not shDest Is Nothing Then
                        'Copier les valeur de la ligne source dans la feuille destination
                        shDest.Cells(Rows.Count, 1).End(xlUp)(2).Resize(, 8).Value = .Cells(lig, 1).Resize(, 8).Value
                    End If
            End If
        End With
    Next lig
    Set shSource = Nothing
    'fermer le classeur source et réinitialiser sa variable
    wkSource.Close False
    Set wkSource = Nothing
    
End Sub
A+
 
Dernière modification par un modérateur:
Re : Recopie conditionnelle depuis plusieurs classeurs

Super,

Merci Beaucoup, cela va me retirer une énorme épine du pied...

Bonne soirée

Re,

J'ai trouvé l'erreur:

Mettre: Set shSource = Nothing
après la ligne : Next lig
et non avant comme je l'ai Fait
Code:
Sub Traitement(ByVal an As Integer)
Dim wkSource As Workbook, shDest As Worksheet, shSource As Worksheet
Dim lig As Long, dif As Integer, idxFeuille As Integer
    
    'Récupérer le fichier idoine ou sortir
    Set wkSource = GetWorkbook("Conso " & an & ".xls", True, ThisWorkbook.Path)
    If wkSource Is Nothing Then Exit Sub
    
    'Récupérer la feuille source ou sortir
    Set shSource = GetSheet(CStr(an), wkSource, True)
    If shSource Is Nothing Then Exit Sub
    
    'Traiter les données de la feuille source de la ligne 2 à n
     For lig = 2 To shSource.Cells(Rows.Count, 1).End(xlUp).Row
        
        'travailler à partir de la feuille source
        With shSource.Cells(lig, 7)
            If IsDate(.Value) Then
                    'établir un index de nom de feuille suivant la valeur de dif
                    dif = Date - .Value
                    idxFeuille = (((dif <= 0) * 0) + ((dif >= 1 And dif <= 30) * 1) + ((dif >= 31 And dif <= 90) * 2) + ((dif > 90) * 3)) * -1
                    
                    'Récupérer la feuille destination en fonction de son index
                    Set shDest = GetSheet("R" & idxFeuille, ThisWorkbook, False)
                    
                    If Not shDest Is Nothing Then
                        'Copier les valeur de la ligne source dans la feuille destination
                        shDest.Cells(Rows.Count, 1).End(xlUp)(2).Resize(, 8).Value = .Cells(lig, 1).Resize(, 8).Value
                    End If
            End If
        End With
    Next lig
    Set shSource = Nothing
    'fermer le classeur source et réinitialiser sa variable
    wkSource.Close False
    Set wkSource = Nothing
    
End Sub
A+
 
Re : Recopie conditionnelle depuis plusieurs classeurs

Je suis allé un peu vite...

En fait le code ne fait que recopier le contenu de 2 colonnes et c'est étonnant car il copie la colonne 7 et la colonne 8

Je suppose que c'est cette portion de code qui est à corriger mais je ne sais pas comment :

Code:
If Not shDest Is Nothing Then
shDest.Cells(Rows.Count, 1).End(xlUp)(2).Resize(, 8).Value = .Cells(lig, 1).Resize(, 8).Value
End If


[quote="Hasco, post: 1324481"]Re,

J'ai trouvé l'erreur:

Mettre: Set shSource = Nothing
après la ligne : Next lig
et non avant comme je l'ai Fait
[CODE]Sub Traitement(ByVal an As Integer)
Dim wkSource As Workbook, shDest As Worksheet, shSource As Worksheet
Dim lig As Long, dif As Integer, idxFeuille As Integer
    
    'Récupérer le fichier idoine ou sortir
    Set wkSource = GetWorkbook("Conso " & an & ".xls", True, ThisWorkbook.Path)
    If wkSource Is Nothing Then Exit Sub
    
    'Récupérer la feuille source ou sortir
    Set shSource = GetSheet(CStr(an), wkSource, True)
    If shSource Is Nothing Then Exit Sub
    
    'Traiter les données de la feuille source de la ligne 2 à n
     For lig = 2 To shSource.Cells(Rows.Count, 1).End(xlUp).Row
        
        'travailler à partir de la feuille source
        With shSource.Cells(lig, 7)
            If IsDate(.Value) Then
                    'établir un index de nom de feuille suivant la valeur de dif
                    dif = Date - .Value
                    idxFeuille = (((dif <= 0) * 0) + ((dif >= 1 And dif <= 30) * 1) + ((dif >= 31 And dif <= 90) * 2) + ((dif > 90) * 3)) * -1
                    
                    'Récupérer la feuille destination en fonction de son index
                    Set shDest = GetSheet("R" & idxFeuille, ThisWorkbook, False)
                    
                    If Not shDest Is Nothing Then
                        'Copier les valeur de la ligne source dans la feuille destination
                        shDest.Cells(Rows.Count, 1).End(xlUp)(2).Resize(, 8).Value = .Cells(lig, 1).Resize(, 8).Value
                    End If
            End If
        End With
    Next lig
    Set shSource = Nothing
    'fermer le classeur source et réinitialiser sa variable
    wkSource.Close False
    Set wkSource = Nothing
    
End Sub
A+[/QUOTE]
 
Re : Recopie conditionnelle depuis plusieurs classeurs

Bonjour,

C'est sans doute cela, bien qu'après vérification, chez moi cela fonctionne.

Méthode pour comprendre d'où vient le problème:
1 mettre les plages source et destination en Variables *
2 afficher leur adresse respectives

Code:
Dim plgSource as range, plgDest As Range
set plgDest =shDest.Cells(Rows.Count, 1).End(xlUp)(2).Resize(, 8)
Set plgSource = .Cells(lig, 1).Resize(, 8)
MsgBox "Plage Source: [" & plgSource.Parent.Parent.Name & "]" & plgSource.Parent.name & "!" & plgSource.address & vbcrlf & _
            "Plage Destination: [" & plgDest.Parent.Parent.Name & "]" & plgDest.Parent.name & "!" & plgDest.Adress

plgDest.Value= plgSource.Value

A+
 
Re : Recopie conditionnelle depuis plusieurs classeurs

C'est une bonne idée en effet,

Le code bloque ici sur .Cells avec erreur "Erreur de compilation, référence incorrecte ou non qualifiée".
Code:
Set plgSource = .Cells(lig, 1).Resize(, 8)


Bonjour,

C'est sans doute cela, bien qu'après vérification, chez moi cela fonctionne.

Méthode pour comprendre d'où vient le problème:
1 mettre les plages source et destination en Variables *
2 afficher leur adresse respectives

Code:
Dim plgSource as range, plgDest As Range
set plgDest =shDest.Cells(Rows.Count, 1).End(xlUp)(2).Resize(, 8)
Set plgSource = .Cells(lig, 1).Resize(, 8)
MsgBox "Plage Source: [" & plgSource.Parent.Parent.Name & "]" & plgSource.Parent.name & "!" & plgSource.address & vbcrlf & _
            "Plage Destination: [" & plgDest.Parent.Parent.Name & "]" & plgDest.Parent.name & "!" & plgDest.Adress

plgDest.Value= plgSource.Value

A+
 
Re : Recopie conditionnelle depuis plusieurs classeurs

Re,

Voici la sub Traitement modifiée:

Code:
Sub Traitement(ByVal an As Integer)
Dim wkSource As Workbook, shDest As Worksheet, shSource As Worksheet
Dim plgSource As Range, plgDest As Range
Dim lig As Long, dif As Integer, idxFeuille As Integer
    'Récupérer le fichier idoine ou sortir
    Set wkSource = GetWorkbook("Conso " & an & ".xls", True, ThisWorkbook.Path)
    If wkSource Is Nothing Then Exit Sub
    'Récupérer la feuille source ou sortir
    Set shSource = GetSheet(CStr(an), wkSource, True)
    If shSource Is Nothing Then Exit Sub
    'Traiter les données de la feuille source de la ligne 2 à n
    For lig = 2 To shSource.Cells(Rows.Count, 1).End(xlUp).Row
        'travailler à partir de la feuille source
        With shSource.Cells(lig, 7)
            If IsDate(.Value) Then
                'établir un index de nom de feuille suivant la valeur de dif
                dif = Date - .Value
                idxFeuille = (((dif <= 0) * 0) + ((dif >= 1 And dif <= 30) * 1) + ((dif >= 31 And dif <= 90) * 2) + ((dif > 90) * 3)) * -1
                'Récupérer la feuille destination en fonction de son index
                Set shDest = GetSheet("R" & idxFeuille, ThisWorkbook, False)
                If Not shDest Is Nothing Then
                    shDest.Cells(Rows.Count, 1).End(xlUp)(2).Resize(, 8).value =  shSource.Cells(lig, 1).Resize(, 8).value
                End If
            End If
        End With
    Next lig
    Set shSource = Nothing
    'fermer le classeur source et réinitialiser sa variable
    wkSource.Close False
    Set wkSource = Nothing
End Sub

A+
 
Dernière modification par un modérateur:
Re : Recopie conditionnelle depuis plusieurs classeurs

Bravo, cette fois ci tout se passe comme il convient.

Un énorme merci pour cet excellent travail.

Bonne soirée

Re,

Voici la sub Traitement modifiée:

Code:
Sub Traitement(ByVal an As Integer)
Dim wkSource As Workbook, shDest As Worksheet, shSource As Worksheet
Dim plgSource As Range, plgDest As Range
Dim lig As Long, dif As Integer, idxFeuille As Integer
    'Récupérer le fichier idoine ou sortir
    Set wkSource = GetWorkbook("Conso " & an & ".xls", True, ThisWorkbook.Path)
    If wkSource Is Nothing Then Exit Sub
    'Récupérer la feuille source ou sortir
    Set shSource = GetSheet(CStr(an), wkSource, True)
    If shSource Is Nothing Then Exit Sub
    'Traiter les données de la feuille source de la ligne 2 à n
    For lig = 2 To shSource.Cells(Rows.Count, 1).End(xlUp).Row
        'travailler à partir de la feuille source
        With shSource.Cells(lig, 7)
            If IsDate(.Value) Then
                'établir un index de nom de feuille suivant la valeur de dif
                dif = Date - .Value
                idxFeuille = (((dif <= 0) * 0) + ((dif >= 1 And dif <= 30) * 1) + ((dif >= 31 And dif <= 90) * 2) + ((dif > 90) * 3)) * -1
                'Récupérer la feuille destination en fonction de son index
                Set shDest = GetSheet("R" & idxFeuille, ThisWorkbook, False)
                If Not shDest Is Nothing Then
                    shDest.Cells(Rows.Count, 1).End(xlUp)(2).Resize(, 8).value =  shSource.Cells(lig, 1).Resize(, 8).value
                End If
            End If
        End With
    Next lig
    Set shSource = Nothing
    'fermer le classeur source et réinitialiser sa variable
    wkSource.Close False
    Set wkSource = Nothing
End Sub

A+
 
Re : [Resolu] Recopie conditionnelle depuis plusieurs classeurs

Re,

Je t'en prie.

P.S. ce n'est peut-être pas très utile de mettre systematiquement la citation de mes posts précédents dans tes réponses. Généralement, vu mon grand âge, j'arrive à me souvenir encore assez bien de ce que j'ai dis...arf😉

Clique sur le lien 'Répondre' et non 'Répondre avec citation' ou plus bas sur le bouton 'Aller en mode avancé'

A+ et bonne soirée
 
Re : [Resolu] Recopie conditionnelle depuis plusieurs classeurs

Bonjour,

Merci pour ce conseil.

J'ai testé l'application avec deux fichiers test.
(j'ai ajouté le code permettant de faire le choix du fichier à ouvrir - sans doute de façon un peu maladroite mais ça fonctionne, l'idéal serait qu'il demande tout d'abord le nom du fichier à ouvrir, ensuite l'année)

Le code s'exécute mais après vérification, certaines lignes ne se retrouvent pas là où elles devrait.
Pour le vérifier j'ai ajouté 2 colonne l'une permettant de connaître le nombre de mois de retard et l'autre permettant de connaître l'onglet de destination.

Normalement toutes les lignes devraient être reprises sur le fichier Recap. Ce n'est pas le cas.

Je place en pièce-jointe les 3 fichiers (Recap et 2 fichiers avec les données à reporter pour 2011 et 2012)
 

Pièces jointes

Re : [Resolu] Recopie conditionnelle depuis plusieurs classeurs

Bonjour,

Comme je te le disais au post#2, j'ai traité l'écart de dates en nombre de jours, 1 mois = 30 jrs(comme on le fait souvent en matière d'échéance), ce qui est différent que de le traiter en nombre de mois stricts avec une fonction comme DateDiff.

Ex: 1/2/2012 et le 1/3/2012 considères-tu cela comme 1 mois?
Peut-être ceci entraine-t-il cela?
A toi de définir exactement le mois et d'essayer différent test.
Si tu as difficultés, reviens avec tes essais VBAïstiques


A+
 
Dernière modification par un modérateur:
Re : [Resolu] Recopie conditionnelle depuis plusieurs classeurs

Bonjour,

Je pensais que tu ne répondrais pas puisque j'ai "clos" le sujet en le qualifiant de résolu.

J'ai examiné la rédaction du code et effectivement j'étais arrivé à la conclusion que le calcul se faisait en nombre de jours.

J'ai corrigé une partie de cette ligne de code, et j'obtiens bien le placement sur la feuille R1 des données qui doivent s'y trouver.
Code:
idxFeuille = (((dif <= 0) * 1) + ((dif >= 1 And dif <= 30) * 1) + ((dif >= 31 And dif <= 90) * 2) + ((dif > 90) * 3)) * -1

Ce qui manque ce sont toutes les lignes qui devraient se trouver en R3 je suppose donc que c'est la partie
((dif > 90) * 3)) * -1
Qui pose problème mais je ne comprends pas pourquoi il faut multiplier par -1
 
Re : [Resolu] Recopie conditionnelle depuis plusieurs classeurs

Re,
Code:
'travailler à partir de la feuille source
        With shSource.Cells(lig, 7)
            If IsDate(.Value) Then
                dif = DateDiff("m", DateSerial(Year(.Value), Month(.Value), Day(.Value)), Date)
                If dif <= 0 Then
                    Set shDest = ThisWorkbook.Sheets("R0")
                ElseIf  dif <= 1 Then
                    Set shDest = ThisWorkbook.Sheets("R1")
                ElseIf dif > 1 And dif <= 3 Then
                    Set shDest = ThisWorkbook.Sheets("R2")
                ElseIf dif > 3 Then
                    Set shDest = ThisWorkbook.Sheets("R3")
                End If
                If Not shDest Is Nothing Then
                    shDest.Cells(Rows.Count, 1).End(xlUp)(2).Resize(, 8).Value = _
                        shSource.Cells(lig, 1).Resize(, 8).Value
                End If
            End If
        End With
A+
 
Dernière modification par un modérateur:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour