Suppression “complexe” d’une ligne vide d’une liste

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Je sais d’avance que d’aucuns prétendront que Magic_Doctor en demande un peu trop…

J’ai une liste dans laquelle (comme toute liste) je rentre des items.
Au fur et à mesure des entrées cette liste est débarrassée de ses éventuels doublons et lignes vides, et triée par ordre alphabétique via une macro événementielle qui fait appel à un dictionnaire (merci job75 !). Il n’y a aucune colonne intermédiaire avec formules implexes, tout se passe au travers du dictionnaire. Ça marche très bien.

Supposons maintenant que j’élimine un item dans la colonne où l’on rentre les données. La cellule correspondante devient forcément vide. Je voudrais (au travers d’une macro événementielle) qu’automatiquement, après avoir éliminé le contenu d’une cellule de cette colonne, la liste se reconstitue ad integrum sans solution de continuité, et même s’il y a un ou des doublons que ceux-ci restent présents dans la colonne de saisies (puisque de toute façon ils n'apparaîtront plus dans la 2ème colonne).

Merci d’avance pour toute réponse.
 

Pièces jointes

  • ListeSansLigneVide.xlsm
    19.8 KB · Affichages: 43

job75

XLDnaute Barbatruc
Re : Suppression “complexe” d’une ligne vide d’une liste

Rebonjour Doctor,

Mets cette macro dans le code de la feuille :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
With [MaMerveilleusePlageDeCellules]
  If Not Intersect(Target, .Cells) Is Nothing Then
    Dim t(), c As Range, n As Long
    ReDim t(1 To .Count, 1 To 1)
    For Each c In .Cells
      If Not IsEmpty(c) Then
        n = n + 1
        t(n, 1) = c
      End If
    Next
    Application.EnableEvents = False
    .Cells = t
    Application.EnableEvents = True
  End If
End With
End Sub
A+
 

Magic_Doctor

XLDnaute Barbatruc
Re : Suppression “complexe” d’une ligne vide d’une liste

Bonjour,

Je reviens sur ce fil.
Pour des raisons pratiques, j'avais minimalisé ma feuille, pensant qu'il serait ensuite facile d'adapter la macro de job75 (pas facile à capter) pour la feuille définitive. Mais ce ne fut pas le cas... C'était trop beau...!!!
Dans la PJ tout est bien expliqué dans le module de feuille.

Merci pour toute aide compréhensive.
 

Pièces jointes

  • ListeSansLigneVide3.xlsm
    21.7 KB · Affichages: 33
  • ListeSansLigneVide3.xlsm
    21.7 KB · Affichages: 36
  • ListeSansLigneVide3.xlsm
    21.7 KB · Affichages: 37

job75

XLDnaute Barbatruc
Re : Suppression “complexe” d’une ligne vide d’une liste

Bonjour Magic_Doctor,

Les 2 colonnes étant contiguës, il suffit de créer le tableau t avec 2 colonnes :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
With [MaMerveilleusePlageDeCellules]
  If Not Intersect(Target, .Cells) Is Nothing Then
    Dim t(), c As Range, n As Long
    ReDim t(1 To .Count, 1 To 2)
    For Each c In .Cells
      If Not IsEmpty(c) Then
        n = n + 1
        t(n, 1) = c
        t(n, 2) = c(1, 2)
      End If
    Next
    Application.EnableEvents = False
    .Resize(, 2) = t
    Application.EnableEvents = True
  End If
End With
End Sub
A+
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re : Suppression “complexe” d’une ligne vide d’une liste

Bonsoir job,

Merci, ça marche presque.
Pour ne pas surcharger (et afin que ce soit plus clair) le "Private Sub Worksheet_Change" du module de feuille, j'ai préféré modifier ta routine et l'appeler dans un module standard. Ma foi, ça a l'air de marcher.
en fait, dans la version définitive, la plage "MaMerveilleusePlageDeCellules" s'intitule "ListeItems1" et comprend l'ensemble du tableau, autrement dit la colonne des solvants et celle des masses volumiques.
Logiquement, [MaMerveilleusePlageDeCellules] <=> [ListeItems1].Columns(1).
Si, dans ta routine, je remplace [MaMerveilleusePlageDeCellules] par [ListeItems1].Columns(1), c'est la cata !
 

Pièces jointes

  • ListeSansLigneVide3.xlsm
    21.1 KB · Affichages: 27
  • ListeSansLigneVide3.xlsm
    21.1 KB · Affichages: 31
  • ListeSansLigneVide3.xlsm
    21.1 KB · Affichages: 29

job75

XLDnaute Barbatruc
Re : Suppression “complexe” d’une ligne vide d’une liste

Re,

Quand tu écris en "Hoja1" :

Code:
Call EraseEmptyRows([ListeItems1].Columns(1))
tu envoies à la macro un item de la collection Columns, d'où tes soucis.

On a vu ça avec toi il n'y a pas longtemps Magic_Doctor :)

Il faut ajouter .Cells :

Code:
Call EraseEmptyRows([ListeItems1].Columns(1).Cells)
Et la macro :

Code:
Sub EraseEmptyRows(plage As Range)
Dim t(), c As Range, n As Long
ReDim t(1 To plage.Count, 1 To 2)
For Each c In plage
  If Not IsEmpty(c) Then
    n = n + 1
    t(n, 1) = c
    t(n, 2) = c(1, 2)
  End If
Next
Application.EnableEvents = False
plage.Resize(, 2) = t
Application.EnableEvents = True
End Sub
Je n'ai pas mis de With plage/End With car plage est un mot court...

A+
 
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Suppression “complexe” d’une ligne vide d’une liste

Bonsoir,

Avec Dictionary

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, [MaMerveilleusePlageDeCellules]) Is Nothing Then
      Set d = CreateObject("scripting.dictionary")
      For Each c In [MaMerveilleusePlageDeCellules]
        If Not IsEmpty(c) Then d(c.Value) = c.Offset(, 1)
      Next c
      Application.EnableEvents = False
      [MaMerveilleusePlageDeCellules].Resize(, 2).ClearContents
      [b3].Resize(d.Count) = Application.Transpose(d.keys)
      [c3].Resize(d.Count) = Application.Transpose(d.items)
      Application.EnableEvents = True
  End If
