Problème d'argument «Range» dans ma Fonction

  • Initiateur de la discussion Initiateur de la discussion pacoako
  • 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 !

pacoako

XLDnaute Occasionnel
Bonjour à tous!

J'ai un petit pépin avec ma fonction. En fait je crois que c'est vraiment au niveau que l'argument qu'il y a un problème..

Premièrement, est-il possible de passer comme valeur d'argument un Range de cellule qui sera en fait la même cellule dans laquelle se trouvera cette fonction..

Cette fonction renvoie #REF et je ne comprends pas pourquoi, car si je transforme cette fonction en Procédure , tout semble fonctionner...

Je ne peux malheureusement pas rapidement vous joindre un fichier exemple car il y a trop de données confid.. en fait je voulais simplement savoir si mon passage de ma cellule (Target as Range) comme argument était bien fait selon vous, ou si je m'y prend mal.. Ne vous cassez pas trop la tête avec le reste du code, il ne veut pas dire grand chose sans un fichier exemple..

Je vous laisse le code de la fonction et de la procédure. Merci encore une fois pour vos réflexions à ce sujet!

Passez une bonne fin de journée! A+

Code:
Function RatioATC(ByRef Target As Range) As Integer

Dim myCell As Object
Dim CalculatedRange As Object
Dim x As Integer
Dim StartColumn() As Integer
Dim EndColumn() As Integer
Dim CountEmptyCells As Integer
Dim CountValidation As Integer
Dim CountATC As Integer

ReDim StartColumn(1 To GetName(ThisWorkbook.Names("nGestionnaire")))
ReDim EndColumn(1 To GetName(ThisWorkbook.Names("nGestionnaire")))

For x = 1 To GetName(ThisWorkbook.Names("nGestionnaire"))
StartColumn(x) = F_Calendrier.Range("ZoneAcces_Gestionnaire" & x).Columns(2).Column 'Car la 1er colonne est la BlackColumn qu'on ne doit pas calculer
EndColumn(x) = F_Calendrier.Range("ZoneAcces_Gestionnaire" & x).Columns(1).Column + F_Calendrier.Range("ZoneAcces_Gestionnaire" & x).Columns.Count - 1
Next x

CountEmptyCells = 0
CountValidation = 0
CountATC = 0
For x = 1 To GetName(ThisWorkbook.Names("nGestionnaire"))
    Set CalculatedRange = Range(F_Calendrier.Cells(Target.Row, StartColumn(x)), F_Calendrier.Cells(Target.Row, EndColumn(x)))
    For Each myCell In CalculatedRange
    If myCell = "" Or myCell.Text = Null Then CountEmptyCells = CountEmptyCells + 1
    CountValidation = CountValidation + Application.CountIf(F_Calendrier.Range("Validation"), myCell.Value) - Application.CountIf(myCell, "ATC")
    CountATC = CountATC + Application.CountIf(myCell, "ATC")
    Next myCell
Next x

RatioATC = (CountEmptyCells - CountValidation) / CountATC

End Function

Code:
Private Sub testRatioATC()

Dim Target As Object
Dim myCell As Object
Dim CalculatedRange As Object
Dim x As Integer
Dim StartColumn() As Integer
Dim EndColumn() As Integer
Dim CountEmptyCells As Integer
Dim CountValidation As Integer
Dim CountATC As Integer
Dim RatioATC As Integer

ReDim StartColumn(1 To GetName(ThisWorkbook.Names("nGestionnaire")))
ReDim EndColumn(1 To GetName(ThisWorkbook.Names("nGestionnaire")))

Set Target = F_Calendrier.Range("DI4")

For x = 1 To GetName(ThisWorkbook.Names("nGestionnaire"))
StartColumn(x) = F_Calendrier.Range("ZoneAcces_Gestionnaire" & x).Columns(2).Column 'Car la 1er colonne est la BlackColumn qu'on ne doit pas calculer
EndColumn(x) = F_Calendrier.Range("ZoneAcces_Gestionnaire" & x).Columns(1).Column + F_Calendrier.Range("ZoneAcces_Gestionnaire" & x).Columns.Count - 1
Next x

CountEmptyCells = 0
CountValidation = 0
CountATC = 0
For x = 1 To GetName(ThisWorkbook.Names("nGestionnaire"))
    Set CalculatedRange = Range(F_Calendrier.Cells(Target.Row, StartColumn(x)), F_Calendrier.Cells(Target.Row, EndColumn(x)))
    For Each myCell In CalculatedRange
    If myCell = "" Or myCell.Text = Null Then CountEmptyCells = CountEmptyCells + 1
    CountValidation = CountValidation + Application.CountIf(F_Calendrier.Range("Validation"), myCell.Value) - Application.CountIf(myCell, "ATC")
    CountATC = CountATC + Application.CountIf(myCell, "ATC")
    Next myCell
Next x

RatioATC = (CountEmptyCells - CountValidation) / CountATC
MsgBox RatioATC

End Sub
 
Re : Problème d'argument «Range» dans ma Fonction

Ayayayayaye!! Oubliez tout!!! Ça buggait car RatioATC était utilisez comme nom de plage aussi. J'ai renommé ma fonction CalcRatioATC et tout fonctionne!

Bonne journée à tous! et désolé pour le post inutile :S!
 
Re : Problème d'argument «Range» dans ma Fonction

Bonjour pacoako,

Premièrement, est-il possible de passer comme valeur d'argument un Range de cellule qui sera en fait la même cellule dans laquelle se trouvera cette fonction..

Si je comprends bien, on entre par exemple dans la cellule A1 la formule :

=RatioATC(A1)

Il me semble que l'on obtient ainsi une très belle référence circulaire 😉

A+
 
- 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

Discussions similaires

Réponses
5
Affichages
917
Réponses
4
Affichages
738
  • Question Question
Microsoft 365 Erreur UBound
Réponses
4
Affichages
293
Retour