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

6 réponses

michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
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
sanchis81 Messages postés 138 Statut Membre 10
 
Merci Michel! c'est exactement ce que j'attendais!

bonne journée
0
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
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
sanchis81 Messages postés 138 Statut Membre 10
 
Merci Michel. Désolé pour les détails, je le saurai pour la prochaine fois...
0