End Sub

JB
 

Magic_Doctor

XLDnaute Barbatruc
Re : Suppression “complexe” d’une ligne vide d’une liste

Bonsoir job, BOISGONTIER,

Merci à tous les deux, vos solutions marchent.
Effectivement, job, maintenant je me souviens que récemment j'avais eu affaire avec un problème similaire. Bon, à force je vais retenir !
BOISGONTIER, votre solution via le dictionnaire est intéressante. J'ai voulu faire une modification mineure pour ne dépendre que des coordonnées du tableau "ListeItems1" (au cas où l'on modifierait la feuille, sans avoir à revenir dans la macro) :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, [ListeItems1].Columns(1)) Is Nothing Then
    Dim d As Object, c As Range, ad1 As String, ad2 As String
    Set d = CreateObject("scripting.dictionary")
    ad1 = [ListeItems1].Cells(1, 1).Address
    ad2 = [ListeItems1].Cells(1, 2).Address
    For Each c In [ListeItems1].Columns(1).Cells
        If Not IsEmpty(c) Then d(c.Value) = c.Offset(, 1)
    Next c
    Application.EnableEvents = False
    [ListeItems1].Columns(1).Resize(, 2).ClearContents
    '[b3].Resize(d.Count) = Application.Transpose(d.keys)
    Range(ad1).Resize(d.Count) = Application.Transpose(d.keys)
    'Range(ad2).Resize(d.Count) = Application.Transpose(d.keys) 'ça ne marche pas
    [c3].Resize(d.Count) = Application.Transpose(d.items)
    Application.EnableEvents = True
End If

End Sub

et je ne comprends pas pourquoi pour Range(ad2) ça ne marche pas.

En tout cas, merci à tous les deux et une excellente soirée.
 

