Function personnelle

Bonjour,

Je cherche la fonction qui me permettra de trouver le nombre de cellules non-vides sur une plage de cellules.

Dans cette plage, des nombre et des caractères alphanumériques.

Merciii!

Bonjour

Pourquoi pas

=NBVAL(C4:I21)

Bonjour Chris,

Merci d'être passé par là.

Oui, je connais mais l'écriture d'une fonction en vba qui fait la même chose.

En fait ce qui me pose problème, c'est de passer les coordonnées de la plage de cellules à la fonction.

Si les données changent dans la plage de cellule, je voudrai que la fonction, fasse le calcul.

J'ai essayé dans mon projet ceci. J'ai en plus un array mais ça ne change pas le problème.

Public Plage As String
Function SommeETP(ByRef Plage) As Double
Dim t, c, i%
With Sheets("bd")
   t = .Range("B2:C8")
End With
For Each c In Range(Plage)
   If c <> "" Then
      Stop
      For i = i To UBound(t, 1)
         If t(i, 1) = c Then Total = Total + t(i, 2)
      Next i
   End If
Next c
SommeETP = Total
End Function

La ligne ci-dessous plante car la plage de cellule ne remonte pas à la fonction.

For Each c In Range(Plage)

Dans ma feuille cette formule adaptée à mon exemple

 =sommeETP(C4:I21)

Voilà mon problème.

RE

Sans la feuille bd pour apprécier t pas facile de voir

bonjour,

edit : salut 78Chris

en écrivant ton instruction ainsi

=sommeETP(C4:I21)

tu passes un objet range à ta fonction et non un string

pour passer un string qui contient les références de ta plage

=sommeETP("C4:I21")

ou mieux tu adaptes le code de ta fonction pour utiliser la plage (range)

Function SommeETP(ByRef Plage) As Double
Dim t, c, i%
With Sheets("bd")
   t = .Range("B2:C8")
End With
For Each c In Plage
   If c <> "" Then
      Stop
      For i = i To UBound(t, 1)
         If t(i, 1) = c Then Total = Total + t(i, 2)
      Next i
   End If
Next c
SommeETP = Total
End Function

dans les 2 cas tu dois supprimer l'instruction

Public plage As String

re, et bonjour h2so4,

Le fichier pour tester car j'avais essayé de déclarer ma plage en range sans résultat. Même, je me demande si ce type fonctionne.

Merci

bonjour,

voici une correction tu as mis un i pour un 1

Function SommeETP(ByRef Plage) As Double
Dim t, c, i%
With Sheets("bd")
   t = .Range("B2:C8")
End With
For Each c In Plage
   If c <> "" Then
      For i = 1 To UBound(t, 1)
         If t(i, 1) = c Then Total = Total + t(i, 2)
      Next i
   End If
Next c

SommeETP = Total

End Function

re

Function SommeETP(ByRef Plage) As Double
Dim t, c, i%
With Sheets("bd")
   t = .Range("B2:C8")
End With
For Each c In Plage
   If c <> "" Then
      For i = 1 To UBound(t, 1)
         If t(i, 1) = c Then Total = Total + t(i, 2): Exit For
      Next i
   End If
Next c

SommeETP = Total

End Function

Edit : H2So4 plus rapide. Mais le exit For évite de continuer à chercher inutilement, même si, dans un array, c'est rapide

Ho le c.. je cherche depuis une heure facile.

Je vous remercie tous les deux.

Tout va bien maintenant.

Amicalement

RE

Vois mon edit concernant Exit For

Oui, j'ai vu. On accélère la procédure.

Merci encore!

re Chris, et h2oso4,

Je reviens sur le post car figure vous que depuis que j'ai une deuxième fonction en place sur la même feuille la première est plus lente.

Évidement elles agissent sur les mêmes plages de cellules.

Y a t-il quelque chose à faire.

première fonction que tu vous m'avez corrigée

Function SommeETP(ByRef Plage) As Double
Dim t, c, i%, Total
With Sheets("bd")
   t = .Range("B2:C8")
End With
For Each c In Plage
   If c <> "" Then
      For i = i To UBound(t, 1)
         If t(i, 1) = c Then Total = Total + t(i, 2)
      Next i
   End If
Next c
SommeETP = Total
End Function

