1ere, 2nde... cellunes non vide

Résolu
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

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    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
    1. Merci Michel! c'est exactement ce que j'attendais!

      bonne journée
      1. 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.
        1. 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.
          1. Contributeur
            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)
            1. Merci Michel. Désolé pour les détails, je le saurai pour la prochaine fois...