1ere, 2nde... cellunes non vide

Résolu
sanchis81 Messages postés 138 Statut Membre -  
sanchis81 Messages postés 138 Statut Membre -
Bonjour à tous,

j'ai un tableau Excel sous la forme suivante:

A B C D E
1
2 8
3
4 7
5
6 1

J'aimerais venir coller dans la case E1 la valeur de la 1ère cellule non vide de la colonne B
E2 la valeur de la 2nde cellule non vide de la colonne B
E3 la valeur de la 3ème cellule non vide de la colonne B

Le résultat serait:

E
1 8
2 7
3 1

Merci d'avance pour votre aide!

Sanchis
Configuration: Windows XP Internet Explorer 6.0

6 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    salut Sanchis
    y'avait bin longtemps...

    Const dep As Byte = 2 'ligne de départ minimum
    Sub colB_nonvide()
    derlig = Range("B65536").End(3).Row
    nbre = Application.CountA(Range(Cells(dep, 2), Cells(derlig, 2)))
    Application.ScreenUpdating = False
    Range(Cells(dep, 5), Cells(derlig, 5)).ClearContents
    
    lig = dep
    For cptr = 0 To nbre - 1
        lig = Columns(2).Find("*", Cells(lig, 2)).Row
       Cells(dep + cptr, 5) = Cells(lig, 2)
    Next
    
    End Sub
    
    

    edit 11:23h tu dis si tu veux absolument commencer ligne 1
    0
  2. sanchis81 Messages postés 138 Statut Membre 10
     
    Merci Michel! c'est exactement ce que j'attendais!

    bonne journée
    0
  3. sanchis81 Messages postés 138 Statut Membre 10
     
    Salut Sanchis
    y'avait bin longtemps...

    Const dep As Byte = 2 'ligne de départ minimum
    Sub colB_nonvide()
    derlig = Range("B65536").End(3).Row
    nbre = Application.CountA(Range(Cells(dep, 2), Cells(derlig, 2)))
    Application.ScreenUpdating = False
    Range(Cells(dep, 5), Cells(derlig, 5)).ClearContents

    lig = dep
    For cptr = 0 To nbre - 1
    lig = Columns(2).Find("*", Cells(lig, 2)).Row
    Cells(dep + cptr, 5) = Cells(lig, 2)
    Next

    End Sub

    Bonjour Michel,

    suite à ton dernier message, j'ai mis en place ta macro dans mon outil.

    Mon tableau fait environ 3000 lignes. Chaque cellule contient une formule. Selon les cas, soit le résultat de cette formule est "" ou un nombre.
    Le problème est que la macro analyse l'ensemble des cellules puisque ces cellules contiennent des formules. Et c'est très très long.

    A l'inverse, si je supprime l'ensemble des formules sauf celles où il y a un résultat, la macro est très rapide. Le problème est que je ne peux pas me permettre de les supprimer....

    Aurais tu une solution pour rendre cette macro plus rapide?

    Merci d'avance michel.
    0
  4. sanchis81 Messages postés 138 Statut Membre 10
     
    Salut Sanchis
    y'avait bin longtemps...

    Const dep As Byte = 2 'ligne de départ minimum
    Sub colB_nonvide()
    derlig = Range("B65536").End(3).Row
    nbre = Application.CountA(Range(Cells(dep, 2), Cells(derlig, 2)))
    Application.ScreenUpdating = False
    Range(Cells(dep, 5), Cells(derlig, 5)).ClearContents

    lig = dep
    For cptr = 0 To nbre - 1
    lig = Columns(2).Find("*", Cells(lig, 2)).Row
    Cells(dep + cptr, 5) = Cells(lig, 2)
    Next

    End Sub

    Bonjour Michel,

    suite à ton dernier message, j'ai mis en place ta macro dans mon outil.

    Mon tableau fait environ 3000 lignes. Chaque cellule contient une formule. Selon les cas, soit le résultat de cette formule est "" ou un nombre.
    Le problème est que la macro analyse l'ensemble des cellules puisque ces cellules contiennent des formules. Et c'est très très long.

    A l'inverse, si je supprime l'ensemble des formules sauf celles où il y a un résultat, la macro est très rapide. Le problème est que je ne peux pas me permettre de les supprimer....

    Aurais tu une solution pour rendre cette macro plus rapide?

    Merci d'avance michel.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    re,

    il autait été utile que tu précises les conditions et le nombre de lignes au départ... essaies de t'en souvenir pour ta prochaine demande
    la macro modifiée en fonction. compte tenu du nombre de lignes, utilisation d'un tableau de variables pour aller + vite

    Const dep As Byte = 2 'ligne de départ minimum
    Sub colB_nonvide()
    Dim tablo
    Dim derlig As Integer, nbre As Integer, cptr As Integer, lig As Integer
    
    derlig = Range("B65536").End(xlUp).Row
    nbre = Application.CountA(Range(Cells(dep, 2), Cells(derlig, 2))) - _
                Application.CountIf(Range(Cells(dep, 2), Cells(derlig, 2)), "")
                
    Application.ScreenUpdating = False
    Range(Cells(dep, 5), Cells(derlig, 5)).ClearContents
    
    ReDim tablo(nbre - 1)
    lig = dep - 1
    For cptr = 0 To nbre - 1
        lig = Columns(2).Find("*", Cells(lig, 2), xlValues).Row
       tablo(cptr) = Cells(lig, 2)
    Next
    Range("E2").Resize(UBound(tablo), 1) = Application.Transpose(tablo)
    0
  7. sanchis81 Messages postés 138 Statut Membre 10
     
    Merci Michel. Désolé pour les détails, je le saurai pour la prochaine fois...
    0