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   -
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.
A voir également:

7 réponses

Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
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")


1
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, ...?
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
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

0
Anonyma23 Messages postés 11 Date d'inscription   Statut Membre 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:

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
0
Anonyma23 Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
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>
0
Anonyma23 Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
Désolé pour le cafouillage du code !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Anonyma23 Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
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)

                
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
et ainsi:
Set cel_cmd_ordo = fichier_ordo_ws.Columns(3).Cells.Find(cel_cmd_expe.Value, , , xlWhole) 
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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.
0
Anonyma23 Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
<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
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Anonyma23 Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
donc plus d'erreur 13?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Anonyma23 Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
tu écris "le if": duquel parles-tu?
à quelle ligne de code veux-tu parcourir la colonne K?
0
Anonyma23 Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
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 ?
0
Anonyma23 Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
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>
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
où se trouve la date à convertir?
0
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  
 
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.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Anonyma23 Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
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)
0
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  
 
Cette fonction ne me renvoit pas d'erreur mais j'obtiens la date 26/10/2006 au lieu de 26/11/2018
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Anonyma23 Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
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)
0