ERREUR D'EXÉCUTION '5' VBA - Excel

Bonjour,

j'essaie de programmer une macro pour reporter les données d'une feuille de calcul représentant un planning sur une autre feuille correspondant à un suivi en incluant certaines conditions en If.

Malgré la cohérence de mon code, le débogueur m'indique l'erreur d'exécution '5' : Argument ou appel de procédure incorrect.

Un codage avec une boucle While - Wend m'affiche la même erreur.

Quelqu'un aurait une solution de codage à me proposer ?

En vous remerçiant d'avance,

Resplendissant

capture2

Bonjour,

Malgré la cohérence de mon code

VBA ne pense pas comme toi ! Et je serais très volontiers de son avis !

Je trouve déjà VBA plutôt laxiste d'accepter des paramètres littéraux pour la méthode Cells, alors que la syntaxe prévoit :

...Cells(indexLigne,indexColonne)

Mais avec des Cells("a") ou Cells("v5:v"), là il a fort heureusement trouvé que c'était pousser le bouchon un peu loin !

Cordialement.

Bonjour,

Malgré la cohérence de mon code...

C'est un gag non ?

Et même en remplaçant Cells() par Range() (qui est plus approprié pour ce type d'adressage) le code génèrera des erreurs car des adresses du style "a5:a" ou des "b3:b" le compilateur trouvera ça indigeste !

Quand tu inscrits "Cells(", l'intellisense affiche bien les arguments demandés à savoir (comme le dit si bien MFerrand) l'index de ligne et l'index de colonne.

Cells(1, 1) fait référence à la cellule A1

Cells(1) fait aussi référence à A1 de même que Cells(, 1) car tu peux voir dans l'intellisense que les arguments demandés (RowIndex et ColumnIndex) sont entre crochets et ceci veux dire qu'il sont facultatifs mais c'est surtout "RowIndex" qui est facultatif car ceci "Cells(1, )" n'est pas accepté donc, si RowIndex est absent, ça sera toujours la première ligne qui sera utilisée et dans ce cas, Cells(2) fait référence à B1 de même que Cells(, 2).

Avec Range() tu peux indiquer une adresse de différentes façons :

Range("A5:A10") ou encore Range("A5", "A10")

Range(Cells(5, 1), Cells(10, 1))

Range("LeNomDeMaPlage") <-- nom d'une plage nommée

Range("A:A")<-- pour faire référence à une colonne entière (ceci ne marche pas : Range("A")

je dois en oublier sûrement..!

Merci pour vos réponses, je reviens vers vous si je trouve encore des problèmes sur mon code par très cohérent au niveau de la syntaxe vba.

Au moins j'aurai fait rire du monde sur le forum.

Cdlt

Bonjour,

La prochaine fois mets au moins le code, sinon mieux, un classeur, car une image n'est pas très aisée à lire...

Et ne t'offusque pas si on rigole devant certaines erreurs de syntaxe, dis-toi que dans ce cas, c'est qu'elles sont élémentaires, donc elles seront faciles à surmonter, et qu'on en a tous fait de la sorte à nos débuts...

Les problèmes d'adressage ne sont pas simples et, même expérimentés, cela ne va pas toujours de soi...

Cordialement.

Re,

Le codage sur vba me résiste encore une fois,

Je ne mets pas le classeur car c'est pour mon travail.

capture3

Voici mon code :

Sub Extraction()

Dim i As Integer

Dim DerniereLigne As Integer

DerniereLigne = Sheets("PLANNING").Cells(1, 1).CurrentRegion.End(xlDown).Row

Dim Flux As Range

Set Flux = Sheets("SUIVI").Cells(3, 1).Row(i)

Dim TypeExpé As Range

Set TypeExpé = Sheets("PLANNING").Cells(5, 1).Row(i)

Dim Destination As Range

Set Destination = Sheets("SUIVI").Cells(3, 1).Row(i)

Dim Destinataires As Range

Set Destinataires = Sheets("PLANNING").Cells(5, 7).Row(i)

Dim Villes As Range

Set Villes = Sheets("PLANNING").Cells(5, 8 ).Row(i)

Dim Bât As Range

Set Bât = Sheets("SUIVI").Cells(3, 3).Row(i)

Dim Bâtiments As Range

Set Bâtiments = Sheets("PLANNING").Cells(5, 5).Row(i)

Dim Tour As Range

Set Tour = Sheets("SUIVI").Cells(3, 4).Row(i)

Dim Tournée As Range

Set Tournée = Sheets("PLANNING").Cells(5, 11).Row(i)

Dim HEURE As Range

Set HEURE = Sheets("SUIVI").Cells(3, 5).Row(i)

Dim RDV As Range

Set RDV = Sheets("PLANNING").Cells(5, 21).Row(i)

Dim B2 As Range

Set B2 = Sheets("PLANNING").Cells(5, 16).Row(i)

For i = 1 To DerniereLigne

While B2 >= 1

If TypeExpé = ("DIRECT") Or TypeExpé = ("INTERDEPOT") Then

Villes = Flux

If TypeExpé = ("PLATEFORME") Then

Destinataires = Flux

End If

Bâtiments = Bât

Tournée = Tour

RDV = HEURE

End If

Wend

Next i

End Sub

Si tu n'as pas de procédure Property dans ton code, le message d'erreur est inadéquat pour rechercher la source de l'erreur.

Une remarque d'abord sur les conventions d'écriture du code qui ont une utilité pas seulement conventionnelle !

On déclare les variables (toutes) en tête de procédure, le code exécutable venant à la suite, et si on indente son code il sera plus lisible et permettra d'en détecter plus facilement les erreurs.

Tu utilises une variable i non initialisée. Sa valeur sera donc : 0

Quand tu écris :

Set Flux = Sheets("SUIVI").Cells(3, 1).Row(i)

.Cells(3, 1), c'est : A3 et .Row(0) [de A3], c'est A2 [de la feuille SUIVI]

Je ne sais pas si c'est bien ce que tu vises, mais à toi de t'y pencher.

While B2 >= 1

A voir à la lumière de la définition de B2 qui représente la cellule P4 de PLANNING.

Cordialement.

Bonsoir,

J'ai réussi à obtenir ce que je voulais !!!!!!

Pour info mon planning comporte un millier de lignes.

et j'ai inclus une ligne de code qui supprime mes lignes vides lorsque que la boucle n'inclue pas les conditions requises.

Pour une première expérience sur VBA je suis plutôt fier de moi.

Voici mon code final pour les plus curieux

Sub Extraction()

Dim i As Integer
i = 5

Dim DerniereLigne As Integer
DerniereLigne = Sheets("PLANNING").Cells(5, 16).End(xlDown).Row

For i = 5 To DerniereLigne
Dim j As Integer
j = i - 2

Dim B2 As Variant
B2 = Sheets("PLANNING").Cells(i, 16)

If B2 >= 1 Then

Dim TypeExpé As Variant
TypeExpé = Sheets("PLANNING").Cells(i, 1)

Dim Destinataires As Variant
Destinataires = Sheets("PLANNING").Cells(i, 7)

Dim Villes As Variant
Villes = Sheets("PLANNING").Cells(i, 8)

Dim Bâtiments As Variant
Bâtiments = Sheets("PLANNING").Cells(i, 5)

Dim Tournée As Variant
Tournée = Sheets("PLANNING").Cells(i, 12)

Dim RDV As String
RDV = Sheets("PLANNING").Cells(i, 22)

       If TypeExpé = "PLATEFORME" And Villes = Vide Then

            'Destinataires = Destination
            Sheets("PLANNING").Cells(i, 7).Copy
            Sheets("SUIVI").Cells(j, 2).Select
            ActiveSheet.Paste

            'TypeExpé = Flux
            Sheets("PLANNING").Cells(i, 1).Copy
            Sheets("SUIVI").Cells(j, 1).Select
            ActiveSheet.Paste

            'Bâtiments = Bât
            Sheets("PLANNING").Cells(i, 5).Copy
            Sheets("SUIVI").Cells(j, 3).Select
            ActiveSheet.Paste

            'Tournée = Tour
            Sheets("PLANNING").Cells(i, 12).Copy
            Sheets("SUIVI").Cells(j, 4).Select
            ActiveSheet.Paste
            'RDV = HEURE
            RDV = Sheets("PLANNING").Cells(i, 22).Copy
            Sheets("SUIVI").Cells(j, 5).Select
            ActiveSheet.Paste

            ElseIf TypeExpé = "DIRECT" Or TypeExpé = "INTERDEPOT" Then

            'Villes = Flux
            Sheets("PLANNING").Cells(i, 8).Copy
            Sheets("SUIVI").Cells(j, 2).Select
            ActiveSheet.Paste

            'TypeExpé = Flux
            Sheets("PLANNING").Cells(i, 1).Copy
            Sheets("SUIVI").Cells(j, 1).Select
            ActiveSheet.Paste

            'Bâtiments = Bât
            Sheets("PLANNING").Cells(i, 5).Copy
            Sheets("SUIVI").Cells(j, 3).Select
            ActiveSheet.Paste

            'Tournée = Tour
            Sheets("PLANNING").Cells(i, 12).Copy
            Sheets("SUIVI").Cells(j, 4).Select
            ActiveSheet.Paste
            'RDV = HEURE
            RDV = Sheets("PLANNING").Cells(i, 22).Copy
            Sheets("SUIVI").Cells(j, 5).Select
            ActiveSheet.Paste

            End If

End If

Next i

    Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete

End Sub

Il y a déjà un progrès avec l'utilisation des balises Code.

Mais je ne vais pas répéter ce que j'ai déjà dit sur l'écriture du code... en tout cas à cette heure-ci je ne lis du code que s'il respecte les règles d'écriture et est parfaitement indenté...

Bonne soirée.

Bonjour,

A quoi bon utiliser et affecter des valeurs à des variables qui ne sont pas utilisées par la suite ?

Dim Destinataires As Variant
Dim Bâtiments As Variant
Dim Tournée As Variant
Dim RDV As String
'...
'...
Destinataires = Sheets("PLANNING").Cells(i, 7)
Bâtiments = Sheets("PLANNING").Cells(i, 5)
Tournée = Sheets("PLANNING").Cells(i, 12)
RDV = Sheets("PLANNING").Cells(i, 22)

Le code pourrait se résumer à ceci (j'évite les copier/coller car moins rapide qu'une affectation de valeur par .Value = .Value). La variable "Vide" est ni déclarée ni initialisée donc, je ne suis pas sûr que ton code marche tel quel !

Sub Extraction()

    Dim i As Integer
    Dim DerniereLigne As Integer
    Dim j As Integer
    Dim B2 As Variant '<-- probablement Long ou Entier !
    Dim TypeExpé As String
    Dim Villes As String
    Dim Vide As Variant

    i = 5

    DerniereLigne = Sheets("PLANNING").Cells(5, 16).End(xlDown).Row

    For i = 5 To DerniereLigne

        j = i - 2

        B2 = Sheets("PLANNING").Cells(i, 16)

        If B2 >= 1 Then

            TypeExpé = Sheets("PLANNING").Cells(i, 1)

            'où la variable "Vide" prend-elle sa valeur avant d'être utilisée ?
            If TypeExpé = "PLATEFORME" And Villes = Vide Then

                'Destinataires = Destination
                Sheets("SUIVI").Cells(j, 2).Value = Sheets("PLANNING").Cells(i, 7).Value
                'TypeExpé = Flux
                Sheets("SUIVI").Cells(j, 1).Value = Sheets("PLANNING").Cells(i, 1).Value
                'Bâtiments = Bât
                Sheets("SUIVI").Cells(j, 3).Value = Sheets("PLANNING").Cells(i, 5).Value
                'Tournée = Tour
                Sheets("SUIVI").Cells(j, 4).Value = Sheets("PLANNING").Cells(i, 12).Value
                'RDV = HEURE
                Sheets("SUIVI").Cells(j, 5).Value = Sheets("PLANNING").Cells(i, 22).Value

            ElseIf TypeExpé = "DIRECT" Or TypeExpé = "INTERDEPOT" Then

                'Villes = Flux
                Sheets("SUIVI").Cells(j, 2).Value = Sheets("PLANNING").Cells(i, 8).Value
                'TypeExpé = Flux
                Sheets("SUIVI").Cells(j, 1).Value = Sheets("PLANNING").Cells(i, 1).Value
                'Bâtiments = Bât
                Sheets("SUIVI").Cells(j, 3).Value = Sheets("PLANNING").Cells(i, 5).Value
                'Tournée = Tour
                Sheets("SUIVI").Cells(j, 4).Value = Sheets("PLANNING").Cells(i, 12).Value
                'RDV = HEURE
                Sheets("SUIVI").Cells(j, 5).Value = Sheets("PLANNING").Cells(i, 22).Value

            End If

        End If

    Next i

    Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete

End Sub

Merci pour ce code plus simple et surtout plus rapide !

Rechercher des sujets similaires à "erreur execution vba"