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   -
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.

7 réponses

  1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      bonjour, je suggère également d'expliciter "celui-ci ne fonctionne pas": message d'erreur, comportement inattendu, ...?
      0
  2. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    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
  3. Anonyma23 Messages postés 11 Statut Membre
     
    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
  4. Anonyma23 Messages postés 11 Statut Membre
     
    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
    1. Anonyma23 Messages postés 11 Statut Membre
       
      Désolé pour le cafouillage du code !
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Anonyma23 Messages postés 11 Statut Membre
     
    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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      et ainsi:
      Set cel_cmd_ordo = fichier_ordo_ws.Columns(3).Cells.Find(cel_cmd_expe.Value, , , xlWhole) 
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
    3. Anonyma23 Messages postés 11 Statut Membre
       
      <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
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Anonyma23 Messages postés 11 Statut Membre
       
      donc plus d'erreur 13?
      0
    5. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Anonyma23 Messages postés 11 Statut Membre
       
      tu écris "le if": duquel parles-tu?
      à quelle ligne de code veux-tu parcourir la colonne K?
      0
  7. Anonyma23 Messages postés 11 Statut Membre
     
    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
  8. Anonyma23 Messages postés 11 Statut Membre
     
    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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      où se trouve la date à convertir?
      0
      1. Anonyma23 Messages postés 11 Statut Membre > yg_be Messages postés 23437 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
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Anonyma23 Messages postés 11 Statut Membre
         
        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
      3. Anonyma23 Messages postés 11 Statut Membre > yg_be Messages postés 23437 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
      4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Anonyma23 Messages postés 11 Statut Membre
         
        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