erreur d'exécution "9" vba sur plage

piskely

XLDnaute Junior
Bonjour à tous,
j'ai besoin d'un coup de main pour finaliser mon projet.
Il s'agit de la plage ("C5:C60") qui contient les rencontres aau format (equipeA vs. equipeB)
et la plage ("D5:60") qui contient les résultats au format (scoreA-scoreB).
Si toute la plage est remplie, il n y a aucun problème mais s'il y a une cellule de la plage qui est vide: j'ai ce message d'erreur (Erreur d'exécution "9").
je vous mets le code et les niveaux où ça bloc.
Merci d'avance.

VB:
Sub classement()

Dim i As Integer
Dim j As Integer
Dim equipeA As String
Dim equipeB As String
Dim resultat As String
Dim scoreA As Integer
Dim scoreB As Integer

' Remise à zéro du tableau
Range("I5:Q12").Value = 0

' Boucle pour parcourir toutes les rencontres
For i = 5 To 60

' Récupération des noms des équipes et du résultat
    equipeA = Split(Range("C" & i).Value, " vs. ")(0)    '<=== si une seule cellule matchs (C) est vide
    equipeB = Split(Range("C" & i).Value, " vs. ")(1)
    resultat = Range("D" & i).Value
    scoreA = Split(resultat, "-")(0)    '<=== si une seule cellule scores (D) est vide
    scoreB = Split(resultat, "-")(1)

    ' Boucle pour parcourir toutes les équipes
    For j = 5 To 12
    
        ' Mise à jour des données pour l'équipe A
        If Range("H" & j).Value = equipeA Then
            Range("I" & j).Value = Range("I" & j).Value + 1
            If scoreA > scoreB Then
                Range("J" & j).Value = Range("J" & j).Value + 1
                Range("L" & j).Value = Range("L" & j).Value + 2
            ElseIf scoreA < scoreB Then
                Range("K" & j).Value = Range("K" & j).Value + 1
                If scoreA = 0 And scoreB = 20 Then
                    Range("L" & j).Value = Range("L" & j).Value + 0
                    Range("P" & j).Value = Range("P" & j).Value + 1
                Else
                    Range("L" & j).Value = Range("L" & j).Value + 1
                End If
            End If
            Range("M" & j).Value = Range("M" & j).Value + scoreA
            Range("N" & j).Value = Range("N" & j).Value + scoreB
            Range("O" & j).Value = (Range("M" & j).Value - Range("N" & j).Value)
            Range("Q" & j).Value = (Range("M" & j).Value - Range("N" & j).Value) / Range("I" & j).Value
        End If

        ' Mise à jour des données pour l'équipe B
        If Range("H" & j).Value = equipeB Then
            Range("I" & j).Value = Range("I" & j).Value + 1
            If scoreB > scoreA Then
                Range("J" & j).Value = Range("J" & j).Value + 1
                Range("L" & j).Value = Range("L" & j).Value + 2
            ElseIf scoreB < scoreA Then
                Range("K" & j).Value = Range("K" & j).Value + 1
                If scoreB = 0 And scoreA = 20 Then
                    Range("L" & j).Value = Range("L" & j).Value + 0
                    Range("P" & j).Value = Range("P" & j).Value + 1
                Else
                    Range("L" & j).Value = Range("L" & j).Value + 1
                End If
            End If
            Range("M" & j).Value = Range("M" & j).Value + scoreB
            Range("N" & j).Value = Range("N" & j).Value + scoreA
        Range("O" & j).Value = (Range("M" & j).Value - Range("N" & j).Value)
        Range("Q" & j).Value = (Range("M" & j).Value - Range("N" & j).Value) / Range("I" & j).Value
        End If
    Next j
Next i

'Tri du classement
Range("L5:Q12").Sort Key1:=Range("L5:L12"), Order1:=xlDescending, _
key2:=Range("Q5:Q12"), order2:=xlDescending, Header:=xlNo

End Sub
 
Solution
En faite la fonction Split ne va pas pouvoir traiter une chaîne vide et causera une erreur d'exécution. Il fallait avant tout vérifier si la cellule est vide avant d'utiliser la fonction Split.

Merci beaucoup à tous :)

VB:
Sub classement()

