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

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

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...
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, 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

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
 
- 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 Export données
Réponses
4
Affichages
482
  • Question Question
Microsoft 365 VBA Transpose
Réponses
11
Affichages
727
Réponses
3
Affichages
569
Réponses
4
Affichages
332
Réponses
2
Affichages
371
Réponses
3
Affichages
485
Retour