Microsoft 365 TS Ajout ligne avec Condition

  • Initiateur de la discussion Initiateur de la discussion eric72
  • 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 !

eric72

XLDnaute Accro
Bonjour à tous,
Je retrouve le même problème que dans mon précédent post mais avec un autre exemple.
- un TS "TbSalarie", j'aimerai copier les données des 5 premières colonnes si la Catégorie est (par exemple) "Ouvrier" dans le TS "TbPlan à partir de la colonne 2 à la colonne 6
- J'ai commencé à tenter d'adapter le code (de vgendron) du précédent post mais je ne comprends pas le fonctionnement des "tablo" (il est préférable de ne pas en tenir compte!!!).
Quelqu'un aurait-il la gentillesse de m'aider?
Merci beaucoup
 

Pièces jointes

Solution
Re,

je souhaitais prendre l'exemple de D_ENTREE pour comprendre comment on récupère l'index de la ligne pour coller une autre plage non contigues, raison pour laquelle j'ai pris cet exemple en imaginant que la colonne "L" devienne D_ENTREE

Voici la version v2 dont les commentaires ont été modifiés. Les lignes de commentaires avec au début " ** " concernent les lignes modifiées ou rajoutées pour satisfaire la demande complémentaire.
Bonsoir @eric72😀 ,

Que fait-on quand le salarié de la feuille "Import" est déjà présent dans la feuille "PLAN DE FORMATION" ?
  • on saute le "salarié" (en tout bien et tout honneur bien entendu)
  • on remplace ses données présentes dans "PLAN DE FORMATION" par celles présentes dans "Import"
A plus.
 
hello @mapomme

pour t'éviter de perdre trop de temps...
 
Bonsoir @eric72😀 ,

Que fait-on quand le salarié de la feuille "Import" est déjà présent dans la feuille "PLAN DE FORMATION" ?
  • on saute le "salarié" (en tout bien et tout honneur bien entendu)
  • on remplace ses données présentes dans "PLAN DE FORMATION" par celles présentes dans "Import"
A plus.
Bonjour mapomme,
Merci pour la réponse, même si le salarié existe déjà on ajoute une nouvelle ligne.
C'est juste pour faire importer tous les salariés qui réponde à la catégorie demandée.
Merci
 
hello @mapomme

pour t'éviter de perdre trop de temps...
Je comprends que tu n'aies pas envie de perdre plus de temps, mais c'est juste que je ne parviens pas à comprendre tout ce qui est "tablo, ubound etc...".
Pour moi c'est plus simple de nommer des plages hors TS alors je tente de comprendre.
Ne le prends pas mal et merci pour avoir résolu mon pécédent problème.
 
@eric72
et tu crois que poser la meme question dans un nouveau post va te permettre de mieux comprendre??

1) l'utilisation de tableaux sous VBA permet d'aller plus vite dans le traitement que de travailler directement sur la feuille
un tableau, c'est x lignes * y colonnes

2) comme l'idée c'est d'ajouter des lignes au tableau, on utilise la méthode "Redim preserve"
SAUF qu'avec cette méthode on ne peut pas ajouter une ligne, mais juste ajouter des colonnes
donc.. au préalable, on transpose le tableau de données pour que les lignes deviennent les colonnes et vice versa
==> on peut donc augmenter la taille du tableau comme on veut (taille = nombre de colonnes)

une fois qu'on a notre tableau final, on retranspose pour coller le résulat

MAIS (encore un) la fonction Transpose ne marche pas comme on veut lorsque le tableau n'a qu'UNE seule ligne
il faut donc ajouter des bidouilles pour s'en sortir

sur une feuille excel
en A1=1 B1=2 C1=3 (ca fait un tableau d'une ligne *3 colonnes

tu selectionnes A1:C1
copier collage spécial transpose en E1
tu obtiens bien un tableau de E1 à E3 ==> on a un tableau de 3 lignes * 1 colonne
MAIS la fonction transpose en VBA ne fait pas ca.. une ligne transposée, devient un array... ==> d'ou les bidouilles
 
hello @mapomme

pour t'éviter de perdre trop de temps...
Jusqu'ici la seule méthode que je connaisse est celle-ci
VB:
Sub TEST()
Dim L As Integer
  Dim F1 As Worksheet
  Dim F2 As Worksheet
  Dim DerligF1 As Long
  Dim DerligF2 As Long
  Set F1 = Sheets("Import")
  Set F2 = Sheets("PLAN DE FORMATION")
  Application.ScreenUpdating = False
 
  With F2
  DerligF2 = .Cells(Rows.Count, 1).End(xlUp).Row
  End With
  '****************
  With F1
  DerligF1 = .Cells(Rows.Count, 22).End(xlUp).Row
.Range("V4:V" & DerligF1).AutoFilter Field:=7, Criteria1:="CADRE"
.Range("V4:Z" & DerligF1).SpecialCells(xlCellTypeVisible).Copy Destination:=F2.Cells(DerligF2, 2)
' ***************** Annuler filtre
   If Not .AutoFilter Is Nothing Then
      If .FilterMode Then .ShowAllData
      .AutoFilter.Range.AutoFilter
    End If
End With
F2.Select
 Application.ScreenUpdating = True
End Sub
Mais ça n'est pas top!!!
 
@eric72
et tu crois que poser la meme question dans un nouveau post va te permettre de mieux comprendre??

1) l'utilisation de tableaux sous VBA permet d'aller plus vite dans le traitement que de travailler directement sur la feuille
un tableau, c'est x lignes * y colonnes

