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 :

Routine de vérification


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2013
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 45
    Par défaut Routine de vérification
    Bonjour,
    Je galère pour trouver une façon de vérifier que le contenu d'une plage de cellule soit une donnée prévue.
    Dans le code que je vais mettre ci-dessous, je compare une liste de nombres dans une plage avec les noms d'une liste de feuilles.
    Si le code de la plage de la feuille "Accueil" correspond au nom d'une des feuilles dans sh alors on copie les 4 données à droite dans la feuille qui porte le nom "sh"

    Le code que je vous montre fonctionne bien, les blancs sont ignorés et tout va bien SAUF que si j'entre un code qui n'est pas sensé être bon (un numéro de feuille qui n'existe pas), et bien il ne se passe rien et donc l'erreur passerait inaperçu.

    J'ai essayé de dire que si la comparaison est différente affiche un message mais vu que ce sont des for each, chaque feuilles sauf la bonne renvois une erreur.
    j'ai essayé un while mais du coup ça me fait des boucles infinies.

    Après je m'y suis peut être mal pris et dans ce cas je suis preneur de vos idées.

    Ha oui, pour info, je me suis mis à la programmation php en poo et j'ai essayé de transposer ici, ce que j'apprends de en php. Ceci dit, si j'assimile la théorie je reste encore à la rue lorsqu'il s'agit d'imaginer les algorithmes

    voici :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Sub Transactions()
     
    Application.ScreenUpdating = False
     
    Dim sh As Worksheet
    Dim varDate As Date
    Dim varIn As single
    Dim varOut As single
    Dim varDesc As String
    Dim codes As Range
    Dim Cell As Range
     
    Set codes = Sheets("accueil").Range("G5:G33")
     
    Sheets("accueil").Select
    For Each Cell In codes
        For Each sh In ThisWorkbook.Sheets
            If Cell.Value = sh.Name Then
               Cell.Select
                ActiveCell.Offset(0, 1).Select
                varDate = ActiveCell.Value
                ActiveCell.Offset(0, 1).Select
                varIn = ActiveCell.Value
                ActiveCell.Offset(0, 1).Select
                varOut = ActiveCell.Value
                ActiveCell.Offset(0, 1).Select
                varDesc = ActiveCell.Value
                sh.Select
                ActiveSheet.Cells(Rows.Count, "C").End(xlUp)(2).Select
                ActiveCell.Value = varDate
                ActiveCell.Offset(0, 1).Select
                ActiveCell.Value = varIn
                ActiveCell.Offset(0, 1).Select
                ActiveCell.Value = varOut
                ActiveCell.Offset(0, 1).Select
                ActiveCell.Value = varDesc
                Sheets("accueil").Select
            Else
     
     
            End If
        Next sh
     
    Next Cell
    End Sub

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    un bon code n'ayant déjà rien besoin de sélectionner, il suffit juste de travailler directement avec les objets …

    Et boucler cellule par cellule est souvent inutile, vaut mieux utiliser les fonctionnalités d'Excel
    - comme par exemple un filtre ou encore un filtre avancé -
    évitant ainsi les usines à gaz, rendant le code plus rapide et facile à maintenir …

    L'idée est de boucler sur chaque feuille de destination, filtrer la source des données sur son nom
    et de copier ainsi directement en une fois les données filtrées,
    comme on le ferait déjà rapidement manuellement :  Penser Excel Avant VBA  !

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  3. #3
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2013
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 45
    Par défaut
    J'ai effectivement souvent lu que les .select c'était le mal, malheureusement la plupart des documentations l'utilisent. En outre, je veux bien essayer mais j'ai beaucoup de mal à m'imaginer comment intervenir directement sur un objet lorsque je ne le connais pas. Par exemple, dans mon cas je vais rechercher la dernière cellule de mes colonnes de destination, comment puis intervenir dessus sans la sélectionner ?

    sinon je vais plancher sur ton idée de filtre car je ne maitrise pas cette notion dans vba en tout cas

  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
    Pour moi, il y a deux sortes de Select :

    La sélection de Worksheet et Workbook : Ca peut être utile pour éviter d'avoir à répéter la référence à ces objets quand on a une série d'appel à des Ranges leur appartenant. On peut les remplacer par une structure With mais ce n'est pas beaucoup mieux.
    Perso, je les utilise de moins en moins pour une raison très simple : quand on commence à avoir un code de quelques centaines de lignes, on finit par ne plus savoir quelle feuille est sélectionnée et ça rend très problématique des modification ou des copier/coller de portions de code dans une autre partie. Par exemple, dans ton code, tu alternes entre Sheets("Accueil") et sh dans tes sélections. Si tu avais une centaine de lignes entre les deux, il ne serait pas simple de savoir, pour chaque ligne de code, quelle est la feuille sélectionnée.
    Depuis quelques années, je préfère avoir systématiquement des variables qui font référence aux feuilles/fichiers utilisés et je les utilise pour chaque Range. Ca évite énormément de problèmes.

    Par exemple, au lieu d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sheets("accueil").Select
    Range("A1").Value = 1
    je préfère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim WS_Source As Worksheet
    [...]
    Set WS_Source = Sheets("accueil")
    WS_Source.Range("A1").Value = 1
    Dans ton cas, au lieu d'écrire :



    Second cas : la sélection de Range. Dans 99% des cas, ils sont inutiles, voir même gênants (complique le code, ralentit l'exécution, etc.).

    Par exemple, au lieu d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
               Cell.Select
                ActiveCell.Offset(0, 1).Select
                varDate = ActiveCell.Value
    on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                varDate = Cell.Offset(0, 1).Value
    Du coup, ton code devient :
    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
    Sub Transactions()
     
    Dim WS_Dest As Worksheet, WS_Source As Worksheet
    Dim L_Fin As Long, Lig As Long, Col As Long
     
    Set WS_Source = Sheets("accueil")
     
    For Lig = 5 To 33
        For Each WS_Dest In ThisWorkbook.Worksheets
            If Range("G" & Lig).Value = WS_Dest.Name Then
                L_Fin = WS_Dest.Cells(Rows.Count, "C").End(xlUp)(2).Row
                For Col = 3 To 6
                    WS_Dest.Cells(L_Fin, Col + 5).Value = WS_Source.Cells(Lig, Col).Value
                Next Col 
            End If
        Next WS_Dest
    Next Lig
    End Sub
    Et le ScreenUpdating = False devient beaucoup moins utile comme tu pourras le constater...

  5. #5
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2013
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 45
    Par défaut
    Wouaw merci Menhir, explications claires et précises et transformation de mon code amateur en un truc pro.

    Je approfondir ta méthode et tâcherai de m'en inspirer à l'avenir

    Bon clairement, je ne suis pas encore prêt à pondre une telle conceptualisation, j'espère que ça viendra, j'ai bien compris que c'était en pratiquant :-)

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Bonjour,

    Citation Envoyé par delpphil Voir le message

    Le code que je vous montre fonctionne bien, les blancs sont ignorés et tout va bien SAUF que si j'entre un code qui n'est pas sensé être bon (un numéro de feuille qui n'existe pas), et bien il ne se passe rien et donc l'erreur passerait inaperçu.

    J'ai essayé de dire que si la comparaison est différente affiche un message mais vu que ce sont des for each, chaque feuilles sauf la bonne renvois une erreur.
    j'ai essayé un while mais du coup ça me fait des boucles infinies.
    Utiliser un variable booléenne au niveau de la boucle cell

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    dim testfeuille as boolean
    for each cell in 
        testfeuille = true
        For Each sh In ThisWorkbook.Sheets
            If Cell.Value = sh.Name Then
                 testfeuille = false
              'le reste de ton code
             end if
         next sh
        if testfeuille then msgbox "erreur sur la cellule: " & cell.address & " feuille non trouvée"
          'le reste de ton code
    next cell

  7. #7
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2013
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 45
    Par défaut
    Citation Envoyé par Menhir Voir le message

    WS_Dest.Cells(L_Fin, Col + 5).Value = WS_Source.Cells(Lig, Col).Value
    J'ai toutefois une question concernant cette ligne,
    Donc j'ai soigneusement suivi ta logique et ça va pour la compréhention sauf le col+5 je ne comprends pas l'utilité du +5

    je lis : va sur le feuille de destination, dernière cellule, Colonne(index donné par la boucle) ... mais le +5 je vois pas

  8. #8
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2013
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 45
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Bonjour,

    Utiliser un variable booléenne au niveau de la boucle cell

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    dim testfeuille as boolean
    for each cell in 
        testfeuille = true
        For Each sh In ThisWorkbook.Sheets
            If Cell.Value = sh.Name Then
                 testfeuille = false
              'le reste de ton code
             end if
         next sh
        if testfeuille then msgbox "erreur sur la cellule: " & cell.address & " feuille non trouvée"
          'le reste de ton code
    next cell
    Alors ton code se rapproche vraiment de mes tentatives... Sauf que je n'y suis pas arrivé, je vais donc le prendre aussi pour essayer de comprendre où je me suis planté
    Après essai, oui on se rapproche vraiment de ce que je voulais faire il considère par contre les cellules "vide" de la plage comme étant une erreur. D'où comment intégrer le fait d'ignorer les blancs ?

    Je vais maintenant tester le code de menhir mais j'aimerais bien avoir ton avis sur ta vision aussi.

  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 delpphil Voir le message
    Donc j'ai soigneusement suivi ta logique et ça va pour la compréhention sauf le col+5 je ne comprends pas l'utilité du +5
    Si j'ai bien compris ton code (ce qui n'est pas une certitude), tu prends des valeurs en colonne G à J de l'onglet source pour les placer en colonne C à F de l'onglet destination.
    Si Col contient le numéro de colonne de la cellule destination de la donnée, il faut faire +5 pour obtenir la colonne correspondante pour la donnée source.

    Mais c'est du code tapé à l'arrache directement sur le forum et non testé. Il se peut donc (c'est même probable) qu'il contienne des erreurs ou des différence avec ce que tu souhaites faire.
    C'était surtout pour te montrer le principe de la gestion des feuilles source et destination par variables.

  10. #10
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2013
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 45
    Par défaut
    Menhir, ton code is perfect excepté le +5 qui est de trop dans mon cas

    J'edit après t'avoir lu : effectivement, mais le code n'est pas copié au même endroit dans les feuilles destination donc, le +5 n'est pas utile, la destination col générée par la boucle est bonne

    J'edit encore puisque une pièce vient de tomber lol : Siiii le +5 c'est bon mais pas en destination, en source

    sinon ça tourne d'enfer

    Ca m'impressionne toujours autant du si beau code. C'est aussi beau qu'une Harley tiens ;-)

    Encore merci

    Merci aussi à halaster08 et je suis toujours intéressé de voir comment tu gèrerais les blancs avec cette approche.

  11. #11
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Citation Envoyé par delpphil Voir le message
    D'où comment intégrer le fait d'ignorer les blancs
    Avec un if de plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if not(cell.text="") then
      If Cell.Value = sh.Name Then
    ...
      end if
    end if

  12. #12
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2013
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 45
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Avec un if de plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if not(cell.text="") then
      If Cell.Value = sh.Name Then
    ...
      end if
    end if
    Placé un cran au dessus entre les deux for each juste en dessus de l'initialisation de testfeuille à true ça marche très bien

    MERCIII C'était tout con en fait, problème de vocabulaire pour le coup

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

Discussions similaires

  1. vérification de passage dans un select case
    Par arsgunner dans le forum ASP
    Réponses: 5
    Dernier message: 14/06/2004, 10h05
  2. [VB6] procédure de vérification d'adresse mail ?
    Par ghohm dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 07/06/2004, 13h05
  3. [VB.NET] Vérification d'existance d'une table
    Par Hoegaarden dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/05/2004, 10h17
  4. Routines de gestion des ports sous Windows XP
    Par wiccanhelios dans le forum Windows
    Réponses: 2
    Dernier message: 14/11/2003, 08h02
  5. JavaScript de vérification de formulaire
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/02/2003, 13h48

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