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
Bonjour,
Malgré la cohérence de mon code
VBA ne pense pas comme toi !
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.
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 !