XL 2016 Report de lignes sous condition

Petitom42

XLDnaute Nouveau
Bonjour à tous!

Merci de m'accueillir dans ce forum :)

Je cherche désespérément une solution pour reporter des lignes d'une feuille à l'autre en fonction d'une condition prédéfinie, mais je suis assez novice dans la matière.

Je joins un fichier contenant des tableaux : https://1drv.ms/x/s!AogS0o3MZfZJga4AQGJCAcLyEOw2Ew?e=i5UPvn

Dans l'onglet qui s'appelle télécardio, il faudrait que se reportent automatiquement toutes les lignes des autres onglets pour lesquelles il y a un O dans la colonne TC.
Ainsi à chaque fois que l'on rajoute un O dans cette colonne, la ligne correspondante serait automatiquement ajoutée dans l'onglet télécardio.
Il serait alors possible manuellement de rajouter des informations dans les colonnes supplémentaires.

Pensez-vous qu'il existe une solution pour mettre cela en place?

Merci d'avance
Thomas
 
Dernière édition:

Petitom42

XLDnaute Nouveau
Bonjour Petitom42
Un essai
Bonjour,

La solution semble bonne, le problème est que lorsque je remplis les autres colonnes de l'onglet télécardiologie (dans les lignes qui viennent d'être créées), leur contenu s'efface dès que le tableau est mis à jour... Y'aurait-il une solution pour y remédier? Peut-être en reliant les données de cet onglet aux autres, si par exemple les données mises dans ces colonnes peuvent être retranscrites automatiquement dans des colonnes correspondantes dans les autres onglets?

Merci beaucoup pour votre aide!

Thomas
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour Petitom42, Pierre, JHA,

Voyez le fichier joint et cette macro dans le code de la feuille "Télécardio" :
VB:
Private Sub Worksheet_Activate()
Dim ncol%, resu(), w As Worksheet, tablo, i&, n&, j%
ncol = 13 'nombre de colonnes à copier
ReDim resu(1 To Rows.Count, 1 To ncol)
For Each w In Worksheets
    If w.Name <> Me.Name Then
        tablo = w.UsedRange.Resize(, ncol)
        For i = 2 To UBound(tablo)
            If UCase(tablo(i, 10)) = "O" Then
                n = n + 1
                For j = 1 To ncol: resu(n, j) = tablo(i, j): Next j
            End If
        Next i
    End If
Next w
'---restitution---
Application.ScreenUpdating = False
If FilterMode Then ShowAllData 'si la feuille est filtrée
If n Then Cells(Cells(Rows.Count, 10).End(xlUp).Row + 1, 1).Resize(n, ncol) = resu
UsedRange.RemoveDuplicates Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), Header:=xlYes 'supprime les lignes en doublon
Columns.AutoFit 'ajuste les largeurs
With UsedRange: End With 'actualise la barre de défilement verticale
End Sub
Elle se déclenche quand on active la feuille.

Edit : dans la feuille "2019" des dates de naissance étaient des textes, je les ai corrigées.

A+
 

Pièces jointes

  • TC essai(1).xlsm
    76.5 KB · Affichages: 7
Dernière édition:

Petitom42

XLDnaute Nouveau
d'être créées), leur contenu s'efface dès que le tableau est mis à jour... Y'aurait-il une solution pour y remédier?

Bonjour Petitom42,

Voyez le fichier joint et cette macro dans le code de la feuille "Télécardio" :
VB:
Private Sub Worksheet_Activate()
Dim ncol%, resu(), w As Worksheet, tablo, i&, n&, j%
ncol = 13 'nombre de colonnes à copier
ReDim resu(1 To Rows.Count, 1 To ncol)
For Each w In Worksheets
    If w.Name <> Me.Name Then
        tablo = w.Cells(1).CurrentRegion.Resize(, ncol)
        For i = 2 To UBound(tablo)
            If UCase(tablo(i, 10)) = "O" Then
                n = n + 1
                For j = 1 To ncol: resu(n, j) = tablo(i, j): Next j
            End If
        Next i
    End If
