XL 2021 Débogage VBA

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

Marie1608

XLDnaute Nouveau
Bonjour,

En faisant tourner ma macro, j'ai une erreur d'exécution 13 "incompatibilité de type" qui s'affiche et en cliquant sur débogage j'ai ceci surligné mais impossible de trouver d'où vient l'erreur (c'est la 1ere ligne qui est surlignée en jaune)

VB:
 If GetInfoCell And workerinf Then ' F55 07/03/2024
                            XL.Cells(XLRow, 1) = workerinf
                            XL.Cells(XLRow, 2) = DateInf
                            XL.Cells(XLRow, 3) = SI.Cells(CodeRow, j + AmountCol)

Pourriez-vous m'aider ?
 
Bonjour,

En faisant tourner ma macro, j'ai une erreur d'exécution 13 "incompatibilité de type" qui s'affiche et en cliquant sur débogage j'ai ceci surligné mais impossible de trouver d'où vient l'erreur (c'est la 1ere ligne qui est surlignée en jaune)

VB:
 If GetInfoCell And workerinf Then ' F55 07/03/2024
                            XL.Cells(XLRow, 1) = workerinf
                            XL.Cells(XLRow, 2) = DateInf
                            XL.Cells(XLRow, 3) = SI.Cells(CodeRow, j + AmountCol)

Pourriez-vous m'aider ?
Bonjour, le fichier en exemple sauf si confidentiel merci bcp 🙂
 
Bonjour Marie,
Pouvez vous donner un peu plus de code ?
En particulier les déclarations. Que sont XL et SI.
Bonjour,

voici le code en entier

VB:
Sub CreateExcelFile()

    StrCurrency = "EUR"
    frmMSGeneral3D.Show
    
End Sub

Sub CreateExcelFile_Go(language, CodeRow, DateCol, WorkerCol, _
                       Level1Col, Level1Def, Level2Col, Level2Def, _
                       Level3Col, Level3Def, AmountRow, AmountCol, _
                       TpWorkRow, TpWorkCol, TpLvl1Row, TpLvl1Col, _
                       TpLvl2Row, TpLvl2Col, TpLvl3Row, TpLvl3Col, _
                       RSelCol, CSelRow, SSelTxt)
    NbSht = Worksheets.Count
    
    'Euro-Bef****************************************
    Dim iNbDeci As Integer
    If StrCurrency = "BEF" Then
        iNbDeci = 2
    Else
        iNbDeci = 4
    End If
    'Euro-Bef****************************************
    
    Set XL = Sheets.Add(Sheets(1))
    XL.Name = "Saiau-Excel"
    Call SaiauTitles(XL, language)
    
    XLRow = 2
    For k = 1 To NbSht
        
        Set SI = Sheets(k + 1)
        If SSelTxt = "" Then
            GetInfoSht = True
        Else
            If UCase(Left(SI.Name, Len(SSelTxt))) <> UCase(SSelTxt) Then
                GetInfoSht = True
            Else
                GetInfoSht = False
            End If
        End If
        
        If GetInfoSht Then
            If TpWorkRow <> 0 Then
                workerinf = SI.Cells(TpWorkRow, TpWorkCol)
            End If
            If TpLvl1Row <> 0 Then
                Level1Inf = SI.Cells(TpLvl1Row, TpLvl1Col)
            End If
            If TpLvl2Row <> 0 Then
                Level2Inf = SI.Cells(TpLvl2Row, TpLvl2Col)
            End If
            If TpLvl3Row <> 0 Then
                Level3Inf = SI.Cells(TpLvl3Row, TpLvl3Col)
            End If
            
            Set Tbl = SI.Cells(AmountRow, AmountCol).CurrentRegion
            ' Lc le 3/12/2008
            'NbRow = Tbl.Rows.Count - (AmountRow - 1)
            NbRow = Tbl.Rows.Count - 1
            NbCol = Tbl.Columns.Count - (AmountCol - 1)
            
            For i = 0 To (NbRow - 1)
                If RSelCol = 0 Then
                    GetInfoRow = True
                Else
                    If SI.Cells(i + AmountRow, RSelCol) = "" Then
                        GetInfoRow = True
                    Else
                        GetInfoRow = False
                    End If
                End If
                
                If GetInfoRow Then
                    If SI.Cells(i + AmountRow, DateCol) <> "" Then
                        DateInf = CDate(SI.Cells(i + AmountRow, DateCol))
                    End If
                    If WorkerCol <> 0 Then
                        If SI.Cells(i + AmountRow, WorkerCol) <> "" Then
                            workerinf = SI.Cells(i + AmountRow, WorkerCol)
                        Else
                            If TpWorkRow <> 0 Then
                                workerinf = SI.Cells(TpWorkRow, TpWorkCol)
                            End If
                        End If
                    End If
                    If Level1Col <> 0 Then
                        If SI.Cells(i + AmountRow, Level1Col) <> "" Then
                            Level1Inf = SI.Cells(i + AmountRow, Level1Col)
                        Else
                            If TpLvl1Row <> 0 Then
                                Level1Inf = SI.Cells(TpLvl1Row, TpLvl1Col)
                            End If
                        End If
                    End If
                    If Level2Col <> 0 Then
                        If SI.Cells(i + AmountRow, Level2Col) <> "" Then
                            Level2Inf = SI.Cells(i + AmountRow, Level2Col)
                        Else
                            If TpLvl2Row <> 0 Then
                                Level2Inf = SI.Cells(TpLvl2Row, TpLvl2Col)
                            End If
                        End If
                    End If
                    If Level3Col <> 0 Then
                        If SI.Cells(i + AmountRow, Level3Col) <> "" Then
                            Level3Inf = SI.Cells(i + AmountRow, Level3Col)
                        Else
                            If TpLvl3Row <> 0 Then
                                Level3Inf = SI.Cells(TpLvl3Row, TpLvl3Col)
                            End If
                        End If
                    End If
                    
                    For j = 0 To (NbCol - 1)
                        If SI.Cells(i + AmountRow, j + AmountCol) = "" Then
                            GetInfoCell = False
                        Else
                            If CSelRow = 0 Then
                                GetInfoCell = True
                            Else
                                If SI.Cells(CSelRow, j + AmountCol) = "" Then
                                    GetInfoCell = True
                                Else
                                    GetInfoCell = False
                                End If
                            End If
                        End If
                        
                        If GetInfoCell And workerinf Then ' F55 07/03/2024
                            XL.Cells(XLRow, 1) = workerinf
                            XL.Cells(XLRow, 2) = DateInf
                            XL.Cells(XLRow, 3) = SI.Cells(CodeRow, j + AmountCol)
'************************************************
                            ' B.Maes    20/08/2003
                            ' Put numeric display format on result cell.
                            XL.Cells(XLRow, 4).NumberFormat = "0.00"
                            ' B.Maes    20/08/2003
                            ' By multiplying the contents of the cell by 1, we force a numeric result in the SAIAU-sheet.
'                            XL.Cells(XLRow, 4) = Application.Round(SI.Cells(i + AmountRow, j + AmountCol) * 1, 2)
                            
                            valeur = Trim(SI.Cells(i + AmountRow, j + AmountCol))
                            If valeur = "" Then valeur = 0
                            
                            XL.Cells(XLRow, 4) = Application.Round(valeur * 1, 2)
                            
'************************************************
                            If Level1Col <> 0 Then
                                XL.Cells(XLRow, 5) = Level1Inf
                            Else
                                If TpLvl1Row <> 0 Then
                                    XL.Cells(XLRow, 5) = Level1Inf
                                Else
                                    XL.Cells(XLRow, 5) = Level1Def
                                End If
                            End If
                            If Level2Col <> 0 Then
                                XL.Cells(XLRow, 6) = Level2Inf
                            Else
                                If TpLvl2Row <> 0 Then
                                    XL.Cells(XLRow, 6) = Level2Inf
                                Else
                                    XL.Cells(XLRow, 6) = Level2Def
                                End If
                            End If
                            If Level3Col <> 0 Then
                                XL.Cells(XLRow, 7) = Level3Inf
                            Else
                                If TpLvl3Row <> 0 Then
                                    XL.Cells(XLRow, 7) = Level3Inf
                                Else
                                    XL.Cells(XLRow, 7) = Level3Def
                                End If
                            End If
                            XL.Cells(XLRow, 14) = StrCurrency
                            XLRow = XLRow + 1
                        End If
                    Next j
                End If
            Next i
        End If
        
    Next k
    
    For i = 1 To 18
        Columns(i).EntireColumn.AutoFit
    Next i
End Sub

Sub Automatic()
    CreateExcelFile
    If OkButton Then
        CreateTextFile
    End If
End Sub
 
Lors du débogage, soit sur erreur soit sur arrêt demandé par touche F9, sélectionnez une expression à contrôler de la ligne puis menu Débogage ou clic droit, commande Ajouter un espion.
 
Dernière édition:
Hello,
le If est louche car GetInfoCell est un booléen alors que workerinf a l'air d'être une valeur de cellule.
Place un Debug.Print juste avant le If pour voir ce que valent GetInfoCell et workerinf comme ceci par exemple :
VB:
Debug.Print GetInfoCell, workerinf
If GetInfoCell And workerinf Then ' F55 07/03/2024
et dis nous ce qui est affiché dans la fenêtre d'exécution du VBA.
Ami calmant, J.P
 
Re....
quand je regarde cette partie de code où se trouve ton erreur
VB:
                       If GetInfoCell And workerinf Then ' F55 07/03/2024
                            XL.Cells(XLRow, 1) = workerinf
                            XL.Cells(XLRow, 2) = DateInf
                            XL.Cells(XLRow, 3) = SI.Cells(CodeRow, j + AmountCol)
'************************************************
                            ' B.Maes    20/08/2003
                            ' Put numeric display format on result cell.
                            XL.Cells(XLRow, 4).NumberFormat = "0.00"
                            ' B.Maes    20/08/2003
                            ' By multiplying the contents of the cell by 1, we force a numeric result in the SAIAU-sheet.
'                            XL.Cells(XLRow, 4) = Application.Round(SI.Cells(i + AmountRow, j + AmountCol) * 1, 2)
                          
                            valeur = Trim(SI.Cells(i + AmountRow, j + AmountCol))
                            If valeur = "" Then valeur = 0
                          
                            XL.Cells(XLRow, 4) = Application.Round(valeur * 1, 2)

je ne vois pas de déclaration de variables en début de code sauf un seul et unique Dim iNbDeci As Integer
Les autres variables utilisées ne sont pas déclarées... Déjà c'est une source d'ennuis similaires à celui que tu rencontres
Je présume qu'en début de module ou de tes modules il n'y a pas la clause Option Explicit
Celle-ci permet de vérifier que toutes les variables sont bien typées et déclarées.
J'en déduis aussi par le bout de code que tu as posté que tes variables sont de type variant et Excel fait le typage comme il peut.
Ce que je comprends aussi dans cet extrait tu t'attends à tester des booléens : GetInfoCell And workerinf
Mais sont-ils réellement des Boolean ?

Afin d'y voir plus clair dans ton code et d'éviter d'autres plantages sur les types incompatibles je t'invite à revoir entièrement tes lignes de code et de "typer" tes variables par la clause Dim (malheureusement c'est le gros défaut des langages modernes qui acceptent ce genre de programmation à défaut du COBOL qui lui demande de la rigueur🙂)... sauf si celles-ci sont peut-être typées et déclarées en Global dans un module spécifique.

Juste quelques exemples
NbSht = Worksheets.Count ==> Dim NbSht as integer
XLRow = 2 ==> Dim XLRow as Long
GetInfoSht = True ==> Dim GetInfoSht as Boolean
For i = 0 To (NbRow - 1) => le For i comme ça pas très propre
au préalable déclarer
Dim lngIndex as Long
et For lngIndex = 0 To (NbRow - 1)

Idem dans la déclaration des arguments de la fonction que tu appelles
Sub CreateExcelFile_Go(language, CodeRow, DateCol, WorkerCol, _
Level1Col, Level1Def, Level2Col, Level2Def, _
Level3Col, Level3Def, AmountRow, AmountCol, _
TpWorkRow, TpWorkCol, TpLvl1Row, TpLvl1Col, _
TpLvl2Row, TpLvl2Col, TpLvl3Row, TpLvl3Col, _
RSelCol, CSelRow, SSelTxt)

Ils sont tous automatiquement de type Variant ! ==> c'est source d'ennuis comme ceux que tu rencontres

Je n'apporte pas réellement de solution à ton problème mais par ces conseils je t'évite d'en avoir d'autres...
Pour une meilleure aide il faudrait certainement ton fichier excel complet sauf si confidentiel... dans ce tu postes le contenu de tous les modules... car là nous n'avons qu'un extrait et il sera difficile de t'apporter plus t'aide.... les autres experts vba du forum seront aussi de mon avis sur tous ces conseils 🙂
Bien à toi, pour mieux t'aider télécharges les codes des modules et outillages que j'ai posté ainsi que ceux des autres experts VBA du site tu verras comment appliquer ces quelques règles.
 
Dernière édition:
Bonjour, dans l'éditeur VBE touche F9 sur la ligne de code à pister
Nan, c'pas ça un espion. 😉

Un espion c'est : clic-droit sur l'expression à espionner puis choisir "Ajouter un espion".
Mais il ne faut pas oublier d'afficher la fenêtre qui affiche les espions.



Sinon, mettre un point d'arrêt sur la ligne fautive, et passer la souris sur l'expression dont on veut connaître la valeur.
 
Dernière édition:
Nan, c'pas ça un espion. 😉

Un espion c'est : clic-droit sur l'expression à espionner puis choisir "Ajouter un espion".
Bonjour, Ou'ps super bien vu 🙂 c'est l'habitude qui a pris le dessus...
Mais bon... la résolution du problème passera par une bonne révision du code et d'un bon typage des variables en début de module ou de fonction... déjà ça limitera la casse 🙂 - merci bonne journée
 
Re
petite piste
workerinf = SI.Cells(TpWorkRow, TpWorkCol)
et je vois ça
If CSelRow = 0 Then
GetInfoCell = True
tu tentes de comparer un booléen typé à la volée par l'affectation à True et workerinf = SI.Cells(TpWorkRow, TpWorkCol) ou workerinf reçoit la valeur d'une cellule... pouvant contenir de l'alphanumérique ou chaine de caractères... mais certainement pas un booléen... ou alors je passe à côté..... passe en mode Debug tu verras le type des variables qu'à réalisé VBA
 
Nan, c'pas ça un espion. 😉

Un espion c'est : clic-droit sur l'expression à espionner puis choisir "Ajouter un espion".
Mais il ne faut pas oublier d'afficher la fenêtre qui affiche les espions.



Sinon, mettre un point d'arrêt sur la ligne fautive, et passer la souris sur l'expression dont on veut connaître la valeur.
Bonjour,

Merci j'ai essayé le code espion mais il me note <Expression non définie dans le contexte> Du coup comment savoir ce qui bug ?
 
- 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
Retour