• Initiateur de la discussion Initiateur de la discussion tanerbus
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

T

tanerbus

Guest
bonjour sous excel j'ai fait une formule

=SOMME.SI(SI(NBCAR(C9)=3;feuil3!F:F;feuil3!G:G);C9;feuil3!$T:$T)

cette formule est un peut long est compliquer pour un utilisateur basic
j'aimerais donc la crée en vba un fonction pour obtenir le résultat suivant :

=formule(C9)

merci
 
Dernière modification par un modérateur:
Re : formul en vba

de nouveau de retour j'ai un petit souci

la Function formul de mromain marche avec as Double quand je fait dans excel, dans une cellule
=formul(c12) ' et que dans la cellule c12 (il y a 601 en format nombre) par exemple, la formule marche

par contre si je fait
=formul(601) ' la sa marche plus ( #VALEUR!)

et je voudrai que les deux possibilité marche

avez vous une solution ?
 
Re : formul en vba

bonsoir tanerbus,

je pense à un truc (au pire, car c'est vraiment moche) :
Créer une nouvelle fonction avec as double en entré, puis (attention, c'est là que c'est moche!😱(les puristes : FERMEZ LES YEUX), écrire la valeur dans une cellule vide (feuille cachée par exemple) et appeler la première fonction...
Du genre :
Code:
Public function formul2(valeur as double)as Double
dim maCellueVide as range
set maCellueVide = ...
maCellueVide.value = valeur
formul2= formul(maCellueVide)
maCellueVide.value = vbNullString
end function

un peu de précision : la fonction "WorksheetFunction.SumIf" (qui fait la rapidité de la macro) n'accepte apparemment que des objets de type Range en entrée d'où cette bidouille (je précise que je ne cherche aucune excuse 🙂)

mais, je pense que tu trouvera une meilleure solution sur ce magnifique forum🙄...

A+ et bonne nuit
 
Dernière édition:
Re : formul en vba

Tu dois pouvoir garder la même macro, simplement en supprimant le .Value :
Code:
Public Function formul(critere As Double) As Integer

Dim plage  As Range, somme_plage As Range

If Len([B][COLOR="Red"]critere[/COLOR][/B]) = 3 Then
    Set plage = ThisWorkbook.Sheets("Feuil3").Range("F:F")
Else
    Set plage = ThisWorkbook.Sheets("Feuil3").Range("G:G")
End If

Set somme_plage = ThisWorkbook.Sheets("Feuil3").Range("T:T")

formul = WorksheetFunction.SumIf(plage, critere, somme_plage)

End Function
 
Dernière édition:
Re : formul en vba

désoler la solution de Marce32 ne marche pas

et celle de mromain je ne suis pas un puriste j'ai donc regarder le Code mais j'ai pas compris même si j'ai compris l'idée
le problème et que =formul sera répété beaucoup de fois (environ 500) dans plusieurs feuille du classeur ( donc je pense pas que sa soit la bonne solution


j'ai une autre proposition a faire peut on créé la même formul que celle du depart mais comme cela

=formul(c16;1)
=formul(610;0) ou =formul(610)

quand il y a 1 on dit a la formule que c'est une cellule sinon on lui dit que ces une valeur quand y 0 ou (vide)

Malheureusement je suis encore trop novice pour écrire en vba mais je progresse et vos code m'aide dans ce sens
 
Dernière modification par un modérateur:
Re : formul en vba

bonjour

Donc la solution moche donnerai ceci en une fonction (à tester) :
Code:
Public Function formul(critere As Variant) As Double
If TypeName(critere) = "Double" Then
    ThisWorkbook.Sheets("_tmp_").Range("A1").Value = critere
    formul = formul(ThisWorkbook.Sheets("_tmp_").Range("A1"))
    ThisWorkbook.Sheets("_tmp_").Range("A1").Value = vbNullString
ElseIf TypeName(critere) = "Range" Then
    Dim plage  As Range, somme_plage As Range
    If Len(critere.Value) = 3 Then
        Set plage = ThisWorkbook.Sheets("Feuil3").Range("F:F")
    Else
        Set plage = ThisWorkbook.Sheets("Feuil3").Range("G:G")
    End If
    Set somme_plage = ThisWorkbook.Sheets("Feuil3").Range("T:T")
    formul = WorksheetFunction.SumIf(plage, critere, somme_plage)
Else
    MsgBox "Mauvaise utilisation de la fonction."
End If
End Function
Il faut donc une feuille nommée "_tmp_" que tu peux mettre ensuite en very hidden pour être sur que personne n'y accède.

A+
 
Dernière édition:
Re : formul en vba

bonsoir tanerbus,

très bonne initiative que de joindre un fichier.
Je ne sais pas si c'est que chez moi, mais je n'ai pas trouvé de fichier dans ton zip.

PS: peux-tu mettre dans ton fichier le résultat attendu (que la formule doit retourner) dans plusieurs situations (en fonction d'un range, d'un double)

A+
 
Re : formul en vba

Salut,

Dans le dernier fichier posté, en C14 tu as la formule =Marcel32(C9) et tu obtiens le résultat 4 583 583.
Si en C14 tu mets la formule =Marcel32(62) tu obtiens bien le même résultat : 4 583 583.
En tous les cas ça fonctionne chez moi sous WinXP avec EXCEL 2000.


En revanche, il y a une erreur de calcul quand le nombre de caractères est égal à 3... 🙁
Essaye avec ceci comme première ligne de la macro :
Code:
If [B]Len([COLOR="Red"]LTrim(Str([/COLOR]critere[COLOR="red"]))[/COLOR])[/B] = 3 Then
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Retour