XL 2016 fonction décaler et estnum

Calou83

XLDnaute Nouveau
Bonjour à toutes et à tous,

Je vais essayer d'exposer mon problème. j'ai un tableau avec 4 colonnes.
1579963499278.png


Je souhaiterais récupérer dans la colonne E le montant de la colonne A sur la meme ligne que le numéro de compte
j'ai utilisé la formule =SI(ESTNUM(A2);A2;"") j'ai essayé d'utiliser la fonction decaler() sans succès

Pourriez-vous m'aider ?

Je vous souhaite une belle journée
 

Pièces jointes

  • Classeur2.xlsx
    10.4 KB · Affichages: 10

Calou83

XLDnaute Nouveau
Merci beaucoup pour votre réponse mais cela me donne le même résultat le montant récupéré se trouve sur la même ligne que le montant de la colonne A hors je souhaiterais que ce montant se trouve sur la ligne du n° de compte correspondant.

Encore merci et bonne journée
 

job75

XLDnaute Barbatruc
Bonjour Calou83, sylvanu, laurent3372, JHA,

Voyez le fichier joint et cette fonction VBA :
VB:
Function F(libel As String, colonne As Range)
Dim i&, rc&
F = ""
i = Application.Caller.Row
rc = colonne.Rows.Count
If InStr(LCase(colonne(i)), LCase(libel)) = 0 Then Exit Function
Do
    i = i + 1
    If IsNumeric(CStr(colonne(i))) Then F = colonne(i): Exit Function
Loop While i < rc
End Function
Elle est utilisée en E2 et cellules suivantes avec la formule =F("compte";A:A)

Nota : si l'on efface A12 la boucle Do/Loop va jusqu'à i = 1048576, en 1,67 seconde chez moi.

A+
 

Pièces jointes

  • VBA Classeur(1).xlsm
    17.2 KB · Affichages: 3

job75

XLDnaute Barbatruc
Pour éviter d'aller jusqu'à 1048576 si A12 est vide j'ai ajouté un test supplémentaire :
VB:
Function F(libel As String, colonne As Range)
Dim i&, rc&
F = ""
i = Application.Caller.Row
rc = colonne.Rows.Count
If InStr(LCase(colonne(i)), LCase(libel)) = 0 Then Exit Function
If Application.Count(colonne(i + 1).Resize(rc - i)) = 0 Then Exit Function
Do
    i = i + 1
    If IsNumeric(CStr(colonne(i))) Then F = colonne(i): Exit Function
Loop While i < rc
End Function
Fichier (2).
 

Pièces jointes

  • VBA Classeur(2).xlsm
    17.8 KB · Affichages: 3

Calou83

XLDnaute Nouveau
Bonjour,
Merci beaucoup pour cette solution. Le problème est que dans mon exemple j'ai indiqué n° compte pour simplifier mon explication. En réalité, j'indique le n° de compte ex 1001 2001 6004 etc :
Col A
1001 - XXX
texte
texte
18000

Sans VBA j'ai modifié la formule de Laurent comme suit :
Dans onglet 2 j'ai créer la liste des comptes que j'ai nommée Comptes
=SI(NON(ESTERREUR(RECHERCHEV(GAUCHE($A2;4);Comptes;1;FAUX)));SI(ESTNUM($A3);$A3;SI(ESTNUM($A4);$A4;SI(ESTNUM($A5);$A5;"")));"")

Un grand merci à vous tous
Bon dimanche
 

eriiic

XLDnaute Barbatruc
Bonjour à tous,

Sans liste de comptes en se servant du fait que tu as un format monétaire, un peu plus court en prime.
En E2 :
VB:
=SI(ET(ESTNUM(A2);CELLULE("format";A2)="S");DECALER($A$1;MIN(SI(ESTNUM(A3:A99);LIGNE(A3:A99);9999))-1;);"")
formule matricielle à valider avec Shift+Ctrl+Entrée
Régler A3:A99 selon le nombre maxi de lignes par compte.
eric
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16