Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Fonction personalisée imcompatibilité de type tableau attendu

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 !

Hoareau

XLDnaute Occasionnel
Bonjour

J'essaie de faire une fonction personnalisée, appelée par VBA

Plage peut prendre soit la valeur tableau, soit la valeur range

j'ai ce message:

<<< imcompatibilité de type, tableau défini par l'utilisateur attendu >>>

merci


Public Function Compte_Tranche_2(Plage As Range, ByRef Plage(), t_1 As Integer, t_2 As Integer) As Long

If IsArray(Plage) = True Then

For i = 1 To UBound(Plage)
Plage(i) = i

If i.Value >= t_1 And i.Value <= t_2 Then


Compte_Tranche_2 = Compte_Tranche_2 + 1

Next
'""""""""""""""""""""""""""""""""""""
Else
Dim C As Range
Compte_Tranche_2 = 0
For Each C In Plage
If C.Value >= t_1 And C.Value <= t_2 Then

Compte_Tranche_2 = Compte_Tranche_2 + 1
End If

Next C
End Function
 
Re : Fonction personalisée imcompatibilité de type tableau attendu

Salut Hoareau,

Je vois quelques incohérences dans ton code:

Public Function Compte_Tranche_2(Plage As Range, ByRef Plage(), t_1 As Integer, t_2 As Integer) As Long
Tu déclares à la fois Plage comme un Range et aussi comme Array????

If IsArray(Plage) = True Then
Je pense que c'est là que la macro se perd car elle recherche un Array alors que tu lui demande de travailler sur un Range.

For i = 1 To UBound(Plage)
Plage(i) = i

If i.Value >= t_1 And i.Value <= t_2 Then
où est le endif?

Compte_Tranche_2 = Compte_Tranche_2 + 1

Next
'""""""""""""""""""""""""""""""""""""
Else
Dim C As Range
Compte_Tranche_2 = 0
For Each C In Plage
If C.Value >= t_1 And C.Value <= t_2 Then

Compte_Tranche_2 = Compte_Tranche_2 + 1
End If

Next C
End Function
 
Re : Fonction personalisée imcompatibilité de type tableau attendu

Bonjour Hoareau, bonjour le forum,

Pour moi il manque deux End If ou la structure entre les boucles For... Next et les conditions If... End If est à revoir :
Code:
Public Function Compte_Tranche_2(Plage As Range, ByRef Plage(), t_1 As Integer, t_2 As Integer) As Long
Dim C As Range
If IsArray(Plage) = True Then
    For i = 1 To UBound(Plage)
        Plage(i) = i
        If i.Value >= t_1 And i.Value <= t_2 Then
            Compte_Tranche_2 = Compte_Tranche_2 + 1
        End If '<------------------------------ ICI
    Next
Else
    Compte_Tranche_2 = 0
    For Each C In Plage
        If C.Value >= t_1 And C.Value <= t_2 Then
            Compte_Tranche_2 = Compte_Tranche_2 + 1
        End If
    Next C
End If '<------------------------------ ICI
End Function

[Édition]
Bonjour Nairolf on s'est croisé...
 
Re : Fonction personalisée imcompatibilité de type tableau attendu

J'ai regardé d'un peu plus près avec ton fichier (plus facile de voir ce que tu veux avec à vrai dire), voici ce que je te propose :
Sub test_1()
Dim A As Variant
A = Array(1, 2, 3, 4, 5)
Cells(1, 10) = Compte_Tranche_2(1, 5, A)

End Sub

Public Function Compte_Tranche_2(t_1 As Integer, t_2 As Integer, Plage As Variant) As Long

For i = 0 To UBound(Plage)
If Plage(i) >= t_1 And Plage(i) <= t_2 Then
Compte_Tranche_2 = Compte_Tranche_2 + 1
End If
Next
End Function


Salut Robert 😉

EDIT:Entre la 1ère réponse et la modif, remplacement du code car mauvais, j'avais répondu trop vite avant d'avoir testé toutes les lignes du code. En espérant être maintenant dans le vrai.
 
Dernière édition:
Re : Fonction personalisée imcompatibilité de type tableau attendu

merci pour la partie tableau, cela fonctionne impeccable

Inversion de t_1 et t_2, a t'elle une raison précise

Ce que je cherchai à faire, comme précisé dans le premier post, c'est que la fonction fonctionne aussi bien sur une plage de cellulles que sur un tableau, double emploi

A première vue ce n'est pas possible, la résolution de la partie tableau m'a bien dépanné
 
Re : Fonction personalisée imcompatibilité de type tableau attendu

L'inversion n'a pas de raison spécifique.

Pour le double emploi essaye avec ça, peut-être que ça te servira:
Sub test_1()
Dim A As Variant
Dim B As Range
'A = Array(1, 2, 3, 4, 5)
A = Array()
Set B = ActiveSheet.Range("A1:E1")
Cells(1, 10) = Compte_Tranche_2(1, 5, A, B)
End Sub
Public Function Compte_Tranche_2(t_1 As Integer, t_2 As Integer, Table As Variant, Plage As Range) As Long
If UBound(Table) <> -1 Then
For i = 0 To UBound(Table)
If Table(i) >= t_1 And Table(i) <= t_2 Then
Compte_Tranche_2 = Compte_Tranche_2 + 1
End If
Next
Else
For i = 1 To WorksheetFunction.Count(Plage)
If Plage.Cells(1, i) >= t_1 And Plage.Cells(1, i) <= t_2 Then
Compte_Tranche_2 = Compte_Tranche_2 + 1
End If
Next
End If
End Function
 
Re : Fonction personalisée imcompatibilité de type tableau attendu

C'est possible (même probable) que mon code soit optimisable, mais à mon avis difficile de faire plus court avec 2 boucles et 3 conditions.

Si tu veux absolument réduire le nombre de lignes, tu peux par exemple remplacer:

If Table(i) >= t_1 And Table(i) <= t_2 Then
Compte_Tranche_2 = Compte_Tranche_2 + 1
End If

Par:

If Table(i) >= t_1 And Table(i) <= t_2 Then Compte_Tranche_2 = Compte_Tranche_2 + 1
 
- 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

  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
1 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…