Pièces jointes

  • ListeSansLigneVide (job75).xlsm
    18.3 KB · Affichages: 28
  • ListeSansLigneVide (job75).xlsm
    18.3 KB · Affichages: 24
  • ListeSansLigneVide (job75).xlsm
    18.3 KB · Affichages: 25
  • ListeSansLigneVide (BOISGONTIER).xlsm
    21 KB · Affichages: 28
  • ListeSansLigneVide (BOISGONTIER).xlsm
    21 KB · Affichages: 31
  • ListeSansLigneVide (BOISGONTIER).xlsm
    21 KB · Affichages: 32

job75

XLDnaute Barbatruc
Re : Suppression “complexe” d’une ligne vide d’une liste

Bonsoir JB,

Comme tu l'as souvent signalé l'intérêt du Dictionary est de pouvoir accéder extrêmement rapidement à ses items.

Mais ici il n'y a pas de recherche et Dictionary peut être plus lent qu'un tableau.

J'ai testé le fichier du post #4 avec cette macro :

Code:
Sub Test()
Dim t, i
Application.ScreenUpdating = False
t = Timer
For i = 1 To 1000
[B3] = [B3]
Next
MsgBox Timer - t
End Sub
Sur Win Xp - Excel 2003 => Macro JB => 4,72 s => Macro job => 1,34 s.

Sur Win 7 - Excel 2010 => Macro JB => 2,77 s => Macro job => 1,20 s.

Mais il faudrait tester sur de grands tableaux car CreateObject prend pas mal de temps.

A+
 

Magic_Doctor

XLDnaute Barbatruc
Re : Suppression “complexe” d’une ligne vide d’une liste

Bonjour job,

Effectivement une "grosse" faute d'inattention qui aurait dù pourtant me sauter aux yeux quand j'ai reproduit (avec les couleurs) la routine modifiée de BOISGONTIER.
Il est intéressant de comparer ta solution avec celle de BOISGONTIER. J'avais pensé à l'utilisation du dictionnaire, mais un des paradigmes du dictionnaire (si j'ai bien compris) est précisément l'élimination automatique des doublons. Or, dans mon 1er post, je précisais que je tenais à conserver les doublons (éliminés par la suite dans la colonne "définitive" où, via un dictionnaire que tu m'avais concocté, les items sont triés par ordre alphabétique et les doublons éliminés).
Pourquoi donc vouloir conserver les doublons ? Justement pour les comparer entre eux. Les clés peuvent être identiques, mais pas forcément les items (dans la terminologie du dictionnaire).
Supposons que, dans la liste de saisies, il y ait la glycérine en doublon. De deux choses l'une, soit ces 2 items (solvants) ont la même masse volumique, soit leur masse volumique diffère. Dans le 1er cas, pas de problème, on vire sans ambage l'un des 2 items. En revanche, dans le 2ème cas il y a problème : laquelle des 2 masses volumiques est la bonne ? On fera alors une recherche (Wikipedia, Sigma-Aldrich...) afin de savoir lequel des 2 items il faudra éliminer.
En conséquence, l'élimination systématique des doublons peut être préjudiciable dans certaines situations. Il faut parfois tâcher d'en conserver une trace avant leur élimination définitive qui sera ainsi faite par l'homme et non par la machine.
 

Pièces jointes

  • ListeSansLigneVide (job75).xlsm
    20.2 KB · Affichages: 29
  • ListeSansLigneVide (job75).xlsm
    20.2 KB · Affichages: 31
  • ListeSansLigneVide (job75).xlsm
    20.2 KB · Affichages: 25
  • ListeSansLigneVide (BOISGONTIER).xlsm
    21.2 KB · Affichages: 26
  • ListeSansLigneVide (BOISGONTIER).xlsm
    21.2 KB · Affichages: 30
  • ListeSansLigneVide (BOISGONTIER).xlsm
    21.2 KB · Affichages: 30
Dernière édition:

Statistiques des forums

Discussions
312 362
Messages
2 087 638
Membres
103 621
dernier inscrit
breizhyoda