IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Macro VBA excel


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2016
    Messages : 6
    Par défaut Macro VBA excel
    Bonjour à tous,
    Je m'appelle Alexandre et je suis nouveau sur ce forum
    Je suis actuellement en stage dans une entreprise d'agroalimentaire et j'ai pour mission de synchroniser certaines données de torréfactions de l'entreprise.
    Je vous expose mon problème : Des containers de matière première sont pesés et les données de pesée sont collectées dans une feuille excel. Ensuite, les containers sont vidés dans des trappes liées à des machines de torréfaction.
    J'ai pensé à mettre en place un système de code à barre pour effectuer le suivi des containers. c'est à dire associer un containers à chaque pesée et à chaque vidange (sachant qu'un containers peut être pesé et vidé plusieurs fois dans la journée).
    J'ai donc écrit un code en VBA pour simuler le fonctionnement de la bipette du code à barre et ainsi pouvoir anticiper la collecte des données. Cependant, j'ai des erreurs dans le code que je n'arrive pas à comprendre. J'imagine que c'est des erreurs assez faciles à corriger mais j'ai beau me creuser la tête je ne trouve pas de solutions. (Je ne suis pas très très bon en VBA).
    Je voudrais savoir si quelqu'un aurait la gentillesse de m'aider dans mon problème puisque je n'arrive pas à appliquer mon code.
    Merci d'avoir pris de votre temps pour lire mon message, bonne journée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub Bipette()
        Dim NBipette As Integer
        Dim x As Integer    'Lignes utilisées pour le tri de la colonne N°Bipette
        Dim i As Integer    'Lignes utilisées pour le tri de la colonne N°Vidange
        x = 1 'Initialise les lignes N°Bipette
        NBipette = InputBox("Insérez N°Bipette", "N°Bippette", "Valeur N°Bipette")
        While Cells(x, 2).Value <> "" 'Cherche le nombre de lignes dans la colonne N°Bipette
            x = x + 1 'Cherche le nombre de lignes dans la colonne N°Bipette
        Wend    'Cherche le nombre de lignes dans la colonne N°Bipette
        i = x 'Une fois trouvé, attribut x à i, variable ligne N°Vidange qui va permettre d'effectuer un tri depuis la dernière valeur entrée pour éviter les cas où le numéro du container est bien le bon mais que c'était une vidange déjà effectuée bien avant la dernière effectuée par ce même container
        While Cells(i, 2).Value <> NBipette 'Tant que la valeur de la cellule n'est pas égale à celle de la bipette (C'est cette ligne qui semble bloquer. De plus, j'aimerais bien ajouter ici une condition que i doit être supérieur à 0 mais je pense qu'un OR ne convient pas)
            i = i - 1 'On regarde la cellule précédente
        Wend
        If Cells(i, 2).Value <> Cells(i, 3).Value Then
            Cells(i, 3) = NBipette  'On attribue à la case de vidange le n°Bipette
        Else
            Cells(x + 1, 2) = NBipette 'Sinon on l'attribut à une nouvelle cellule de pesée
        End If
    End Sub

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par koxandre Voir le message
    J'ai donc écrit un code en VBA pour simuler le fonctionnement de la bipette du code à barre et ainsi pouvoir anticiper la collecte des données.
    Les participants à ce forum ne savent rien du contexte et de la nature de ton développement.
    Pourrais-tu être plus explicite sur ce qu'est supposé réalisé ton code ?

    Cependant, j'ai des erreurs dans le code que je n'arrive pas à comprendre.
    Quelle est la nature de ces "erreurs" ?
    Un bug ? (quelle message ? quelle ligne de code ?)
    Un résultat incohérent ? Quel résultat attendais-tu ? Quel résultat obtiens-tu ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2016
    Messages : 6
    Par défaut
    Bonjour Menhir, merci de ta réponse rapide.
    Je suis désolé si je n'ai pas détaillé correctement ^^
    Alors en fait, un même container va être utilisé pour effectuer une pesée et une vidange. Il va donc être bipé deux fois. J'ai donc essayé de faire un code qui prend en compte chaque bipage. Pour chaque bipage, le code va vérifier si le numéro du container a déjà été bipé.
    => Si il n'a jamais été bipé : le code va écrire le numéro du container dans une nouvelle ligne de la colonne associée au N° de pesée (vu que la pesée se fait avant la vidange, cela est logique).
    => Si il a déjà été bipé, le code va regarder dans la colonne de pesée la dernière fois qu'il a été bipé et il va ensuite regarder si dans la cellule a côté (qui appartient à la colonne des vidange) le N° du container est présent.
    ===>Si il n'est pas présent, c'est qu'il n'a pas été vidangé et qu'il est entrain de se vidanger (vu qu'il a déjà été bipé comme pesé). On va donc compléter la case de vidange par le N° de container (plus tard il y aura d'autres informations associées mais pour l'instant j'essaie déjà avec un exemple simple donc juste avec le numéro du container (même si juste répéter les mêmes numéros deux fois ne semble pas pertinent)).
    ===>Si la case de vidange est déjà remplie, on va alors ajouter une nouvelle cellule dans la colonne des pesée avec le N° du container pesé associé.

    Pour l'instant j'essaie juste d'effectuer une simulation sans avoir de bipette donc juste essayer de créer un code qui fonctionne sur le même principe. J'ai donc remplacé ce qui va être la bipette par un InputBox.

    Pour ce qui est des bug je ne sais pas ce qui se passe, c'est justement mon problème, je n'arrive pas à comprendre ce qui ne va pas.
    j'ai un problème à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    While Cells(i, 2).Value <> NBipette
    avec comme message "Erreur d'execution '1004' erreur définie par l'application ou par l'objet". Cependant, je ne vois pas e"n quoi ma ligne comporte des erreurs.

    Pour l'instant mon code ne me retourne qu'un 0 sur ma ligne de vidange ce qui n'est pas ce que je veux ^^

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par koxandre Voir le message
    j'ai un problème à la ligne " While Cells(i, 2).Value <> NBipette " avec comme message "Erreur d'execution '1004' erreur définie par l'application ou par l'objet".
    Quand le bug se déclenche, regarde la valeur de la variable i dans la fenêtre Variables locales.
    Je suis à peu près sûr que cette valeur sera 0. Il serait donc normal que le Cells ne l'accepte pas comme n° de ligne.
    Plus clairement, si la boucle ne trouve pas NBipette dans les lignes, rien ne l'arrête quand elle arrive en haut de tableau et elle essaye de continuer sa recherche au dessus du tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Bipette()
        Dim NBipette As Integer
        Dim Cherche As Range
        NBipette = InputBox("Insérez N°Bipette", "N°Bippette", "Valeur N°Bipette")
        Set Cherche = Range("B1:B" & Range("B1").End(xlDown).Row).Find(NBipette)
        If Cherche Is Nothing Then
            Range("B1").End(xlDown).Offset(1,1).Value = NBipette 'Sinon on l'attribut à une nouvelle cellule de pesée
        Else
            Cells(Cherche.Row, 3).Value = NBipette
        End If
    End Sub
    Cela dit, je ne pense pas que définir un code barre comme Integer soit une bonne idée. A la place, je le définirais comme String.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2016
    Messages : 6
    Par défaut
    J'ai bien pris en compte ce que tu m'as dit. Effectivement il y avait un problème avec la valeur du i, j'ai donc rajouté une boucle while comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Sub Bipette()
        Dim NBipette As Integer
        Dim x As Integer    'Lignes utilisées pour le tri de la colonne N°Bipette
        Dim i As Integer    'Lignes utilisées pour le tri de la colonne N°Vidange
        x = 1 'Initialise les lignes N°Bipette
        NBipette = InputBox("Insérez N°Bipette", "N°Bippette", "Valeur N°Bipette")
        While Cells(x, 2).Value <> "" 'Cherche le nombre de lignes dans la colonne N°Bipette
            x = x + 1 'Cherche le nombre de lignes dans la colonne N°Bipette
        Wend    'Cherche le nombre de lignes dans la colonne N°Bipette
        i = x 'Une fois trouvé, attribut x à i, variable ligne N°Vidange qui va permettre d'effectuer un tri depuis la dernière valeur entrée pour éviter les cas où le numéro du container est bien le bon mais que c'était une vidange déjà effectuée bien avant la dernière effectuée par ce même container
        While i >= 2
            While Cells(i, 2).Value <> NBipette 'Tant que la valeur de la cellule n'est pas égale à celle de la bipette
                i = i - 1 'On regarde la cellule précédente
            Wend
        Wend
        If Cells(i, 2).Value <> Cells(i, 3).Value Then
            Cells(i, 3) = NBipette  'On attribue à la case de vidange le n°Bipette
        Else
            Cells(x + 1, 2) = NBipette 'Sinon on l'attribut à une nouvelle cellule de pesée
        End If
    End Sub
    Cependant j'ai maintenant un autre problème : l'algorithme ne détecte plus d'erreurs mais note que la première valeur sur la première cellule de la colonne de pesée. Lorsque je relance l'algorithme, cela remplace la valeur précédente.

    Pour ce qui est du code que tu m'as envoyé, je suppose qu'il s'agit d'une correction améliorée de mon code ? Merci beaucoup ! Cependant, je retrouve à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B1").End(xlDown).Offset(1, 1).Value = NBipette
    la même erreur que j'avais précédemment sur la première version de mon code.

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par koxandre Voir le message
    J'ai bien pris en compte ce que tu m'as dit. Effectivement il y avait un problème avec la valeur du i, j'ai donc rajouté une boucle while comme suit :
    Sincèrement (et sans vouloir être désobligeant), c'est n'importe quoi.
    Une boucle n'est pas un test. Si tu veux intégrer cette seconde condition à ta boucle, il faut le faire dans la même boucle en utilisant des opérateurs logiques (And, Or, etc.) pour clarifier la condition de sortie de boucle (ce qui est sur la même ligne que While).

    Pour ce qui est du code que tu m'as envoyé, je suppose qu'il s'agit d'une correction améliorée de mon code ?
    Etant donné qu'il n'y a que la ligne InputBox qui soit conservée, on ne peut pas appeler ça une "amélioration". C'est plutôt une recréaction.

    Cependant, je retrouve à la ligne "Range("B1").End(xlDown).Offset(1, 1).Value = NBipette " la même erreur que j'avais précédemment sur la première version de mon code.
    Qu'est-ce que tu as dans la colonne B ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Sub Bipette()
        Dim NBipette As String
        Dim i As Integer    'Lignes utilisées pour le tri de la colonne N°Vidange
        x = 1 'Initialise les lignes N°Bipette
        Do While NBipette = ""
        NBipette = InputBox("Insérez N°Bipette", "N°Bippette", "Valeur N°Bipette")
        Loop
        i = SerchXls(Range("B:B"), Range("B1"), NBipette, True, False)
        If i <> 0 Then
            Cells(i, 3) = NBipette  'On attribue à la case de vidange le n°Bipette
        Else
            Cells(Cells.Rows.Count, "B").End(xlUp).Offset(1) = NBipette  'Sinon on l'attribut à une nouvelle cellule de pesée
        End If
    End Sub
    Function SerchXls(Myrange As Range, MyCellule As Range, strRecherche, EntierCell As Boolean, EnBoucle As Boolean) As Long '
    On Error Resume Next
    SerchXls = 0
    If EntierCell = False Then Entier = xlPart Else Entier = xlWhole
       SerchXls = Myrange.Cells.Find(What:=strRecherche, After:=MyCellule, LookIn:=xlFormulas, LookAt _
            :=Entier, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            False, SearchFormat:=EntierCell).Row
      If SerchXls <= MyCellule.Row And EnBoucle = False Then SerchXls = 0
    End Function

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2016
    Messages : 6
    Par défaut
    Sincèrement (et sans vouloir être désobligeant), c'est n'importe quoi.
    Une boucle n'est pas un test. Si tu veux intégrer cette seconde condition à ta boucle, il faut le faire dans la même boucle en utilisant des opérateurs logiques (And, Or, etc.) pour clarifier la condition de sortie de boucle (ce qui est sur la même ligne que While).
    Ça ne me vexe pas, j'essaie d'apprendre, cependant je pensais comprendre ce que je faisais :p J'avais effectivement pensé à un OR mais ça ne vérifiait pas ce que je voulais demander. Je vais réessayer avec OR ou AND alors

    Qu'est-ce que tu as dans la colonne B ?
    J'ai mis dans ma colonne B les N°de pesée et en C les N° de vidange. Mais initialement, il y a écrit que N° de Pesée et N° de vidange à la première ligne, les colonnes étant sensées se compléter au fur et à mesure que l'on lance le code. (Je vais surement devoir changer l'initialisation de mon x du coup)

  9. #9
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par koxandre Voir le message
    J'ai mis dans ma colonne B les N°de pesée et en C les N° de vidange.
    En terme Excel, qu'est-ce qu'il y a concrètement dans les cellules ?

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2016
    Messages : 6
    Par défaut
    Il y a des entiers qui correspondent au numéro de conteneur (si c'est bien ça ta question ?).

    Bonjour rdurupt, Merci beaucoup pour ta réponse Cela a l'air de fonctionner Cependant je ne comprends pas tout ce que tu as écrit, je vais essayer de m'attarder dessus pour bien comprendre (je suis encore novice en vba).

  11. #11
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Je n'arrive pas à me faire comprendre. J'essaye une dernière fois : peux-tu dire ce que contient, exactement, au moment où tu lances la macro, le contenu de B1, B2, B3, etc. ? Et y a-t-il des cellules vides ?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Sub Bipette()
        Dim NBipette As String
        Dim i As Integer    'Lignes utilisées pour le tri de la colonne N°Vidange
        Do While NBipette = "" 'Je boucle tant que l'utilisateur ne rentre pas un valeur.
            NBipette = InputBox("Insérez N°Bipette", "N°Bippette", "Valeur N°Bipette")
        Loop
        i = SerchXls(Range("B:B"), Range("B1"), NBipette, True, False) 'Je recherche  NBipette dans la colonne B à partir de la position B1, sur la totalité de la cellule et sans repasser par la ligne 1
        If i <> 0 Then 'Si i=0 recherche infructueuse donc ajout à la fin.
            Cells(i, 3) = NBipette  'On attribue à la case de vidange le n°Bipette
        Else
            Cells(Cells.Rows.Count, "B").End(xlUp).Offset(1) = NBipette  'Sinon on l'attribut à une nouvelle cellule de pesée
        End If
    End Sub
    Function SerchXls(Myrange As Range, MyCellule As Range, strRecherche, EntierCell As Boolean, EnBoucle As Boolean) As Long '
    'Permet de rechercher dans la plage de cellules considérées si une valeur Existe.
    'Myrange : plage de cellules  concernées par la recherche.
    'MyCellule : La position à partir de laquelle la recherche s’effectue. 
    'strRecherche : valeur recherchée.
    'EntierCell : concerne la cellule entière ou un fragilement de cellule.
    'EnBoucle : détermine si  MyCellule  se trouve en ligne 6 et que la valeur trouvé se trouve en ligne 4 si la fonction retourne  4 ou 0 (pas trouvé).
    'Retourne le N° de la ligne ou zéro si pas trouvé.
    On Error Resume Next
    SerchXls = 0
    If EntierCell = False Then Entier = xlPart Else Entier = xlWhole
       SerchXls = Myrange.Cells.Find(What:=strRecherche, After:=MyCellule, LookIn:=xlFormulas, LookAt _
            :=Entier, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            False, SearchFormat:=EntierCell).Row
      If SerchXls <= MyCellule.Row And EnBoucle = False Then SerchXls = 0
    End Function

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2016
    Messages : 6
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Je n'arrive pas à me faire comprendre. J'essaye une dernière fois : peux-tu dire ce que contient, exactement, au moment où tu lances la macro, le contenu de B1, B2, B3, etc. ? Et y a-t-il des cellules vides ?
    Eh bien avec le code que tu m'as recréé, je n'arrive pas à le lancer du coup je n'ai rien qui s'affiche :/ Quand je le lance je reçois un message d'erreur qui est le même que je retrouvais avec mon premier code. (erreur 1004)

    rdurupt merci beaucoup pour les lignes de description supplémentaires, ça m'aide beaucoup dans la compréhension.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA-E]Probleme macro VBA excel 2000 2003
    Par skichatchat dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/04/2007, 21h16
  2. incompatibilité macros VBA excel 2000 et 2003
    Par hiline6 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/04/2007, 12h20
  3. Macro VBA Excel : Comparaison des deux 1ères colonnes de 2 fichiers Excel
    Par techneric dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/01/2007, 10h00
  4. Auto install macro vba excel
    Par zootman dans le forum Installation, Déploiement et Sécurité
    Réponses: 6
    Dernier message: 14/06/2006, 21h30
  5. [VBA-E] macro VBA excel suppression graphiques
    Par totoza dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 30/05/2006, 08h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo