Problème code VBA
Anonyma23
Messages postés
11
Statut
Membre
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je sollicite votre aide car je dois coder en VBA mais je suis une novice.
Alors j'ai deux classeurs (fichier ordo et fichier expe) : l'objectif est de rechercher chaque numéro de commande situé à la colonne K du fichier expe dans la colonne 3 du fichier ordo.
Si le numéro est trouvé dans la colonne 3, alors on va regarder une cellule correspondant à la quantité commandé (fichier ordo) et on revérifie que cette quantité est la même dans le fichier expe.
Si tous ces paramètres sont respectés alors on retourne dans le fichier ordo à la ligne correspondante et on rajoute un "OK" dans la colonne situation commande.
J'ai donc rédigé un code mais celui-ci ne fonctionne pas:
Merci d'avance pour votre aide
Je sollicite votre aide car je dois coder en VBA mais je suis une novice.
Alors j'ai deux classeurs (fichier ordo et fichier expe) : l'objectif est de rechercher chaque numéro de commande situé à la colonne K du fichier expe dans la colonne 3 du fichier ordo.
Si le numéro est trouvé dans la colonne 3, alors on va regarder une cellule correspondant à la quantité commandé (fichier ordo) et on revérifie que cette quantité est la même dans le fichier expe.
Si tous ces paramètres sont respectés alors on retourne dans le fichier ordo à la ligne correspondante et on rajoute un "OK" dans la colonne situation commande.
J'ai donc rédigé un code mais celui-ci ne fonctionne pas:
Public Sub Bouton_maj_Click()
'Cette macro compare les numéros de commandes du fichier ORDO et du fichier expédition
Dim fichier_expe_wk As Workbook: Dim fichier_ordo_wk As Workbook
Dim fichier_expe_ws As Worksheet: Dim fichier_ordo_ws As Worksheet
Dim plage_cmd_expe As Range: Dim Cell As Range
Dim cel_cmd_ordo As Range: Dim cel_cmd_expe As Range
Dim cel_situ_ordo As Range
Dim cel_qtity_ordo As Range: Dim cel_qtity_expe As Range
Set fichier_ordo_wk = ActiveWorkbook
Set fichier_ordo_ws = fichier_ordo_wk.Sheets("Cmdes modif")
Set fichier_expe_wk = Application.Workbooks.Open("D:\Users\Administrateur\Desktop\Projet pilotage de la ligne BB\sortie camion ordo.xlsx")
Set fichier_expe_ws = fichier_expe_wk.Worksheets(1)
With fichier_expe_ws
'défini la plage à parcourir (ici la colonne des numéros de commande dans le fichier expé)
Set plage_cmd_expe = Columns(11)
'Pour chaque cellule de la colonne choisie on récupère la valeur du numéro de commande
For Each Cell In plage_cmd_expe
Set cel_cmd_expe = Cell
'On se décale juqu'à la colonne quantité du fichier expédition
Set cel_qtity_expe = cel_cmd_expe.Offset(0, -6)
'Et on recherche ce numéro dans la colonne des commandes du fichier ordo
Set cel_cmd_ordo = fichier_ordo_ws.Columns(3).Cells.Find(cel_cmd_expe.Value, LookAt:=xlWhole)
MsgBox cel_cmd_ordo.Address
'On sélectionne la cellule correspondante au numéro de commande dans ordo
If cel_cmd_ordo Is Nothing Then
MsgBox "La mise à jour n'a pas pu être effectuée"
Else
cel_cmd_ordo.Select
'On se décale jusqu'à la colonne quantité du fichier ordo
Set cel_qtity_ordo = cel_cmd_ordo.Offset(0, 8)
'Comparaison entre la quantité dans ordo et dans expe
If cel_qtity_expe.Value = cel_qtity_ordo.Value Then
'On se décale jusqu'à la colonne situation commande afin de rentrer OK
Set cel_situ_ordo = ActiveCell.Offset(0, 12).Activate
cel_situ_ordo = "OK"
Else
cel_situ_ordo = ""
End If
End If
Next Cell
End With
End Sub
Merci d'avance pour votre aide
| EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI Merci d'y penser dans tes prochains messages. |
7 réponses
-
Re,
Sans les fichier, il est difficile d'essayer le code.
A la lecture (sans essai), il y a une erreur sur la ligne :Set plage_cmd_expe = Columns(11)
Pour faire référence au fichier_expe_ws, il manque le point :With fichier_expe_ws Set plage_cmd_expe = .Columns(11) '[...] End With
Mais comme le With n'est utilisé que dans cette instruction, à la place des 3 lignes, il est plus simple d'écrire :Set plage_cmd_expe = fichier_expe_ws.Columns(11)
D'autre part, en VBA, il faut absolument éviter d'utiliser .Select
Au lieu de :cel_cmd_ordo.Select '[...] Set cel_situ_ordo = ActiveCell.Offset(0, 12).Activate
Ecrire :Set cel_situ_ordo = cel_cmd_ordo.Offset(0, 12)
Et plus, je te déconseille vivement de faire référence aux objets actifs, c'est un source de problèmes très fréquents. Outre l'ActiveCell
ci-dessus, au lieu de :Set fichier_ordo_wk = ActiveWorkbook
Si le fichier contient la macro, Il vaut mieux :Set fichier_ordo_wk = ThisWorkbook
et sinon :Set fichier_ordo_wk = Workbooks("NomDuFichier")
-
Bonjour,
Quand tu postes du code sur le forum ...
Utilises les balises de code avec indication du langage (=coloration syntaxique)
Explications disponibles ici : Comment utiliser les balises de code
Exemple :Sub UtiliserLesBalises() MsgBox "Merci d'utiliser les balises de code" End Sub
-
Bonjour,
Je sollicite votre aide car je dois coder en VBA mais je suis une novice.
Alors j'ai deux classeurs (fichier ordo et fichier expe) : l'objectif est de rechercher chaque numéro de commande situé à la colonne K du fichier expe dans la colonne 3 du fichier ordo.
Si le numéro est trouvé dans la colonne 3, alors on va regarder une cellule correspondant à la quantité commandé (fichier ordo) et on revérifie que cette quantité est la même dans le fichier expe.
Si tous ces paramètres sont respectés alors on retourne dans le fichier ordo à la ligne correspondante et on rajoute un "OK" dans la colonne situation commande.
J'ai donc rédigé un code mais celui-ci ne fonctionne pas:
Public Sub Bouton_maj_Click() 'Cette macro compare les numéros de commandes du fichier ORDO et du fichier expédition Dim fichier_expe_wk As Workbook: Dim fichier_ordo_wk As Workbook Dim fichier_expe_ws As Worksheet: Dim fichier_ordo_ws As Worksheet Dim plage_cmd_expe As Range: Dim Cell As Range Dim cel_cmd_ordo As Range: Dim cel_cmd_expe As Range Dim cel_situ_ordo As Range Dim cel_qtity_ordo As Range: Dim cel_qtity_expe As Range Set fichier_ordo_wk = ActiveWorkbook Set fichier_ordo_ws = fichier_ordo_wk.Sheets("Cmdes modif") Set fichier_expe_wk = Application.Workbooks.Open("D:\Users\Administrateur\Desktop\Projet pilotage de la ligne BB\sortie camion ordo.xlsx") Set fichier_expe_ws = fichier_expe_wk.Worksheets(1) With fichier_expe_ws 'défini la plage à parcourir ici la colonne des numéros de commande dans le fichier expé Set plage_cmd_expe = Columns(11) 'Pour chaque cellule de la colonne choisie on récupère la valeur du numéro de commande For Each Cell In plage_cmd_expe Set cel_cmd_expe = Cell 'On se décale juquà la colonne quantité du fichier expédition Set cel_qtity_expe = cel_cmd_expe.Offset(0, -6) 'Et on recherche ce numéro dans la colonne des commandes du fichier ordo Set cel_cmd_ordo = fichier_ordo_ws.Columns(3).Cells.Find(cel_cmd_expe.Value, LookAt:=xlWhole) MsgBox cel_cmd_ordo.Address 'On sélectionne la cellule correspondante au numéro de commande dans ordo If cel_cmd_ordo Is Nothing Then MsgBox "La mise à jour n'a pas pu être effectuée" Else cel_cmd_ordo.Select 'On se décale jusquà la colonne quantité du fichier ordo Set cel_qtity_ordo = cel_cmd_ordo.Offset(0, 8) 'Comparaison entre la quantité dans ordo et dans expe If cel_qtity_expe.Value = cel_qtity_ordo.Value Then 'On se décale jusquà la colonne situation commande afin de rentrer OK Set cel_situ_ordo = ActiveCell.Offset(0, 12).Activate cel_situ_ordo = "OK" Else cel_situ_ordo = "" End If End If Next Cell End With End Sub
Merci d'avance pour votre aide -
Public Sub Bouton_maj_Click() 'Cette macro compare les numéros de commandes du fichier ORDO et du fichier expédition Dim fichier_expe_wk As Workbook: Dim fichier_ordo_wk As Workbook Dim fichier_expe_ws As Worksheet: Dim fichier_ordo_ws As Worksheet Dim plage_cmd_expe As Range: Dim Cell As Range Dim cel_cmd_ordo As Range: Dim cel_cmd_expe As Range Dim cel_situ_ordo As Range Dim cel_qtity_ordo As Range: Dim cel_qtity_expe As Range Set fichier_ordo_wk = ActiveWorkbook Set fichier_ordo_ws = fichier_ordo_wk.Sheets("Cmdes modif") Set fichier_expe_wk = Application.Workbooks.Open("D:\Users\Administrateur\Desktop\Projet pilotage de la ligne BB\sortie camion ordo.xlsx") Set fichier_expe_ws = fichier_expe_wk.Worksheets(1) With fichier_expe_ws 'défini la plage à parcourir ici la colonne des numéros de commande dans le fichier expé Set plage_cmd_expe = Columns(11) 'Pour chaque cellule de la colonne choisie on récupère la valeur du numéro de commande For Each Cell In plage_cmd_expe Set cel_cmd_expe = Cell 'On se décale juquà la colonne quantité du fichier expédition Set cel_qtity_expe = cel_cmd_expe.Offset(0, -6) 'Et on recherche ce numéro dans la colonne des commandes du fichier ordo Set cel_cmd_ordo = fichier_ordo_ws.Columns(3).Cells.Find(cel_cmd_expe.Value, LookAt:=xlWhole) MsgBox cel_cmd_ordo.Address 'On sélectionne la cellule correspondante au numéro de commande dans ordo If cel_cmd_ordo Is Nothing Then MsgBox "La mise à jour n'a pas pu être effectuée" Else cel_cmd_ordo.Select 'On se décale jusquà la colonne quantité du fichier ordo Set cel_qtity_ordo = cel_cmd_ordo.Offset(0, 8) 'Comparaison entre la quantité dans ordo et dans expe If cel_qtity_expe.Value = cel_qtity_ordo.Value Then 'On se décale jusquà la colonne situation commande afin de rentrer OK Set cel_situ_ordo = ActiveCell.Offset(0, 12).Activate cel_situ_ordo = "OK" Else cel_situ_ordo = "" End If End If Next Cell End With End Sub <code basic> -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Bonjour
Merci pour vos conseils. Je reviens vers vous pour expliciter mes erreurs :
Le code me renvoit une erreur 13 imcompatibilité de type sur la ligne avec la fonction find.
Cel_cmd_expe est un Range et j'ai écris:
Set cel_cmd_ordo = fichier_ordo_ws.Columns(3).Cells.Find(cel_cmd_expe.Value, LookAt:=xlWhole)
-
-
pour déterminer d'où vient l'erreur, essaie des variantes, ou décompose la ligne en plusieurs parties:
Set cel_cmd_ordo = fichier_ordo_ws.Columns(3).Cells.Find(cel_cmd_expe.Value)
oudim v, rs as range v=cel_cmd_expe.Value Set rg = fichier_ordo_ws.Columns(3).Cells set cel_cmd_ordo = rg.Find(v, LookAt:=xlWhole)
cela t'aidera à déterminer quelle partie d'une ligne complexe pose problème. -
<code csharp> For Each Cell In plage_cmd_expe Set cel_cmd_expe = Cell MsgBox cel_cmd_expe.Address 'On se décale juqu'à la colonne quantité du fichier expédition Set cel_qtity_expe = cel_cmd_expe.Offset(0, -6) MsgBox cel_qtity_expe.Address 'Et on recherche ce numéro dans la colonne des commandes du fichier ordo v = cel_cmd_expe.Value Set rg = fichier_ordo_ws.Columns(3).Cells Set cel_cmd_ordo = rg.Find(v, LookAt:=xlWhole) MsgBox cel_cmd_ordo.Address 'On sélectionne la cellule correspondante au numéro de commande dans ordo If cel_cmd_ordo Is Nothing Then MsgBox "La mise à jour n'a pas pu être effectuée" Else 'On se décale jusqu'à la colonne quantité du fichier ordo Set cel_qtity_ordo = cel_cmd_ordo.Offset(0, 8) MsgBox cel_qtity_ordo.Address 'Comparaison entre la quantité dans ordo et dans expe If cel_qtity_expe.Value = cel_qtity_ordo.Value Then 'On se décale jusqu'à la colonne situation commande afin de rentrer OK Set cel_situ_ordo = cel_cmd_ordo.Offset(0, 13) MsgBox cel_situ_ordo.Address cel_situ_ordo.Value = "ok" Else cel_situ_ordo.Value = " " End If MsgBox cel_situ_ordo.Value End If Next Cell <code basic>
Le code fonctionne sauf qu'il n'écrit que dans la dernière cel_situ_ordo visitée : ais-je mal positionné le if ?
Savez vous comment parcourir toute la colonne K sans l'entête et ce jusqu'à la dernière ligne remplie ?
J'imaginais chercher la dernière ligne remplie du fichier expe avec (xlUp).Row mais bon ce n'est qu"une idée -
-
-
-
J'essaie d'envoyer deux fichiers tests (expe et ordo) mais je n'arrive pas à les insérer . Savez vous comment insérer des fichiers excels sur le forum ?
-
Bonne nouvelle ! Mon code fonctionne.
J'aurais une dernière question : sauriez vous comment convertir une date yymmdd en date ddmmyy ?
Je le mets ci-dessous si besoin .
<code csharp> Public Sub Bouton_maj_Click() 'Cette macro compare les numéros de commandes du fichier ORDO et du fichier expédition 'Description des variables Dim fichier_expe_wk As Workbook: Dim fichier_ordo_wk As Workbook Dim fichier_expe_ws As Worksheet: Dim fichier_ordo_ws As Worksheet Dim Nom_fichier_expe As Variant Dim plage_cmd_expe As Range: Dim Cell As Range Dim cel_cmd_ordo As Range: Dim cel_cmd_expe As Range Dim cel_situ_ordo As Range Dim cel_qtity_ordo As Range: Dim cel_qtity_expe As Range Dim cel_date_expe As Range: Dim cel_del_usine As Range Dim dernière_ligne_utilisée As Long Set fichier_ordo_wk = ThisWorkbook Set fichier_ordo_ws = fichier_ordo_wk.Sheets("Cmdes modif") Nom_fichier_expe = Application.GetOpenFilename("Classeurs Excel(*.xlsx),*.xlsx,Macros complémentaires(*.xls),*.xls") Set fichier_expe_wk = Application.Workbooks.Open(Nom_fichier_expe) Set fichier_expe_ws = fichier_expe_wk.Worksheets(1) 'Chercher la dernière ligne non vide du fichier expedition dernière_ligne_utilisée = fichier_expe_ws.Range("K" & Rows.Count).End(xlUp).Row 'défini la plage à parcourir (ici la colonne des numéros de commande dans le fichier expé) Set plage_cmd_expe = fichier_expe_ws.Range("K2:K" & dernière_ligne_utilisée) 'Pour chaque cellule de la colonne choisie on récupère la valeur du numéro de commande For Each Cell In plage_cmd_expe Set cel_cmd_expe = Cell 'On se décale juqu'à la colonne quantité du fichier expédition Set cel_qtity_expe = cel_cmd_expe.Offset(0, -6) 'On se décale jusqu'à la colonne date chargement du fichier expédition Set cel_date_expe = cel_cmd_expe.Offset(0, 5) 'Et on recherche ce numéro dans la colonne des commandes du fichier ordo Set cel_cmd_ordo = fichier_ordo_ws.Columns(3).Cells.Find(cel_cmd_expe.Value, LookAt:=xlWhole) 'On sélectionne la cellule correspondante au numéro de commande dans ordo If cel_cmd_ordo Is Nothing Then MsgBox "La mise à jour n'a pas pu être effectuée" Else 'On se décale jusqu'à la colonne quantité du fichier ordo Set cel_qtity_ordo = cel_cmd_ordo.Offset(0, 8) 'On se decale jusquà la colonne del_usi du fichier ordo Set cel_del_usine = cel_cmd_ordo.Offset(0, 9) 'Comparaison entre la quantité et la date del_usine et expe dans ordo et dans expe If cel_qtity_expe.Value = cel_qtity_ordo.Value And cel_date_expe.Value = cel_del_usine.Value Then 'On se décale jusqu'à la colonne situation commande afin de rentrer OK Set cel_situ_ordo = cel_cmd_ordo.Offset(0, 13) cel_situ_ordo.Value = "ok" Else Set cel_situ_ordo = cel_cmd_ordo.Offset(0, 13) cel_situ_ordo.Value = " " End If End If Next Cell MsgBox "La mise à jour est terminée" End Sub <code basic>