2) comme l'idée c'est d'ajouter des lignes au tableau, on utilise la méthode "Redim preserve"
SAUF qu'avec cette méthode on ne peut pas ajouter une ligne, mais juste ajouter des colonnes
donc.. au préalable, on transpose le tableau de données pour que les lignes deviennent les colonnes et vice versa
==> on peut donc augmenter la taille du tableau comme on veut (taille = nombre de colonnes)

une fois qu'on a notre tableau final, on retranspose pour coller le résulat

MAIS (encore un) la fonction Transpose ne marche pas comme on veut lorsque le tableau n'a qu'UNE seule ligne
il faut donc ajouter des bidouilles pour s'en sortir

sur une feuille excel
en A1=1 B1=2 C1=3 (ca fait un tableau d'une ligne *3 colonnes

tu selectionnes A1:C1
copier collage spécial transpose en E1
tu obtiens bien un tableau de E1 à E3 ==> on a un tableau de 3 lignes * 1 colonne
MAIS la fonction transpose en VBA ne fait pas ca.. une ligne transposée, devient un array... ==> d'ou les bidouilles
Merci pour ces précisions, pour info, ça n'était pas le même cas que le 1er post, tu avais très bien répondu, c'est juste moi qui n'ai pas su l'adapter à mon 2ème cas.
Merci beaucoup et bonne soirée
 
Re @eric72, bonjour @vgendron😉,

@vgendron, merci de m'avoir prévenu, c'est gentil. Comme j'avais commencé à bidouiller un truc avec des commentaires, j'ai malgré tout terminé avec la prise en compte du fait qu'on importe tout le tableau "import" dans le le plan. J'ai mis de-ci de-là des commentaires.

VB:
Sub ImportVersPlan()
   ImportVersPlanDeFormation "ouvrier"
End Sub

Sub ImportVersPlanDeFormation(ByVal xCategorie As String)
' Si xCategorie vaut "*" (astérisque) alors on importe toutes les catégories
Dim t, tsPlan As ListObject, ligne&, i&, j&, nr&
   xCategorie = LCase(xCategorie)                              ' on passe la catégorie recherchée en minuscule
   Set tsPlan = Sheets("PLAN DE FORMATION").ListObjects(1)     ' le tableau structuré du plan de formation
   If Sheets("Import").ListObjects(1).ListRows.Count = 0 Then Exit Sub  ' si import vide on quitte la prcédure
   t = Sheets("Import").ListObjects(1).DataBodyRange     ' lecture (sans le titre) dans t des valeurs de Import
   'création d'un tableau vide d'autant de lignes que t et de 5 colonnes
   ReDim r(1 To UBound(t), 1 To 5)
   ' on remplit r avec les valeurs qui nous intéressent (en fonction de la catégorie désirée)
   ' nr sera le nombre de lignes utiles de r les lignes de la bonne catégorie)
   For i = 1 To UBound(t)
      If LCase(t(i, 7)) = xCategorie Or xCategorie = "*" Then        ' c 'est la bonne catégorie
         nr = nr + 1                                                 ' on incrémente le nombre de lignes utiles
         For j = 1 To 5: r(nr, j) = t(i, j): Next                    ' copie les données de t (ligne i) dans r (ligne nr)
      End If
   Next i
   ' on colle maintenant les nr lignes de r dans le plan de formation
   If nr > 0 Then       ' uniquement s'il y a au moins une ligne utile dans le résultat
      Sheets("PLAN DE FORMATION").Select
      tsPlan.ListRows.Add        ' ajout d'une nouvelle ligne dans le plan
      ' on va coller dans la deuxième cellule (colonne 2) de cette nouvelle ligne les nr lignes de r
      tsPlan.ListRows(tsPlan.ListRows.Count).Range(1, 2).Resize(nr, 5) = r
   End If
End Sub
 

Pièces jointes

Dernière édition:
Re @eric72, bonjour @vgendron😉,

@vgendron, merci de m'avoir prévenu, c'est gentil. Comme j'avais commencé à bidouiller un truc avec des commentaires, j'ai malgré tout terminé avec la prise en compte du fait qu'on importe tout le tableau "import" dans le le plan. J'ai mis de-ci de-là des commentaires.

VB:
Sub ImportVersPlan()
   ImportVersPlanDeFormation "ouvrier"
End Sub

Sub ImportVersPlanDeFormation(ByVal xCategorie As String)
' Si xCategorie vaut "*" (astérisque) alors on importe toutes les catégories
Dim t, tsPlan As ListObject, ligne&, i&, j&, nr&
   xCategorie = LCase(xCategorie)                              ' on passe la catégorie recherchée en minuscule
   Set tsPlan = Sheets("PLAN DE FORMATION").ListObjects(1)     ' le tableau structuré du plan de formation
   If Sheets("Import").ListObjects(1).ListRows.Count = 0 Then Exit Sub  ' si import vide on quitte la prcédure
   t = Sheets("Import").ListObjects(1).DataBodyRange     ' lecture (sans le titre) dans t des valeurs de Import
   'création d'un tableau vide d'autant de lignes que t et de 5 colonnes
   ReDim r(1 To UBound(t), 1 To 5)
   ' on remplit r avec les valeurs qui nous intéressent (en fonction de la catégorie désirée)
   ' nr sera le nombre de lignes utiles de r les lignes de la bonne catégorie)
   For i = 1 To UBound(t)
      If LCase(t(i, 7)) = xCategorie Or xCategorie = "*" Then        ' c 'est la bonne catégorie
         nr = nr + 1                                                 ' on incrémente le nombre de lignes utiles
         For j = 1 To 5: r(nr, j) = t(i, j): Next                    ' copie les données de t (ligne i) dans r (ligne nr)
      End If
   Next i
   ' on colle maintenant les nr lignes de r dans le plan de formation
   If nr > 0 Then       ' uniquement s'il y a au moins une ligne utile dans le résultat
      Sheets("PLAN DE FORMATION").Select
      tsPlan.ListRows.Add        ' ajout d'une nouvelle ligne dans le plan
      ' on va coller dans la deuxième cellule (colonne 2) de cette nouvelle ligne les nr lignes de r
      tsPlan.ListRows(tsPlan.ListRows.Count).Range(1, 2).Resize(nr, 5) = r
   End If
End Sub
Merci beaucoup pour cette réponse
cependant il me semble que le résultat n'est pas conforme, exemple si je choisis ouvrier le résultat ne comprend pas que des ouvriers!!!
- j'en profite pour poser une dernière question, si je souhaite importer également la "D_ENTREE" en colonne "L" du TbPlan, est-ce possible?
 
cependant il me semble que le résultat n'est pas conforme, exemple si je choisis ouvrier le résultat ne comprend pas que des ouvriers!!!
J'ai rechargé le classeur, il fonctionne comme il se doit !

Ce que je ne fais pas, c'est vider le plan de formation avant de le remplir. Ce n'était pas demandé. Mais si vous le désirez, demandez le moi.
Actuellement, si vous exécuter n fois la macro, vous dupliquez les données n fois les lignes (sauf si vous changez de catégorie à chaque fois).
 
Dernière édition:
J'ai rechargé le classeur, il fonctionne comme il se doit !

Ce que je ne fais pas, c'est vider le plan de formation avant de le remplir. Ce n'était pas demandé.
Donc si vous exécuter n fois la macro vous dupliquez les données n fois les lignes... (sauf si vous changez de catégorie à chaque fois).

Mais si vous le désirez, demandez le moi.
Je vais regarder cela a tête reposée demain et je vous redis.
Merci beaucoup pour votre dévouement.
PS: il n'y a pas besoin de vider le plan avant, pas de souci à ce niveau
 
Oui c'est tout à fait possible mais juste une petite question :
D_ENTREE est une date et la colonne L est une "DUREE EN HRES". C'est normal ?
Bonjour,
En effet ça fonctionne très bien, c'est top.
Pour la date d'entrée je souhaitais prendre l'exemple de D_ENTREE pour comprendre comment on récupère l'index de la ligne pour coller une autre plage non contigues, raison pour laquelle j'ai pris cet exemple en imaginant que la colonne "L" devienne D_ENTREE
Merci beaucoup
 
- 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

Réponses
5
Affichages
138
Réponses
3
Affichages
338
Retour