Microsoft 365 probleme passage paramètre dans une fonction

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
 

Dudu2

XLDnaute Barbatruc
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.
 

thenesol

XLDnaute Junior
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
 

Dudu2

XLDnaute Barbatruc
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
 

Dudu2

XLDnaute Barbatruc
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>
 

thenesol

XLDnaute Junior
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:

thenesol

XLDnaute Junior
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
 

Phil69970

XLDnaute Barbatruc
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

 

Discussions similaires

Réponses
3
Affichages
324
Réponses
5
Affichages
323

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
315 087
Messages
2 116 083
Membres
112 655
dernier inscrit
fannycordi