Next w
'---restitution---
Application.ScreenUpdating = False
If FilterMode Then ShowAllData 'si la feuille est filtrée
If n Then Cells(Cells(Rows.Count, 10).End(xlUp).Row + 1, 1).Resize(n, ncol) = resu
UsedRange.RemoveDuplicates Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), Header:=xlYes 'supprime les lignes en doublon
Columns.AutoFit 'ajuste les largeurs
With UsedRange: End With 'actualise la barre de défilement verticale
End Sub
Elle se déclenche quand on active la feuille.

A+
Bonjour,

Merci à vous aussi pour votre participation! Décidément vous êtes d'une disponibilité remarquable sur ce forum :)
Le problème avec cette formule est qu'elle rajout sans arrêt des doublons dès que je rajoute ou j'enlève des O dans les autres onglets...
Pas facile j'en suis conscient :/

Merci
Thomas
 

job75

XLDnaute Barbatruc
Le problème avec cette formule est qu'elle rajout sans arrêt des doublons dès que je rajoute ou j'enlève des O dans les autres onglets...
Avec ma macro, dans la feuille "Télécardio" :

- toutes les lignes repérées "O" des feuilles sont ajoutées sous les lignes existantes, cela permet de conserver les données ajoutées manuellement danss cette feuille

- les lignes en doublons sur les colonnes 1 à 10 sont supprimées par RemoveDuplicates.
 

Petitom42

XLDnaute Nouveau
Avec ma macro, dans la feuille "Télécardio" :

- toutes les lignes repérées "O" des feuilles sont ajoutées sous les lignes existantes, cela permet de conserver les données ajoutées manuellement danss cette feuille

- les lignes en doublons sur les colonnes 1 à 10 sont supprimées par RemoveDuplicates.
Bonjour,
Je viens de rééssayer, et lorsque je modifie un O j'ai bien des lignes qui se rajoutent à la suite avec des valeurs en double, triple voire quadruple :/ Est-ce parce que je suis sous Excel 2013?
Par ailleurs lorsqu'on enlève un O dans l'onglet original il ne s'enlève pas dans la feuille télécardio...
Désolé et merci encore pour votre investissement.
Thomas
 

job75

XLDnaute Barbatruc
Bonjour Petitom42, le fil, le forum,

En effet il faut traiter le tableau existant avant de restituer les résultats.

Dans ce fichier (2) on utilise un Dictionary pour repérer les lignes à supprimer :
VB:
Private Sub Worksheet_Activate()
Dim ncol%, resu(), d As Object, w As Worksheet, tablo, i&, n&, x$, j%, repere(), ub%
ncol = 13 'nombre de colonnes à copier
ReDim resu(1 To Rows.Count, 1 To ncol)
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For Each w In Worksheets
    If w.Name <> Me.Name Then
        tablo = w.UsedRange.Resize(, ncol)
        For i = 2 To UBound(tablo)
            If UCase(tablo(i, 10)) = "O" Then
                n = n + 1
                If IsNumeric(CStr(tablo(i, 1))) Then tablo(i, 1) = CDbl(tablo(i, 1)) 'en cas de valeur texte
                x = ""
                For j = 1 To ncol
                    resu(n, j) = tablo(i, j)
                    If j < 10 Then x = x & Chr(1) & tablo(i, j)
                Next j
                d(x) = ""
            End If
        Next i
    End If
Next w
'---repérages dans le tableau existant---
tablo = UsedRange.Resize(, 9)
ReDim repere(1 To UBound(tablo), 1 To 1)
For i = 2 To UBound(tablo)
    x = ""
    For j = 1 To 9
        x = x & Chr(1) & tablo(i, j)
    Next j
    If d.exists(x) Then repere(i, 1) = 1 'repère
Next i
repere(1, 1) = 1
'---1ère restitution et suppressions---
Application.ScreenUpdating = False
If FilterMode Then ShowAllData 'si la feuille est filtrée
ub = ncol + 1
With UsedRange
    .Columns(ub).EntireColumn.Insert 'insère une colonne auxiliaire
    .Columns(ub) = repere
    .EntireRow.Sort .Columns(ub) 'tri pour regrouper et accélérer
    On Error Resume Next 'si aucune SpecialCell
    .Columns(ub).SpecialCells(xlCellTypeBlanks).EntireRow.Delete 'suppressions
    .Columns(ub).EntireColumn.Delete 'supprime la colonne auxiliaire
    On Error GoTo 0