Dim i As Integer
Dim j As Integer
Dim equipeA As String
Dim equipeB As String
Dim resultat As String
Dim scoreA As Integer
Dim scoreB As Integer

' Remise à zéro du tableau
Range("I5:Q12").Value = 0

' Boucle pour parcourir toutes les rencontres
For i = 5 To 60
   
    ' Vérifier si la cellule C contient une valeur
    If Not IsEmpty(Range("C" & i).Value) Then
       
        ' Récupération des noms des équipes et du résultat
        equipeA = Split(Range("C" & i).Value, " vs. ")(0)
        equipeB...

Gégé-45550

XLDnaute Accro
Bonjour, le calcul bloque car VBA ne peut pas évaluer la formule
Code:
equipeA = Split(Range("C" & i).Value, " vs. ")(0)
et toutes celles du même type lorsque Range("C" & i).Value est vide.
Essayez ceci :
VB:
Sub classement()

Dim i As Integer
Dim j As Integer
Dim equipeA As String
Dim equipeB As String
Dim resultat As String
Dim scoreA As Integer
Dim scoreB As Integer

' Remise à zéro du tableau
Range("I5:Q12").Value = 0

' Boucle pour parcourir toutes les rencontres
For i = 5 To 60

' Récupération des noms des équipes et du résultat
    equipeA = IIf(IsError(Split(Range("C" & i).Value, " vs. ")(0)), "match incomplet", Split(Range("C" & i).Value, " vs. ")(0))  '<=== si une seule cellule matchs (C) est vide
    equipeB = IIf(IsError(Split(Range("C" & i).Value, " vs. ")(1)), "match incomplet", Split(Range("C" & i).Value, " vs. ")(1))
    resultat = Range("D" & i).Value
    scoreA = IIf(IsError(Split(resultat, "-")(0)), "score incomplet", Split(resultat, "-")(0))  '<=== si une seule cellule scores (D) est vide
    scoreB = IIf(IsError(Split(resultat, "-")(1)), "score incomplet", Split(resultat, "-")(1))

    ' Boucle pour parcourir toutes les équipes
    For j = 5 To 12
    
        ' Mise à jour des données pour l'équipe A
        If Range("H" & j).Value = equipeA Then
            Range("I" & j).Value = Range("I" & j).Value + 1
            If scoreA > scoreB Then
                Range("J" & j).Value = Range("J" & j).Value + 1
                Range("L" & j).Value = Range("L" & j).Value + 2
            ElseIf scoreA < scoreB Then
                Range("K" & j).Value = Range("K" & j).Value + 1
                If scoreA = 0 And scoreB = 20 Then
                    Range("L" & j).Value = Range("L" & j).Value + 0
                    Range("P" & j).Value = Range("P" & j).Value + 1
                Else
                    Range("L" & j).Value = Range("L" & j).Value + 1
                End If
            End If
            Range("M" & j).Value = Range("M" & j).Value + scoreA
            Range("N" & j).Value = Range("N" & j).Value + scoreB
            Range("O" & j).Value = (Range("M" & j).Value - Range("N" & j).Value)
            Range("Q" & j).Value = (Range("M" & j).Value - Range("N" & j).Value) / Range("I" & j).Value
        End If

        ' Mise à jour des données pour l'équipe B
        If Range("H" & j).Value = equipeB Then
            Range("I" & j).Value = Range("I" & j).Value + 1
            If scoreB > scoreA Then
                Range("J" & j).Value = Range("J" & j).Value + 1
                Range("L" & j).Value = Range("L" & j).Value + 2
            ElseIf scoreB < scoreA Then
                Range("K" & j).Value = Range("K" & j).Value + 1
                If scoreB = 0 And scoreA = 20 Then
                    Range("L" & j).Value = Range("L" & j).Value + 0
                    Range("P" & j).Value = Range("P" & j).Value + 1
                Else
                    Range("L" & j).Value = Range("L" & j).Value + 1
                End If
            End If
            Range("M" & j).Value = Range("M" & j).Value + scoreB
            Range("N" & j).Value = Range("N" & j).Value + scoreA
        Range("O" & j).Value = (Range("M" & j).Value - Range("N" & j).Value)
        Range("Q" & j).Value = (Range("M" & j).Value - Range("N" & j).Value) / Range("I" & j).Value
        End If
    Next j
Next i

