Problème code VBA
Anonyma23
Messages postés
11
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 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. |
A voir également:
- Problème code VBA
- Code ascii - Guide
- Code puk bloqué - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code activation windows 10 - Guide
- Code blocks - Télécharger - Langages
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 :
D'autre part, en VBA, il faut absolument éviter d'utiliser .Select
Au lieu de :
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'
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 WithMais 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).ActivateEcrire :
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'
ActiveCellci-dessus, au lieu de :
Set fichier_ordo_wk = ActiveWorkbookSi le fichier contient la macro, Il vaut mieux :
Set fichier_ordo_wk = ThisWorkbooket sinon :
Set fichier_ordo_wk = Workbooks("NomDuFichier")
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
1 584
bonjour, je suggère également d'expliciter "celui-ci ne fonctionne pas": message d'erreur, comportement inattendu, ...?
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 :
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:
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
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)
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:
ou
cela t'aidera à déterminer quelle partie d'une ligne complexe pose problème.
Set cel_cmd_ordo = fichier_ordo_ws.Columns(3).Cells.Find(cel_cmd_expe.Value)
ou
dim 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 .
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>