End With
'---2ème restitution---
If n Then Cells(Cells(Rows.Count, 10).End(xlUp).Row + 1, 1).Resize(n, ncol) = resu
UsedRange.RemoveDuplicates Array(1, 2, 3, 4, 5, 6, 7, 8, 9), Header:=xlYes 'supprime les lignes en doublon
Columns.AutoFit 'ajuste les largeurs
With UsedRange: End With 'actualise la barre de défilement verticale
End Sub
Edit : j'ai modifié pour convertir les valeurs textes en colonnes A.

A+
 

Pièces jointes

  • TC essai(2).xlsm
    79.1 KB · Affichages: 2
Dernière édition:

job75

XLDnaute Barbatruc
Dans la macro précédente j'ai ajouté une ligne pour convertir en colonnes A les valeurs textes en nombres.

Et s'il y a beaucoup de lignes en doublon entre les feuilles il vaut mieux utiliser ce fichier (3) :
Code:
Private Sub Worksheet_Activate()
Dim ncol%, resu(), d As Object, w As Worksheet, tablo, i&, n&, x$, j%, repere(), ub%
ncol = 13 'nombre de colonnes à copier
ReDim resu(1 To Rows.Count, 1 To ncol)
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For Each w In Worksheets
    If w.Name <> Me.Name Then
        tablo = w.UsedRange.Resize(, ncol)
        For i = 2 To UBound(tablo)
            If UCase(tablo(i, 10)) = "O" Then
                If IsNumeric(CStr(tablo(i, 1))) Then tablo(i, 1) = CDbl(tablo(i, 1)) 'en cas de valeur texte
                x = ""
                For j = 1 To 9
                    x = x & Chr(1) & tablo(i, j)
                Next j
                If Not d.exists(x) Then 'élimine les doublons entre les feuilles
                    n = n + 1
                    For j = 1 To ncol
                        resu(n, j) = tablo(i, j)
                    Next j
                    d(x) = ""
                End If
            End If
        Next i
    End If
Next w
'---repérages dans le tableau existant---
tablo = UsedRange.Resize(, 9)
ReDim repere(1 To UBound(tablo), 1 To 1)
For i = 2 To UBound(tablo)
    x = ""
    For j = 1 To 9
        x = x & Chr(1) & tablo(i, j)
    Next j
    If d.exists(x) Then repere(i, 1) = 1 'repère
Next i
repere(1, 1) = 1
'---1ère restitution et suppressions---
Application.ScreenUpdating = False
If FilterMode Then ShowAllData 'si la feuille est filtrée
ub = ncol + 1
With UsedRange
    .Columns(ub).EntireColumn.Insert 'insère une colonne auxiliaire
    .Columns(ub) = repere
    .EntireRow.Sort .Columns(ub) 'tri pour regrouper et accélérer
    On Error Resume Next 'si aucune SpecialCell
    .Columns(ub).SpecialCells(xlCellTypeBlanks).EntireRow.Delete 'suppressions
    .Columns(ub).EntireColumn.Delete 'supprime la colonne auxiliaire
    On Error GoTo 0
End With
'---2ème restitution---
If n Then Cells(Cells(Rows.Count, 10).End(xlUp).Row + 1, 1).Resize(n, ncol) = resu
UsedRange.RemoveDuplicates Array(1, 2, 3, 4, 5, 6, 7, 8, 9), Header:=xlYes 'supprime les lignes en doublon
Columns.AutoFit 'ajuste les largeurs
With UsedRange: End With 'actualise la barre de défilement verticale
End Sub
 

Pièces jointes

  • TC essai(3).xlsm
    79.4 KB · Affichages: 8

Discussions similaires

Statistiques des forums

Discussions
312 162
Messages
2 085 858
Membres
103 005
dernier inscrit
gilles.hery