Deuxième fonction qui est utilisée dans une MFC (merci du coup de pouce à Patrice33740)

Function TrouveDouble(ByRef cellule As Range, plage As Range) As Variant
Dim c As Range, trouve As Boolean
  If cellule.Count > 1 Then
    TrouveDouble = CVErr(XlCVError.xlErrRef)
  Else
    For Each c In plage.Cells
      If c.Value <> "" Then
        If cellule.Value = Mid(c.Value, 7, 50) Then trouve = True: Exit For
      End If
    Next c
    TrouveDouble = trouve
  End If
End Function

Merci pour ton avis.

Cdt

Bonjour

La 1ère contient 2 boucles donc plus long

Une variante avec 2 array

With Sheets("bd")
   t1 = .Range("B2:C8")
End With

t2 = Plage

For j = 1 To UBound(t2)
    For k = 1 To UBound(t2, 2)
        If t2(j, k) <> "" Then
            For i = 1 To UBound(t1, 1)
                goon = True
                If t1(i, 1) = t2(j, k) Then Total = Total + t1(i, 2): goon = False: Exit For
            Next i
            If goon = False Then Exit For
        End If
    Next k
Next j

SommeETP = Total

End Function

re, merci pour ta réponse.

Je pense que problème n'est pas là.

La fonction tourne plusieurs fois (beaucoup de fois) avant d'afficher le résultat.

Je viens de recréer la situation sur le fichier joint.

Mais évidemment dans mon projet, plusieurs MFC et plusieurs cellules avec la formule sommeETP().

Merci encore du temps accordé.

RE

Le calcul a lieu 2 fois ce qui est normal puisque la MFC provoque un recalcul sur la plage

J'ai ajouté le Exit For qui manquait...

Re,

Ou je ne suis pas doué, mais je pense que ça ne change rien.

Tu parles bien du Exit for de

If t(i, 1) = c.Value Then total = total + t(i, 2): Exit For

Cdt

RE

Le exit for évite de continuer inutilement à boucler

Je n'ai que 2 calculs. C'est instantané.

Si les plages sont volumineuses cela peut être plus être plus long

Ne pas valider en matriciel (comme sur un de tes exemples)

Ok, merci.

Ca ne le fait que deux fois car il y a dans la feuille exemple une TrouveDouble et une SommeETP mais dans mon projet c'est 5 de chaque x 12 feuilles.

D'ailleurs dans mon projet j'avais à changer des dates (en d'autres lieux que les plages concernées par les fonctions) et elle se mettait en route pendant une bonne seconde à chaque validation de date.

Tu imagines la galère à l'utilisation du fichier? J'ai dû la mettre en remarque pour bosser tranquille. Pas cool!

Cdt

RE,

J'ai anonymé le projet pour que vous puissiez tester et voir le problème.

Pour tester, se rendre sur la feuille du mois de Mai

Dans la deuxième semaine, sur la droite il y a des noms. Ils sont issus du planning feuille congé.

Dans cette feuille du mois de Mai, dans le tableau de gauche choisir dans les listes de validation un nom. S'il se trouve (TrouveDouble) dans la partie droite il devient rouge selon la MFC. Très bien!

En dessous du n° de semaine càd S20 la somme des ETP (fonction SommeETP() )se fait en lien avec la liste des salariés de la feuille paramètre.

Si comme moi vous avez la chance d'avoir deux écrans , ouvrez le module ETP où vous trouverez les deux fonctions.

Admirez le feu d'artifice dans la barre des titres de l'editeur VBE. Si vous n'avez pas deux écran, le feu d'artifice dure le temps de retrouver votre curseur (flèche durant le feu d'artifice, et croix dès que prêt)

Si vous mettez un point d'arrêt sur la ligne sommeetp=total vous constaterez 60 passages.

Bizarrement la fonction TrouveDouble ne s'initialise qu'une seule fois comme si elle accordait ses violons avec les 60 MFC. (12 feuilles x5 trouvedouble).

Je cherche mais je ne "trouve" pas!

Si vous avez une idée, elle est la bienvenue

Merci

RE

Cela ne calcule pas les autres feuilles normalement sauf si lien entre les plages concernées

Dans la mesure où tu travailles sur des plages c'est un peu comme les formules matricielles : cela n'est pas neutre en calcul...

Rechercher des sujets similaires à "function personnelle"