Microsoft 365 probleme passage paramètre dans une fonction

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 !

thenesol

XLDnaute Junior
bonjour à tous

dans le code ci dessous avec passage de matrice en paramètre, je n'arrive pas à comprendre pourquoi la compilation est refusée,
apparemment à la ligne "If compare_ligne(tablo1, tablo3, i, ii) = True Then"

une idée...?

merci !!



VB:
Option Explicit


Function compare_ligne(matrice1() As Variant, matrice2() As Variant, i&, ii&) As Boolean
Dim go_on As Boolean


go_on = True
If matrice1(i, 1) = matrice2(ii, 1) Then
    If matrice1(i, 2) = matrice2(ii, 2) Then
        If matrice1(i, 3) = matrice2(ii, 3) Then
        Else: go_on = False
        Exit Function
    Else: go_on = False
    Exit Function
Else: go_on = False
Exit Function


End Function


Sub test00()


Dim ncol%, i&, ii&
Dim tablo1 As Variant, tablo2 As Variant, tablo3 As Variant, tablo4 As Variant
Dim toto1, toto3, toto0, go_on As Boolean


For i = 1 To UBound(tablo1)
    For ii = 1 To UBound(tablo3)
    If compare_ligne(tablo1, tablo3, i, ii) = True Then
        tablo1(i, ncol) = Chr(1) 'repère
        tablo3(ii, ncol) = Chr(1) 'repère
    End If
    Next ii
Next i

compare_ligne=go_on

End Sub
 
Bonjour,
Dans tes déclarations de tableaux, soit tu mets des parenthèses partout, soit tu n'en mets pas sur les Variant.
Ton écriture des tests If Then Else est particulière. Je ne sais pas si ça marche mais c'est pas simple à lire pour moi en tous cas.
 
merci pour ce retour

concernant les If Then Else , je dois tester une succession de conditions et stopper à la 1ere fausse; je n'ai pas trouvé d'autre façon de l'écrire.

par contre, avec ou sans parenthèses, impossible d'exécuter ce code, je ne comprends pas pourquoi
 
For i = 1 To UBound(tablo1)
Y a rien dans Tablo1 !!

VB:
Function compare_ligne(matrice1() As Variant, matrice2() As Variant, i&, ii&) As Boolean
    Dim go_on As Boolean
    
    go_on = True
    If matrice1(i, 1) = matrice2(ii, 1) Then
        If matrice1(i, 2) = matrice2(ii, 2) Then
            If matrice1(i, 3) = matrice2(ii, 3) Then
            Else: go_on = False
            Exit Function
        Else: go_on = False
        Exit Function
    Else: go_on = False
    compare_ligne = go_on
End Function

Sub test00()
    Dim ncol%, i&, ii&
    Dim tablo1() As Variant, tablo2() As Variant, tablo3() As Variant, tablo4() As Variant
    Dim toto1, toto3, toto0, go_on As Boolean
    
    For i = 1 To UBound(tablo1)
        For ii = 1 To UBound(tablo3)
            If compare_ligne(tablo1, tablo3, i, ii) = True Then
                tablo1(i, ncol) = Chr(1) 'repère
                tablo3(ii, ncol) = Chr(1) 'repère
            End If
        Next ii
    Next i
End Sub
 
Pour moi (qui n'aime pas les lignes multi-instructions)
Code:
If <test> Then
    <Instruction(s)>
Else
    <Instruction(s)>
End If

Ou
  
If <test> Then <Instruction> Else <Instruction>

Ou

If <test> Then
    <Instruction(s)>
End If

Ou

If <test> Then <Instruction>
 
merci le passant :
mais quelle serait la solution pour tester un ensemble de conditions, pour lequel dès qu'une d'entre elle est testée fausse alors retourner "FAUX", sans chercher à évaluer les suivantes, mais si toutes sont vraies alors retourner VRAI... ?
 
Dernière édition:
oui, ça j'avais
mais on évalue toutes les valeurs des AND
comme j'ai un très grand nombre de lignes à traiter, et la plupart donnant "FAUX", je cherchais une solution qui permette d'aller plus vite en quittant l'évaluation dès que l'une d'elles est fausse
 
Quelque chose comme ceci

VB:
Select Case matrice1(i, 1) = matrice2(ii, 1) And matrice1(i, 2) = matrice2(ii, 2) And matrice1(i, 3) = matrice2(ii, 3)
Case True
    MsgBox "c'est vrai"
Case False
    MsgBox "c'est faux"
'    go_on = False
'    Exit Function
End Select

Il me semble que tout est évalué en 1 seule fois
Et si tu penses que le false sera le résultat majoritaire tu inverses

VB:
Select Case matrice1(i, 1) = matrice2(ii, 1) And matrice1(i, 2) = matrice2(ii, 2) And matrice1(i, 3) = matrice2(ii, 3)
Case False
    MsgBox "c'est faux"
'    go_on = False
'    Exit Function
Case True
    MsgBox "c'est vrai"
End Select

Tu mets 1 timer pour voir lequel est plus rapide if then ou select case

1698619681514.png

 
- 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
12
Affichages
325
  • Question Question
Microsoft 365 Excel VBA
Réponses
5
Affichages
352
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
250
Retour