'Tri du classement
Range("L5:Q12").Sort Key1:=Range("L5:L12"), Order1:=xlDescending, _
key2:=Range("Q5:Q12"), order2:=xlDescending, Header:=xlNo

End Sub
Cordialement,
 

piskely

XLDnaute Junior
Bonjour, le calcul bloque car VBA ne peut pas évaluer la formule
Code:
equipeA = Split(Range("C" & i).Value, " vs. ")(0)
et toutes celles du même type lorsque Range("C" & i).Value est vide.
Essayez ceci :
VB:
Sub classement()

Dim i As Integer
Dim j As Integer
Dim equipeA As String
Dim equipeB As String
Dim resultat As String
Dim scoreA As Integer
Dim scoreB As Integer

' Remise à zéro du tableau
Range("I5:Q12").Value = 0

' Boucle pour parcourir toutes les rencontres
For i = 5 To 60

' Récupération des noms des équipes et du résultat
    equipeA = IIf(IsError(Split(Range("C" & i).Value, " vs. ")(0)), "match incomplet", Split(Range("C" & i).Value, " vs. ")(0))  '<=== si une seule cellule matchs (C) est vide
    equipeB = IIf(IsError(Split(Range("C" & i).Value, " vs. ")(1)), "match incomplet", Split(Range("C" & i).Value, " vs. ")(1))
    resultat = Range("D" & i).Value
    scoreA = IIf(IsError(Split(resultat, "-")(0)), "score incomplet", Split(resultat, "-")(0))  '<=== si une seule cellule scores (D) est vide
    scoreB = IIf(IsError(Split(resultat, "-")(1)), "score incomplet", Split(resultat, "-")(1))

    ' Boucle pour parcourir toutes les équipes
    For j = 5 To 12
  
        ' Mise à jour des données pour l'équipe A
        If Range("H" & j).Value = equipeA Then
            Range("I" & j).Value = Range("I" & j).Value + 1
            If scoreA > scoreB Then
                Range("J" & j).Value = Range("J" & j).Value + 1
                Range("L" & j).Value = Range("L" & j).Value + 2
            ElseIf scoreA < scoreB Then
                Range("K" & j).Value = Range("K" & j).Value + 1
                If scoreA = 0 And scoreB = 20 Then
                    Range("L" & j).Value = Range("L" & j).Value + 0
                    Range("P" & j).Value = Range("P" & j).Value + 1
                Else
                    Range("L" & j).Value = Range("L" & j).Value + 1
                End If
            End If
            Range("M" & j).Value = Range("M" & j).Value + scoreA
            Range("N" & j).Value = Range("N" & j).Value + scoreB
            Range("O" & j).Value = (Range("M" & j).Value - Range("N" & j).Value)
            Range("Q" & j).Value = (Range("M" & j).Value - Range("N" & j).Value) / Range("I" & j).Value
        End If

        ' Mise à jour des données pour l'équipe B
        If Range("H" & j).Value = equipeB Then
            Range("I" & j).Value = Range("I" & j).Value + 1
            If scoreB > scoreA Then
                Range("J" & j).Value = Range("J" & j).Value + 1
                Range("L" & j).Value = Range("L" & j).Value + 2
            ElseIf scoreB < scoreA Then
                Range("K" & j).Value = Range("K" & j).Value + 1
                If scoreB = 0 And scoreA = 20 Then
                    Range("L" & j).Value = Range("L" & j).Value + 0
                    Range("P" & j).Value = Range("P" & j).Value + 1
                Else
                    Range("L" & j).Value = Range("L" & j).Value + 1
                End If
            End If
            Range("M" & j).Value = Range("M" & j).Value + scoreB
            Range("N" & j).Value = Range("N" & j).Value + scoreA
        Range("O" & j).Value = (Range("M" & j).Value - Range("N" & j).Value)
        Range("Q" & j).Value = (Range("M" & j).Value - Range("N" & j).Value) / Range("I" & j).Value
        End If
    Next j
Next i

'Tri du classement
Range("L5:Q12").Sort Key1:=Range("L5:L12"), Order1:=xlDescending, _
key2:=Range("Q5:Q12"), order2:=xlDescending, Header:=xlNo

End Sub
Cordialement,
Bonjour Gégé,
Merci d'avoir pris le temps pour regarder et répondre à ma sollicitation.
Malheureusement ça ne passe pas, il affiche le même message d'erreur.

Je mets le fichier pour faciliter l'analyse.
Merci encore
 

Pièces jointes

  • NM1 22-23 V2 copie.xlsm
    32.3 KB · Affichages: 1

piskely

XLDnaute Junior
En faite la fonction Split ne va pas pouvoir traiter une chaîne vide et causera une erreur d'exécution. Il fallait avant tout vérifier si la cellule est vide avant d'utiliser la fonction Split.

Merci beaucoup à tous :)

VB:
Sub classement()

Dim i As Integer
Dim j As Integer
Dim equipeA As String
Dim equipeB As String
Dim resultat As String
Dim scoreA As Integer
Dim scoreB As Integer

' Remise à zéro du tableau
Range("I5:Q12").Value = 0

' Boucle pour parcourir toutes les rencontres
For i = 5 To 60
   
    ' Vérifier si la cellule C contient une valeur
    If Not IsEmpty(Range("C" & i).Value) Then
       
        ' Récupération des noms des équipes et du résultat
        equipeA = Split(Range("C" & i).Value, " vs. ")(0)
        equipeB = Split(Range("C" & i).Value, " vs. ")(1)
    Else
        ' Si la cellule C est vide, passer à l'itération suivante
        Exit For
    End If
    If Not IsEmpty(Range("D" & i).Value) Then
        resultat = Range("D" & i).Value
        scoreA = Split(resultat, "-")(0)
        scoreB = Split(resultat, "-")(1)
    Else
        ' Si la cellule D est vide, passer à l'itération suivante
        Exit For
    End If


    ' Boucle pour parcourir toutes les équipes
    For j = 5 To 12
   
        ' Mise à jour des données pour l'équipe A
        If Range("H" & j).Value = equipeA Then
            Range("I" & j).Value = Range("I" & j).Value + 1
            If scoreA > scoreB Then
                Range("J" & j).Value = Range("J" & j).Value + 1
                Range("L" & j).Value = Range("L" & j).Value + 2
            ElseIf scoreA < scoreB Then
                Range("K" & j).Value = Range("K" & j).Value + 1
                If scoreA = 0 And scoreB = 20 Then
                    Range("L" & j).Value = Range("L" & j).Value + 0
                    Range("P" & j).Value = Range("P" & j).Value + 1
                Else
                    Range("L" & j).Value = Range("L" & j).Value + 1
                End If
            End If
            Range("M" & j).Value = Range("M" & j).Value + scoreA
            Range("N" & j).Value = Range("N" & j).Value + scoreB
            Range("O" & j).Value = (Range("M" & j).Value - Range("N" & j).Value)
            Range("Q" & j).Value = (Range("M" & j).Value - Range("N" & j).Value) / Range("I" & j).Value
        End If

        ' Mise à jour des données pour l'équipe B
        If Range("H" & j).Value = equipeB Then
            Range("I" & j).Value = Range("I" & j).Value + 1
            If scoreB > scoreA Then
                Range("J" & j).Value = Range("J" & j).Value + 1
                Range("L" & j).Value = Range("L" & j).Value + 2
            ElseIf scoreB < scoreA Then
                Range("K" & j).Value = Range("K" & j).Value + 1
                If scoreB = 0 And scoreA = 20 Then
                    Range("L" & j).Value = Range("L" & j).Value + 0
                    Range("P" & j).Value = Range("P" & j).Value + 1
                Else
                    Range("L" & j).Value = Range("L" & j).Value + 1
                End If
            End If
            Range("M" & j).Value = Range("M" & j).Value + scoreB
            Range("N" & j).Value = Range("N" & j).Value + scoreA
        Range("O" & j).Value = (Range("M" & j).Value - Range("N" & j).Value)
        Range("Q" & j).Value = (Range("M" & j).Value - Range("N" & j).Value) / Range("I" & j).Value
        End If
    Next j
Next i

'Tri du classement
Range("L5:Q12").Sort Key1:=Range("L5:L12"), Order1:=xlDescending, _
key2:=Range("Q5:Q12"), order2:=xlDescending, Header:=xlNo
 

Statistiques des forums

Discussions
315 095
Messages
2 116 162
Membres
112 674
dernier inscrit
AKD