IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Supprimer lignes vides d'un tableau


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 39
    Par défaut Supprimer lignes vides d'un tableau
    Bonjour,

    Je souhaiterais supprimer les lignes vide du Tableau "Tbl".
    Actuellement le Tableau créé ressort bien les données recherchées mais avec de nombreuses lignes vides. Voici la macro:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Sub Calcul()
     
    UserForm1.ListBox2.Clear
     
    Dim dist As Double
    Dim distance As Integer
    Dim T As Single, i As Single, 
     
    T = UserForm1.ComboBox1.ListIndex + 2
     
    LtT = Range("D" & T)
    LgT = Range("E" & T)
     
    For i = 2 To 200
     
    LT = Range("D" & i)
    Lg = Range("E" & i)
     
    dist = (Sin(LT) * Sin(LtT) + Cos(LT) * Cos(LtT) * Cos(LgT - Lg))
     
    If dist <> 1 Then distance = (Atn(-dist / Sqr(-dist * dist + 1)) + 2 * Atn(1)) * 6371 Else distance = "0"
     
      Dim Tbl(1 To 200, 1 To 200)
     
       If distance < UserForm1.ComboBox2.Value Then
     
        Tbl(i, 1) = distance
        Tbl(i, 2) = Range("A" & i)
       End If
     
       UserForm1.ListBox2.ColumnCount = 2
      UserForm1.ListBox2.ColumnWidths = "30,80"
       UserForm1.ListBox2.List = Tbl
     
     Next
    End sub

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour

    Il te faut donc ne pas dimensionner le tableau au départ et le redimensionner au fur et à mesure.
    Intéresse-toi à Redim Preserve.

    EDIT : et si le but est le remplissage d'une listbox, je ne comprends même pas pourquoi passer par un tremplin tableau. Ajoute directement à la listbox et uniquement si condition remplie.

  3. #3
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour à tou(te)s

    le redimensionner au fur et à mesure.
    sauf erreur de ma part, le tableau est à 2 dimensions donc...

    mon idee, ajouter une variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim z As Integer
    z = 0
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      If distance < UserForm1.ComboBox2.Value Then
        z = z + 1
        Tbl(z, 1) = distance
        Tbl(z, 2) = Range("A" & i)
      End If
    à voir....
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut,

    autre possibilité à tester: utiliser une ArrayList.
    Avantage de l'ArrayList? Elle gère elle même le redimensionnement!
    Ca donne ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    Sub Calcul()
     
        UserForm1.ListBox2.Clear
     
        Dim dist As Double
        Dim distance As Integer
        Dim T As Single, i As Single
     
        '===Creation de l'ArrayList===
        Dim arrList As Object
        Set arrList = CreateObject("System.Collections.ArrayList")
        Dim varTab As Variant ' pour transformer l'arraylist en tableau
     
        T = UserForm1.ComboBox1.ListIndex + 2
     
        LtT = Range("D" & T)
        LgT = Range("E" & T)
     
        For i = 2 To 200
            LT = Range("D" & i)
            Lg = Range("E" & i)
     
            dist = (Sin(LT) * Sin(LtT) + Cos(LT) * Cos(LtT) * Cos(LgT - Lg))
     
            If dist <> 1 Then distance = (Atn(-dist / Sqr(-dist * dist + 1)) + 2 * Atn(1)) * 6371 Else distance = "0"
     
            Dim Tbl(1 To 200, 1 To 200)
     
            If distance < UserForm1.ComboBox2.Value Then
     
        '    Tbl(i, 1) = distance
        '    Tbl(i, 2) = Range("A" & i)
     
            ' ===insertion dans l'arraylist, à l'index i===
            arrList.Insert i, Array(distance, Range("A" & i))
     
            End If
     
            ' ===NB: ces 3 instructions ne devraient-elles pas être après le next???===
            UserForm1.ListBox2.ColumnCount = 2
            UserForm1.ListBox2.ColumnWidths = "30,80"
     
            ' ===transformer l'ArrayList en tableau
            varTab = arrList.ToArray()
            ' UserForm1.ListBox2.List = Tbl
            UserForm1.ListBox2.List = varTab
        Next
     
    End Sub

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,

    exemple de suppression de lignes vides dans un Array 2D


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub UserForm_Initialize()
       a = [A2:D7].Value
       Dim tmp(): ReDim tmp(1 To UBound(a))
       For i = LBound(a) To UBound(a)  ' sup lignes vides de a(,)
         If a(i, 1) <> "" Then n = n + 1: tmp(n) = i
       Next
       ReDim Preserve tmp(1 To n)
       Me.ListBox1.List = Application.Index(a, Application.Transpose(tmp), _
          Application.Transpose(Evaluate("Row(1:" & UBound(a, 2) & ")")))
    End Sub

    Boisgontier
    http://boisgontierjacques.free.fr
    Fichiers attachés Fichiers attachés

  6. #6
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut @boisgontierjacques,

    A mon humble avis, le premier Dim tmp() est inutile.
    Comme vu dans une précédente discussion,
    le ReDim fait office de Dim, et déclare aussi la variable.
    Cordialement,

  7. #7
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour Philippe,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    arrList.Insert i, Array(distance, Range("A" & i))
    on en apprend tous les jours
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Vous ne croyez vraiment pas qu'il suffirait d'ajouter directement à la listbox (sans aucun tableau tremplin) avec la condition exprimée ?
    Le AddItem ne crée, lui, aucune "ligne blanche"

  9. #9
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Citation Envoyé par unparia Voir le message
    Vous ne croyez vraiment pas qu'il suffirait d'ajouter directement à la listbox (sans aucun tableau tremplin) avec la condition exprimée ?
    Le AddItem ne crée, lui, aucune "ligne blanche"
    Bonjour unparia,

    quand j'ai proposé ma solution, je n'avais pas vu ton "edit" mais pourquoi pas, je pense que maintenant, l'auteur du sujet a le choix
    bonne journée
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  10. #10
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    A mon humble avis, le premier Dim tmp() est inutile.
    Il faut essayer avant d'affirmer.

    Le AddItem ne crée, lui, aucune "ligne blanche"
    Oui mais c'est lent et lourd en écriture s'il y a plusieurs colonnes.
    La méthode List est la plus rapide

    Boisgontier
    http://boisgontierjacques.free.fr

  11. #11
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Il faut essayer avant d'affirmer.
    Très juste!
    Je viens donc d'essayer, et je confirme.
    Pas besoin de Dim tmp().
    Si je compile avec Option Explicit, pas de message du compilateur.
    Et si je lance le userform, il affiche correctement les lignes, sans blanc.
    Mais bon, c'est un peu du détails!
    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD-2003] Supprimer ligne vide dans tableau
    Par ginaub00 dans le forum Word
    Réponses: 1
    Dernier message: 27/05/2010, 17h09
  2. [XL-2003] (Cacher) modifié en : Supprimer les lignes vides dans un tableau
    Par azerty1956 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 15/04/2009, 18h12
  3. Réponses: 4
    Dernier message: 25/11/2008, 09h46
  4. Réponses: 10
    Dernier message: 10/10/2008, 13h22
  5. Réponses: 1
    Dernier message: 12/12/2006, 12h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo