Problème code VBA
Fermé
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Statut
Membre
Dernière intervention
5 décembre 2018
-
Modifié le 3 déc. 2018 à 20:40
yg_be Messages postés 23408 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 décembre 2024 - 5 déc. 2018 à 21:24
yg_be Messages postés 23408 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 décembre 2024 - 5 déc. 2018 à 21:24
A voir également:
- Problème code VBA
- Code asci - Guide
- Code puk bloqué - Guide
- Code telephone oublié - Guide
- Code activation windows 10 - Guide
- Code gta 4 ps4 - Guide
7 réponses
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
Modifié le 30 nov. 2018 à 15:03
Modifié le 30 nov. 2018 à 15:03
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")
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
30 nov. 2018 à 14:01
30 nov. 2018 à 14:01
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
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Statut
Membre
Dernière intervention
5 décembre 2018
Modifié le 3 déc. 2018 à 20:41
Modifié le 3 déc. 2018 à 20:41
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
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Statut
Membre
Dernière intervention
5 décembre 2018
Modifié le 3 déc. 2018 à 20:42
Modifié le 3 déc. 2018 à 20:42
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>
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Statut
Membre
Dernière intervention
5 décembre 2018
30 nov. 2018 à 14:26
30 nov. 2018 à 14:26
Désolé pour le cafouillage du code !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Statut
Membre
Dernière intervention
5 décembre 2018
3 déc. 2018 à 10:18
3 déc. 2018 à 10:18
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)
yg_be
Messages postés
23408
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 décembre 2024
1 557
3 déc. 2018 à 12:00
3 déc. 2018 à 12:00
et ainsi:
Set cel_cmd_ordo = fichier_ordo_ws.Columns(3).Cells.Find(cel_cmd_expe.Value, , , xlWhole)
yg_be
Messages postés
23408
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 décembre 2024
1 557
Modifié le 3 déc. 2018 à 12:08
Modifié le 3 déc. 2018 à 12:08
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.
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Statut
Membre
Dernière intervention
5 décembre 2018
3 déc. 2018 à 19:14
3 déc. 2018 à 19:14
<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
yg_be
Messages postés
23408
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 décembre 2024
1 557
>
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Statut
Membre
Dernière intervention
5 décembre 2018
3 déc. 2018 à 20:39
3 déc. 2018 à 20:39
donc plus d'erreur 13?
yg_be
Messages postés
23408
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 décembre 2024
1 557
>
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Statut
Membre
Dernière intervention
5 décembre 2018
3 déc. 2018 à 20:41
3 déc. 2018 à 20:41
tu écris "le if": duquel parles-tu?
à quelle ligne de code veux-tu parcourir la colonne K?
à quelle ligne de code veux-tu parcourir la colonne K?
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Statut
Membre
Dernière intervention
5 décembre 2018
3 déc. 2018 à 10:41
3 déc. 2018 à 10:41
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 ?
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Statut
Membre
Dernière intervention
5 décembre 2018
4 déc. 2018 à 11:24
4 déc. 2018 à 11:24
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>
yg_be
Messages postés
23408
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 décembre 2024
1 557
4 déc. 2018 à 15:39
4 déc. 2018 à 15:39
où se trouve la date à convertir?
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Statut
Membre
Dernière intervention
5 décembre 2018
>
yg_be
Messages postés
23408
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 décembre 2024
4 déc. 2018 à 16:07
4 déc. 2018 à 16:07
La date serait cel_date_expe à la ligne 35 du code.
Dans le fichier excel expedition la valeur écrite est 261118 mais le fichier excel le traduit comme 18/11/2026 alors que cela devrait être 26/11/18.
Dans le fichier excel expedition la valeur écrite est 261118 mais le fichier excel le traduit comme 18/11/2026 alors que cela devrait être 26/11/18.
yg_be
Messages postés
23408
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 décembre 2024
1 557
>
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Statut
Membre
Dernière intervention
5 décembre 2018
4 déc. 2018 à 16:55
4 déc. 2018 à 16:55
suggestion pour obtenir une date:
Dim cel_date_expe As Range, date_expe As Date Dim val As Long val = cel_date_expe.Value date_expe = DateSerial(2000 + val \ 10000, (val Mod 10000) \ 100, val Mod 100)
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Statut
Membre
Dernière intervention
5 décembre 2018
>
yg_be
Messages postés
23408
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 décembre 2024
5 déc. 2018 à 15:15
5 déc. 2018 à 15:15
Cette fonction ne me renvoit pas d'erreur mais j'obtiens la date 26/10/2006 au lieu de 26/11/2018
yg_be
Messages postés
23408
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 décembre 2024
1 557
>
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Statut
Membre
Dernière intervention
5 décembre 2018
5 déc. 2018 à 21:24
5 déc. 2018 à 21:24
Dim cel_date_expe As Range, date_expe As Date Dim val As Long val = cel_date_expe.Value date_expe = DateSerial(2000 + val Mod 100 , (val Mod 10000) \ 100, val \ 10000)
1 déc. 2018 à 12:39