[Résolu]Le tableau s'agrandit tout seul !

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

Thibault98

XLDnaute Occasionnel
Bonsoir à tous,

J'ai besoin d'un crack pour me trouver une solution, dans une feuille "Saisie" lorsque que je saisie des numéros dans la colonne B et des dates dans la colonne E je voudrais que ces numéros soient automatiquement inscrits dans un tableau dans la feuille "Contrôle" sous chaque numéro présent afin que le tableau se remplisse tout seul
dans la condition que les dates soient comprises entre les valeurs de la cellule D3 et E3, dans le contraire il faudrait supprimer la ou les lignes, mais pour cette dernière si ce n'est pas possible ce n'est pas grave, le principal serait l'ajout automatique de numéros.



Je vous joint un classeur pour mieux vous expliquer, je pense qu'il faut passer par VBA.

Merci d'avance.

Thibault.
 

Pièces jointes

Dernière édition:
Re : Le tableau s'agrandit tout seul !

Bonsoir Thibault98,

Dans le code de la feuille "Contrôle" :

Code:
Private Sub Worksheet_Activate()
Dim plage As Range, n As Long
On Error Resume Next
With Sheets("Saisie")
  Set plage = .Range("E7:E" & .Rows.Count).SpecialCells(xlCellTypeConstants)
  Set plage = Intersect(plage.EntireRow, .[B:B])
  plage.Copy .[IV1]
  n = plage.Count
  [B13].Resize(n) = .[IV1].Resize(n).Value
  Range("B" & n + 13 & ":B" & Rows.Count).ClearContents
  .[IV1].Resize(n).Delete xlToLeft
End With
End Sub
Dans le code de la feuille Saisie" :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range, sup As Range
Set r = Intersect(Target, Range("E7:E" & Rows.Count), Me.UsedRange)
If Not r Is Nothing Then
  For Each r In r 'si plusieurs cellules (copier-coller)
    If r <> "" And (r < [D3] Or r > [E3]) Then _
      Set sup = Union(r, IIf(sup Is Nothing, r, sup))
  Next
End If
If Not sup Is Nothing Then
  Application.EnableEvents = False
  Intersect(sup.EntireRow, [B:E]).Delete xlUp
  Application.EnableEvents = True
End If
End Sub
Fichier joint.

Edit : j'ai ajouté la variable n.

Bonne nuit et A+
 

Pièces jointes

Dernière édition:
Re : Le tableau s'agrandit tout seul !

Bonjour Job75, merci beaucoup pour ton aide, cela me conviens sauf que j'aurais souhaité dans la feuille "Contrôle" un tableau, j'ai sélectionné la zone puis je l'ai déclaré par insertion tableau, ça fonctionne également toutefois c'est la cellule qui se trouve supprimée plutôt que la ligne (le coin du tableau reste en bas), il est mieux de travailler avec un tableau car les formules qui seront dans les colonnes suivantes seront recopiées automatiquement à chaque nouvelle ligne créée.

Encore merci et bonne journée.
Thibault.
 
Re : Le tableau s'agrandit tout seul !

Bonjour Thibault98, le forum,

J'avais mal compris : ce n'est pas en feuille "Saisie" qu'il faut supprimer des lignes mais en feuille "Contrôle".

Alors cette macro dans le code de la feuille "Contrôle" qui utilise le filtre avancé (élaboré) :

Code:
Private Sub Worksheet_Activate()
Dim derlig As Variant, plage As Range, filtre As Range, n As Long
With Sheets("Saisie")
  derlig = Application.Match(9 ^ 9, .[E:E]) 'dates en colonne E
  If IsNumeric(derlig) Then
    Set plage = .Range("B6:B" & derlig)
    .[F:G].Insert
    .[F7] = "=AND(E7>=D$3,E7<=E$3)" 'critère
    plage.Resize(, 4).AdvancedFilter xlFilterInPlace, .[F6:F7]
    Set filtre = plage.SpecialCells(xlCellTypeVisible)
    filtre.Copy .[G6]
    n = filtre.Count - 1
    If n Then [B13].Resize(n) = .[G7].Resize(n).Value
    plage.Resize(, 4).AdvancedFilter xlFilterInPlace, ""
    .[F:G].Delete
  End If
  Range("B" & n + 13 & ":B" & Rows.Count).ClearContents
End With
End Sub
Fichier (2).

A+
 

Pièces jointes

Dernière édition:
Re : Le tableau s'agrandit tout seul !

En fait dans la feuille contrôle dans la colonne B du tableau, on doit voir les numéros inscrits dans la feuille saisie en colonne B à condition que les dates de la colonne C de cette même feuille soient comprises entre la date en D3 et C3, étant donné que les dates ou périodes vont changer dans le temps, les lignes du tableau de la feuille contrôle devront suivre par la suppression des lignes, ou si je supprime une ligne ou plus dans la feuille saisie on obtiendrait le même résultat, "disparition de la ou des lignes du tableau de la feuille "Contrôle".

Merci
Thibault.
 
Re : Le tableau s'agrandit tout seul !

Re,

Je viens de tester sur Excel 2010 et je vois que le filtre ne fonctionne pas.

Il faut lui inclure la colonne auxiliaire F (n° 5) :

Code:
plage.Resize(, 5).AdvancedFilter xlFilterInPlace, .[F6:F7]
Fichier (3) en .xls et .xlsm.

A+
 

Pièces jointes

Re : Le tableau s'agrandit tout seul !

Re,

je viens de revenir sur Excel 2003 et je vois que le filtre ne fonctionne pas correctement.

