Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Recopie contenu de plusieurs colonnes sur un autre tableau selon conditions

  • Initiateur de la discussion Initiateur de la discussion nauj
  • Date de début Date de début

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 !

nauj

XLDnaute Junior
Bonsoir Forum,
J'ai besoin de votre aide !
J'ai besoin d'automatiser une action soit par le biais d'une formule soit par du code vba.
Voici mon problème :
- Dans un premier onglet nommé "visite", on a un tableau de données composé de 6 colonnes.
- Dans un deuxième onglet nommé "affaire" on a un tableau de données composée de 8 colonnes
- Les 5 premières colonnes de chacun des 2 tableaux sont identiques.
A chaque fois que dans la dernière colonne nommée "business" du premier tableau, on écrit "oui" alors on recopie le contenu de la ligne pour les 5 premières colonnes dans le deuxième tableau situé dans l'onglet "affaire".
Merci d'avance pour votre éclairage
 

Pièces jointes

Re : Recopie contenu de plusieurs colonnes sur un autre tableau selon conditions

Bonsoir à tous.
Une proposition en VBA avec ce code associé à la feuille affaire :
Code:
Option Explicit

Private Sub Worksheet_Activate()
Dim i As Long, j As Long, k As Long, s As String
Dim vi(), af(), af2 As Long
    Application.ScreenUpdating = False
    vi = Sheets("visite").Cells(1, 1).CurrentRegion.Value
[COLOR="SeaGreen"]'Utilisez la ligne 'A ou les lignes 'B selon que vous souhaitez COMPLETER ou REINITIALISER le tableau.
'________________
'    af = Sheets("affaire").Cells(1, 1).CurrentRegion.Value                                          'A
'________________[/COLOR]
    af = Intersect(Sheets("affaire").Range("$1:$1"), Sheets("affaire").Cells(1, 1).CurrentRegion)   'B
    Sheets("affaire").Cells(1, 1).CurrentRegion.ClearContents                                       [COLOR="SeaGreen"]'B[/COLOR]
[COLOR="SeaGreen"]'________________[/COLOR]
    af2 = 1 + UBound(af, 2)
    ReDim Preserve af(1 To UBound(af, 1), 1 To af2)
    For k = 1 To UBound(af, 1)
        For j = 1 To 5
            Select Case VarType(af(k, j))
                Case vbDate: af(k, af2) = af(k, af2) & "@" & Format(af(k, j), "dd/mm/yy")
                Case Else: af(k, af2) = af(k, af2) & "@" & af(k, j)
            End Select
        Next j
    Next k
    af = Application.transpose(af)
    For k = 1 To UBound(vi, 1)
        If vi(k, 6) = "oui" Then
            s = ""
            For j = 1 To 5
                Select Case VarType(vi(k, j))
                    Case vbDate: s = s & "@" & Format(vi(k, j), "dd/mm/yy")
                    Case Else: s = s & "@" & vi(k, j)
                End Select
            Next j
            For j = 1 To UBound(af, 2)
                If af(af2, j) = s Then Exit For
            Next j
            If j > UBound(af, 2) Then
                ReDim Preserve af(1 To af2, 1 To 1 + UBound(af, 2))
                For i = 1 To 5
                    Select Case VarType(vi(k, i))
                        Case vbDate: af(i, UBound(af, 2)) = Format(vi(k, i), "dd/mm/yy")
                        Case Else: af(i, UBound(af, 2)) = vi(k, i)
                    End Select
                Next i
            End If
        End If
    Next k
    Me.Range(Me.Cells(1, 1), Me.Cells(1, 1).Offset(UBound(af, 2) - 1, UBound(af, 1) - 2)).Value = Application.transpose(af)
    Application.ScreenUpdating = True
End Sub
Bonne nuit !
ROGER2327
 

Pièces jointes

Re : Recopie contenu de plusieurs colonnes sur un autre tableau selon conditions

Bonsoir Forum, Bonsoir Roger 2327,
Tu m'as proposé un code vba qui me convient, j'ai constaté, en revanche, un petit souci dans la recopie de la date : cette recopie inverse les jours et les mois...
Je crois que vba lit par défaut les dates au format américain (mm/jj/yy), je n'arrive pas à trouver l'astuce permettant de régler ce souci dans le code proposé.
J'appelle encore une fois à l'aide !
Merci d'avance
 
Re : Recopie contenu de plusieurs colonnes sur un autre tableau selon conditions

Bonjour nauj
Hélas, je n'ai pas trouvé mieux que de mettre la colonne C de la feuille "affaire" au format texte (voir le classeur que j'avais joint).
Le problème est dans la ligne
Code:
Me.Range(Me.Cells(1, 1), Me.Cells(1, 1).Offset(UBound(af, 2) - 1, UBound(af, 1) - 2)).Value = Application.transpose(af)
Les dates sont préservées dans le tableau af, mais au "collage" dans la feuille, elles ne sont pas respectées. Peut-être quelqu'un, sur ce site, pourra nous trouver un truc...​
ROGER2327
 
