XL 2010 Aide rappel fonction

dev_co

XLDnaute Occasionnel
Bonjour
J'aimerai me remémorer l'écriture des fonctions , car pas utilisé depuis ...... ??
ci joint un petit exo pour réparation
merci
 

Pièces jointes

  • Test_Fct.xlsm
    15.7 KB · Affichages: 19

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Dev_co,
Je ne sais pas ce que fait votre fonction mais elle doit se terminer par affecter une valeur à la fonction pour le retour, du type :
VB:
affect = der
Un petit tuto simple ( voire simpliste ) sur les fonctions perso :
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Le plus simple alors est de passer la liste en paramètre, c'est plus souple si la liste bouge.
Par exemple :
VB:
Function Affect(Pays$, Liste As Range)
    Dim T, i%, Ville$
    T = Liste                       ' Transfert liste dans array ( plus rapide )
    For i = 1 To UBound(T)
        If T(i, 1) = Pays And T(i, 2) <> "" Then
            Ville = T(i, 2)
        End If
    Next i
    If Ville = "" Then              ' Gestion réponse
        Affect = "Pas de réponse"   ' Rien trouvé
    Else
        Affect = Ville              ' Sinon réponse ville
    End If
End Function
 

Pièces jointes

  • Test_Fct (1).xlsm
    15.8 KB · Affichages: 4

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
il me faut la liste entière de chaque pays
Soyez un peu plus explicite. La liste entière de quoi ? des villes ?
Mais alors c'est antinomique de votre demande initiale :
cela va afficher la dernière ville connue
Ma fonction remonte la dernière ville trouvée du pays demandé.
Sinon fournissez un fichier représentatif avec l'attendu.
 

dev_co

XLDnaute Occasionnel
Bonjour
Quand je dis liste entière cela veut dire liste entière en D de tous les pays en A mais une seule fois à côté sera la dernière ville enregistrée connue
Je remets le 1er fichier avec ma liste non exhaustive pour le moment
 

Pièces jointes

  • Test_Fct.xlsm
    16.2 KB · Affichages: 4

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Ca, fallait comprendre. :)
En fait je balaye la col A selon ma valeur en D
Pour moi D était rempli.

Une fonction n'est pas très judicieux car il va falloir dire 1er, 2eme, 3eme pays ... mieux vaut dans ce cas une macro événementielle.

Un essai en PJ, la macro s'exécute automatiquement quand on sélectionne la feuille Résultat. En A il met tous les pays sans doublon, en B met la dernière ville trouvée pr pays.

VB:
Sub Worksheet_Activate()
    Dim DL%, N%, i%, Pays$, Ville$
    Application.ScreenUpdating = False
    [A:B].ClearContents
    With Sheets("Feuil1")
        DL = .Range("A65500").End(xlUp).Row
        Range("A1:A" & DL) = .Range("A1:A" & DL).Value                              ' Copie colle liste pays
        T = .Range("A1:B" & DL)
    End With
    ActiveSheet.Range("$A$1:$A$" & DL).RemoveDuplicates Columns:=1, Header:=xlNo    ' Supprime doublon
    DL = Range("A65500").End(xlUp).Row
    For N = 1 To DL
        Pays = Cells(N, "A"): Ville = ""
        For i = 1 To UBound(T)                                                      ' Recherche dernière ville
            If T(i, 1) = Pays And T(i, 2) <> "" Then
                Ville = T(i, 2)
            End If
        Next i
        If Ville <> "" Then Cells(N, "B") = Ville                                   ' Affiche dernière ville
    Next N
End Sub
On peut faire un tri alpha sur les pays. Option non faite pour l'instant.
 

Pièces jointes

  • Test_Fct (3).xlsm
    17.7 KB · Affichages: 2

sylvanu

XLDnaute Barbatruc
Supporter XLD
Je n'avais pas compris que c'était une expérience. :oops:
Car vraiment ici, une fonction n'est pas l'optimum. ceci dit c'est faisable.

Alors "just for the fun", en PJ la fonction :
Code:
Function Parcours(NoPays%, NoItem%)
' NoPays est le Nème pays à chercher, NoItem=1 pour pays, 2 pour ville
' On considère la liste dans la même feuille que la fonction
    Dim DL%, IndexPays%, PaysTrouvé$, i%, T
    Parcours = ""
    Application.Volatile                                ' La fonction est recalculée à chaque modification de cellule
    With ActiveSheet                                    ' On transfert la liste dans un array pour aller plus vite
        DL = .Range("A65500").End(xlUp).Row             ' Dernière ligne de la liste
        T = .Range("A1:B" & DL)                         ' Copie colle liste pays dans l'array T
    End With
    IndexPays = 0: PaysTrouvé = ""                      ' Init variables
    For i = 1 To UBound(T)                              ' On parcourt le tableau
        If T(i, 1) <> "" Then                           ' Si un pays est présent
            If T(i, 1) <> PaysTrouvé Then               ' et s'il est différent de celui mémorisé, donc c'est un nouveau
                IndexPays = IndexPays + 1               ' On incrémente le N° de pays trouvé
                PaysTrouvé = T(i, 1)                    ' On mémorise le nom du pays
                If IndexPays = NoPays Then Exit For     ' Si le N° de pays  = N° demandé on sort
            End If
        End If
    Next i
    If NoItem = 1 And NoPays = IndexPays Then           ' Si la fonction demande de remonter le pays
        Parcours = PaysTrouvé                           ' On remonte l'info
        Exit Function                                   ' On sort de la fonction
    End If
    For i = UBound(T) To 1 Step -1                      ' On arrive ici si on demande la ville
        If NoPays > IndexPays Then Exit Function        ' Si le N° demandé est > au max trouvé on sort
        If T(i, 1) = PaysTrouvé And T(i, 2) <> "" And NoItem = 2 Then
            Parcours = T(i, 2)                          ' On transfert la ville
            Exit Function                               ' On sort de la fonction
        End If
    Next i
End Function
Les explications et syntaxe sont dans le fichier.
Comme vous le voyez, à chaque recalcul d'une fonction, on a un transfert de la liste en array, ce qui n'est pas optimum en terme de temps de calcul.
 

Pièces jointes

  • Test_Fct (4).xlsm
    18.6 KB · Affichages: 0

dev_co

XLDnaute Occasionnel
Merci bien pour l'intérêt et pour la recherche
là ça se complique pour moi , mais c'est à conserver
Sinon je voulais comprendre pourquoi dans mon 1er post si je fais = affect(...) déjà cela reste comme du texte dans la cellule ?? alors que après = A.. l'intuitif me donné Affect ?
Enfin qu'est ce qui fait qu'elle ne tourne pas ? à mon avis un passage de param. ?
J'en avais déjà écris mais il y a ........! 10ans
 

Membres actuellement en ligne

Statistiques des forums

Discussions
312 827
Messages
2 092 555
Membres
105 451
dernier inscrit
mariane_lp