Sur cette version il faut donc le fichier (2) avec :

Code:
plage.Resize(, 4).AdvancedFilter xlFilterInPlace, .[F6:F7]
Curieux cette différence entre les 2 versions 😕

A+
 
Re : Le tableau s'agrandit tout seul !

Re,

Bon j'ai compris, il faut en fait placer la zone de critère suffisamment loin du tableau (colonne IV) :

Code:
Private Sub Worksheet_Activate()
Dim derlig As Variant, plage As Range, filtre As Range, n As Long
With Sheets("Saisie")
  derlig = Application.Match(9 ^ 9, .[E:E]) 'dates en colonne E
  If IsNumeric(derlig) Then
    Set plage = .Range("B6:B" & derlig)
    .[IV7] = "=AND(E7>=D$3,E7<=E$3)" 'critère
    plage.Resize(, 4).AdvancedFilter xlFilterInPlace, .[IV6:IV7]
    Set filtre = plage.SpecialCells(xlCellTypeVisible)
    filtre.Copy .[IV6]
    n = filtre.Count - 1
    If n Then [B13].Resize(n) = .[IV7].Resize(n).Value
    plage.Resize(, 4).AdvancedFilter xlFilterInPlace, ""
    .[IV:IV].Delete
  End If
  Range("B" & n + 13 & ":B" & Rows.Count).ClearContents
End With
End Sub
Fichiers (4).

A+
 

Pièces jointes

Re : [Résolu]Le tableau s'agrandit tout seul !

Re,

J'ai testé la macro précédente sur un très grand tableau (50000 lignes).

Sur Excel 2003 du moins, la méthode du filtre avancé ne passe pas.

Il vaut donc mieux utiliser des tableaux VBA, c'est d'ailleurs très classique :

Code:
Private Sub Worksheet_Activate()
Dim d1, d2, derlig As Variant, tablo, i&, t(), n, R()
With Sheets("Saisie")
  d1 = .[D3]: d2 = .[E3] 'dates limites
  derlig = Application.Match(9 ^ 9, .[E:E]) 'dates en colonne E
  If IsNumeric(derlig) Then
    If derlig > 6 Then
      tablo = .Range("B6:E" & derlig)
      For i = 1 To UBound(tablo)
        If tablo(i, 4) >= d1 And tablo(i, 4) <= d2 Then
          ReDim Preserve t(n)
          t(n) = tablo(i, 1)
          n = n + 1
        End If
      Next
    End If
  End If
End With
If n Then
  '---transposition---
  ReDim R(n - 1, 0)
  For i = 0 To n - 1
    R(i, 0) = t(i)
  Next
  '---restitution---
  [B13].Resize(n) = R
End If
Range("B" & n + 13 & ":B" & Rows.Count).ClearContents
End Sub
La macro est très rapide : 0,2 s sur mes 50000 lignes.

Fichier (5).

A+
 

Pièces jointes

Dernière édition:
Re : [Résolu]Le tableau s'agrandit tout seul !

Bonsoir Job75,

J'ai protégé ma feuille avec le code suivant, comme ça pas d'erreur possible de suppression puisqu'elle ne sert qu'à la lecture d'infos.

Code:
Private Sub Worksheet_Activate()
Unprotect Password:=""
Dim d1, d2, derlig As Variant, tablo, i&, t(), n, R()
With Sheets("Saisie")
  d1 = .[D3]: d2 = .[E3] 'dates limites
  derlig = Application.Match(9 ^ 9, .[E:E]) 'dates en colonne E
  If IsNumeric(derlig) Then
    If derlig > 6 Then
      tablo = .Range("B6:E" & derlig)
      For i = 1 To UBound(tablo)
        If tablo(i, 4) >= d1 And tablo(i, 4) <= d2 Then
          ReDim Preserve t(n)
          t(n) = tablo(i, 1)
          n = n + 1
        End If
      Next
    End If
  End If
End With
If n Then
  '---transposition---
  ReDim R(n - 1, 0)
  For i = 0 To n - 1
    R(i, 0) = t(i)
  Next
  '---restitution---
    [B13].Resize(n) = R
End If
Range("B" & n + 13 & ":B" & Rows.Count).ClearContents
Protect Password:=""
End Sub

Bonne soirée et merci beaucoup.
 
Re : [Résolu]Le tableau s'agrandit tout seul !

Salut

J’en étais resté à la gestion des tableaux (2007, 2010) de feuille sans me préoccuper de la vitesse*.
Si… je ne trompe, il faut éviter des doublons non ? (Voir la macro de la feuille de saisies)

* Job75, une gestion de 50 000 bêtes, c’est une belle "vacherie" que tu nous proposes 😉!
 

Pièces jointes

Re : [Résolu]Le tableau s'agrandit tout seul !

Bonsoir Si....,

Très bien sauf qu'il faut garder toutes les lignes de la feuille "Saisie", par contre supprimer celles de la table "contrôle" si la condition des 2 dates n'est pas réunie.

La feuille contrôle sera verrouillée elle doit être dynamique, elle ne sert qu'à la lecture des infos pour le suivie.
Il serait parfait d'arriver à ce résultat.

Merci à vous deux.

Bonne soirée
Thibault
 
Dernière édition:
Re : [Résolu]Le tableau s'agrandit tout seul !

J'ai renvoyé le classeur comme exemple, j'ai modifié le code sur la fin de la feuille saisie mais reste à trouver comment faire pour supprimer une ligne qui ne correspond pas dans la table contrôle.

Merci et bonne soirée.

Thibault.
 

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

Retour