Copier les tableaux contenant les dates vers une feuille

Moataz_

XLDnaute Nouveau
Bonjour

J'aimerais dans la mesure du possible avoir une macro qui permet de copier le contenu des tableaux des 4 feuilles uniquement pour les lignes qui contiennent les dates dans la colonnes S et les envoyer vers la feuille courrier.

Les titres des tableaux sont les mêmes (en nombre et en nom)

Je met en joint le fichier exemple (j'ai mis au hasard le contenu des cellules) .

Très cordialement
 

Pièces jointes

  • courrier.xlsx
    24.8 KB · Affichages: 9

Dudu2

XLDnaute Barbatruc
Bonjour,
Un code possible...
Edit: qui implique qu'il n'y ait pas de trou en colonne 1 des feuilles, sinon il faut procéder autrement.
VB:
Option Explicit

Sub Copier()
    Dim Feuille As Variant
    Dim LigneFeuille As Long
    Dim LigneCourrier As Long
    Dim ActiveCellAtStart As Range
      
    'Initialisation
    LigneCourrier = 2
    Application.ScreenUpdating = False
    Set ActiveCellAtStart = ActiveCell
  
    'Effacement des données de la feuille Courrier en préservant la ligne titre
    With ThisWorkbook.Worksheets("Courrier")        
        If .UsedRange.Rows.Count > 1 Then
            .UsedRange.Offset(1, 0).Resize(.UsedRange.Rows.Count - 1).ClearContents
            .UsedRange.Offset(1, 0).Resize(.UsedRange.Rows.Count - 1).ClearFormats
        End If
    End With
  
    'Pour chacune des 4 premières feuilles
    For Each Feuille In Array("FAD", "ADN", "PH", "BASIC")
        With ThisWorkbook.Worksheets(Feuille)
            LigneFeuille = 2
          
            'Pour chaque ligne de la feuille après la ligne titre
            Do While Not IsEmpty(.Cells(LigneFeuille, 1))
          
                'Si la colonne S contient une valeur
                If Not IsEmpty(.Cells(LigneFeuille, 19)) Then
                    .Rows(LigneFeuille).Copy
                    .Parent.Worksheets("Courrier").Rows(LigneCourrier).PasteSpecial xlPasteAll
                    LigneCourrier = LigneCourrier + 1
                End If
              
                LigneFeuille = LigneFeuille + 1
            Loop
        End With
    Next Feuille
  
    Application.CutCopyMode = False
    ActiveCellAtStart.Select
    Application.ScreenUpdating = True
    MsgBox LigneCourrier - 1 & " ligne(s) copiée(s)"
End Sub
 
Dernière édition:

Moataz_

XLDnaute Nouveau
Merci beaucoup...ça marche très bien
juste une chose...au départ ça beug au niveau de ce bout de code.


'Effacement des données de la feuille Courrier en préservant la ligne titre
With ThisWorkbook.Worksheets("Courrier")
.UsedRange.Offset(1, 0).Resize(.UsedRange.Rows.Count - 1).ClearContents
.UsedRange.Offset(1, 0).Resize(.UsedRange.Rows.Count - 1).ClearFormats
End With



j'ai du le supprimer pour que ça passe...ça posera pas de problème ?
 
Dernière édition:

Moataz_

XLDnaute Nouveau
Autre chose...j'ai dupliquer la macro pour effectuer la même tache pour d'autres feuilles...mais il m'efface les premiers que jai importé....car je veux faire la même chose pour 4 autres feuilles qui ont la date dans la colonne 19....
si y a possibilité de grouper les 2 macros en une.

les 4 premières feuilles ont la date dans la colonne 15 et les 4 autres feuilles (KAM, suivi2, relance, motif) ont la date dans la colonne 19.

Merci beaucoup
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Il faut conserver cette séquence qui permet d'effacer les lignes existantes au démarrage.
J'ai corrige le bug en joutant un test nécessaire: If .UsedRange.Rows.Count > 1 Then

Pour intégrer les autres feuilles j'ai un peu modifié le code et placé en tête de Macro des constantes pour les noms des feuilles et les colonnes dates. A adapter si nécessaire.
VB:
Option Explicit

Sub Copier()
    Dim LigneFeuille As Long
    Dim LigneCourrier As Long
    Dim ActiveCellAtStart As Range
    Dim TabFeuilles() As String
    Dim TabColonnesDate() As String
    Dim i As Integer
    Dim ErrNumber As Variant
  
    'Noms des feuilles et noms des colonnes date
    Const FeuilleCourrier = "Courrier"
    Const Feuilles = "FAD,ADN,PH,BASIC,KAM,suivi2,relance,motif"
    Const ColonnesDate = "O,O,O,O,S,S,S,S"
    Const ColonnesACopier = "A:Z"   'Si multi-area exemple "A:D,F:S,X:X,Z:Z"
  
    'Initialisation
    TabFeuilles = Split("," & Feuilles, ",")    '"," en début pour couvrir l'indice 0 non utilisé
    TabColonnesDate = Split("," & ColonnesDate, ",")    '"," en début pour couvrir l'indice 0 non utilisé
    LigneCourrier = 2
    Application.ScreenUpdating = False
    Set ActiveCellAtStart = ActiveCell
    
    'Contrôles
    If UBound(TabFeuilles) <> UBound(TabColonnesDate) Then
        MsgBox "Nombre d'éléments différent dans la constante ""Feuilles"" et la constante ""ColonnesDate"" !"
        Exit Sub
    End If
    
    For i = 1 To UBound(TabFeuilles)
        If Len(TabFeuilles(i)) = 0 Then
            MsgBox "Elément n° " & i & " vide dans la constante ""Feuilles"" !"
            Exit Sub
        End If
        
        If Len(TabColonnesDate(i)) = 0 Then
            MsgBox "Elément n° " & i & " vide dans la constante ""ColonnesDate"" !"
            Exit Sub
        End If
        
        On Error Resume Next
        With ThisWorkbook.Worksheets(TabFeuilles(i))
            ErrNumber = Err.Number
            On Error GoTo 0
        End With
    
        'Feuille inexistante
        If ErrNumber Then
            MsgBox "La feuille """ & TabFeuilles(i) & """ dans la constante ""Feuilles"" n'existe pas !"
            Exit Sub
        End If
    Next i

    'Effacement des données de la feuille Courrier en préservant la ligne titre
    With ThisWorkbook.Worksheets(FeuilleCourrier)
        If .UsedRange.Rows.Count > 1 Then
            .UsedRange.Offset(1, 0).Resize(.UsedRange.Rows.Count - 1).ClearContents
            .UsedRange.Offset(1, 0).Resize(.UsedRange.Rows.Count - 1).ClearFormats
        End If
    End With

    'Pour chacune des feuilles
    For i = 1 To UBound(TabFeuilles)

        With ThisWorkbook.Worksheets(TabFeuilles(i))
            LigneFeuille = 2
        
            'Pour chaque ligne de la feuille après la ligne titre
            Do While Not IsEmpty(.Cells(LigneFeuille, 1))
        
                'Si la colonne date contient une valeur
                If Not IsEmpty(.Range(TabColonnesDate(i) & LigneFeuille)) Then
                    Intersect(.Rows(LigneFeuille), .Range(ColonnesACopier)).Copy
                    .Parent.Worksheets(FeuilleCourrier).Rows(LigneCourrier).PasteSpecial xlPasteAll
                    LigneCourrier = LigneCourrier + 1
                End If
            
                LigneFeuille = LigneFeuille + 1
            Loop
        End With
    Next i

    Application.CutCopyMode = False
    ActiveCellAtStart.Select
    Application.ScreenUpdating = True
    MsgBox LigneCourrier - 1 & " ligne(s) copiée(s)"
End Sub
 
Dernière édition:

Moataz_

XLDnaute Nouveau
Merci ...
même si tout est copié...ça beug à ce niveau
bug22.PNG
 

Moataz_

XLDnaute Nouveau
juste une dernière question...y a pas moyen de ne sélectionner que les colonnes allant de A à Z pour l'ensemble des tableaux des feuilles....car les tableaux réels contiennent une 50 aine de colonnes.
si c pas as faisable c pas grave ..je vais les supprimer manuellement .
Merci
 

Discussions similaires

Statistiques des forums

Discussions
312 095
Messages
2 085 250
Membres
102 836
dernier inscrit
Ali Belaachet