Menu

Problème code VBA

Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Dernière intervention
5 décembre 2018
-
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

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
7446
Date d'inscription
dimanche 13 juin 2010
Dernière intervention
14 décembre 2018
1
Merci
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")


Cordialement
Patrice

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM a aidé 34847 internautes ce mois-ci

yg_be
Messages postés
7044
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
bonjour, je suggère également d'expliciter "celui-ci ne fonctionne pas": message d'erreur, comportement inattendu, ...?
Commenter la réponse de Patrice33740
Messages postés
7446
Date d'inscription
dimanche 13 juin 2010
Dernière intervention
14 décembre 2018
0
Merci
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

Commenter la réponse de Patrice33740
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Dernière intervention
5 décembre 2018
0
Merci
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
Commenter la réponse de Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Dernière intervention
5 décembre 2018
0
Merci
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
Dernière intervention
5 décembre 2018
-
Désolé pour le cafouillage du code !
Commenter la réponse de Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Dernière intervention
5 décembre 2018
0
Merci
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)
yg_be
Messages postés
7044
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
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) 

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
Dernière intervention
5 décembre 2018
-
<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
7044
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 décembre 2018
> Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Dernière intervention
5 décembre 2018
-
donc plus d'erreur 13?
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Dernière intervention
5 décembre 2018
> yg_be
Messages postés
7044
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
Non plus d'erreur 13 !

Je parles du if de la ligne 26 : je ne comprends pas pourquoi seule la dernière case cel_situ_ordo trouvé est égale à "ok"

Je veux parcourir la colonne K avant le code que j'ai rentré (en partant de la ligne 2 jusqu'à la dernière ligne non vide du fichier expe)
yg_be
Messages postés
7044
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 décembre 2018
> Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Dernière intervention
5 décembre 2018
-
tu écris "le if": duquel parles-tu?
à quelle ligne de code veux-tu parcourir la colonne K?
Commenter la réponse de Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Dernière intervention
5 décembre 2018
0
Merci
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 ?
Commenter la réponse de Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Dernière intervention
5 décembre 2018
0
Merci
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>
yg_be
Messages postés
7044
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
où se trouve la date à convertir?
Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Dernière intervention
5 décembre 2018
> yg_be
Messages postés
7044
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
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.
yg_be
Messages postés
7044
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 décembre 2018
> Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Dernière intervention
5 décembre 2018
-
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
Dernière intervention
5 décembre 2018
> yg_be
Messages postés
7044
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
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
7044
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 décembre 2018
> Anonyma23
Messages postés
11
Date d'inscription
vendredi 30 novembre 2018
Dernière intervention
5 décembre 2018
-
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)
Commenter la réponse de Anonyma23