Re : Recopie contenu de plusieurs colonnes sur un autre tableau selon conditions

Bonsoir,
À nauj : Voulez-vous essayer ceci et me dire si ça fonctionne chez vous ?
Code:
Private Sub Worksheet_Activate()
Dim i As Long, j As Long, k As Long, s As String
Dim vi(), af(), af2 As Long
    Application.ScreenUpdating = False
    vi = Sheets("visite").Cells(1, 1).CurrentRegion.Value
'Utilisez la ligne 'A ou les lignes 'B selon que vous souhaitez COMPLETER ou REINITIALISER le tableau.
'________________
'    af = Sheets("affaire").Cells(1, 1).CurrentRegion.Value                                          'A
'________________
    af = Intersect(Sheets("affaire").Range("$1:$1"), Sheets("affaire").Cells(1, 1).CurrentRegion)   'B
    Sheets("affaire").Cells(1, 1).CurrentRegion.ClearContents                                       'B
'________________
    af2 = 1 + UBound(af, 2)
    ReDim Preserve af(1 To UBound(af, 1), 1 To af2)
    For k = 1 To UBound(af, 1)
        For j = 1 To 5
            Select Case VarType(af(k, j))
                Case vbDate: af(k, af2) = af(k, af2) & "@" & [COLOR="Red"]CDbl(af(k, [B]j[/B]))[/COLOR]
                Case Else: af(k, af2) = af(k, af2) & "@" & af(k, j)
            End Select
        Next j
    Next k
    af = Application.transpose(af)
    For k = 1 To UBound(vi, 1)
        If vi(k, 6) = "oui" Then
            s = ""
            For j = 1 To 5
                Select Case VarType(vi(k, j))
                    Case vbDate: s = s & "@" & [COLOR="Red"]CDbl(vi(k, j))[/COLOR]
                    Case Else: s = s & "@" & vi(k, j)
                End Select
            Next j
            For j = 1 To UBound(af, 2)
                If af(af2, j) = s Then Exit For
            Next j
            If j > UBound(af, 2) Then
                ReDim Preserve af(1 To af2, 1 To 1 + UBound(af, 2))
                For i = 1 To 5
                    Select Case VarType(vi(k, i))
                        Case vbDate: af(i, UBound(af, 2)) = [COLOR="Red"]CDbl(vi(k, i))[/COLOR]
                        Case Else: af(i, UBound(af, 2)) = vi(k, i)
                    End Select
                Next i
            End If
        End If
    Next k
    Me.Range(Me.Cells(1, 1), Me.Cells(1, 1).Offset(UBound(af, 2) - 1, UBound(af, 1) - 2)).Value = Application.transpose(af)
    Application.ScreenUpdating = True
End Sub
Merci d'avance !​
ROGER2327

__________________
Note : les modifications par rapport au code précédent sont écrites en rouge.
 
Dernière édition:
Re : Recopie contenu de plusieurs colonnes sur un autre tableau selon conditions

Bonjour Roger 2327,
D'abord, désolé pour mon tutoiement rapide...
Concernant la modification de votre code, cela fonctionne parfaitement même lorsque la colonne est formatée en mode "date".
Merci encore pour votre patiente et interet à mon problème.
A bientôt
 
Re : Recopie contenu de plusieurs colonnes sur un autre tableau selon condition-suite

Bonsoir Roger 2327, Forum,
J'aurais besoin encore de votre éclairage !
Toujours dans le même fichier, le tableau de données dans la feuille "affaire" est alimenté par de nouvelles informations sur 4 autres colonnes (type, date statut, statut, actions).
Le problème que je rencontre est que ces nouvelles informations ne sont pas triées lorsque le tableau de la feuille "visite" est mis à jour surtout dans le cas où une visite aurait été déclarée dans un premier temps sans business (pas de "oui" dans la colonne correspondante) mais modifiée ensuite (consignation du "oui" dans la colonne correspondante)
J'espère avoir été assez clair dans mes propos...
Je joins le fichier intégrant le code vba de Roger2327.
Merci d'avance
 

Pièces jointes

Re : Recopie contenu de plusieurs colonnes sur un autre tableau selon conditions

Bonjour,
J'ai repris le code pour essayer de mieux contrôler le transfert des dates d'une feuille à l'autre. En effet, le code précédent, outre qu'il comporte une erreur, introduit des affichages fantaisistes si on place des dates dans la colonne date statut de la feuille affaire. Vous verrez le mécanisme dans le code du classeur joint.
De plus, les données de la feuille affaire sont maintenant triées par ordre croissant des valeurs du champ numero.
Enfin, j'ai ajouté un bouton (et son code) dans la feuille visite. Le but est d'offrir le choix entre l'initialisation et la mise à jour de la feuille affaire.
Dites-moi si cela est convenable.​
À plus tard,
ROGER2327
 

Pièces jointes

- 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

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…