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 :

Recupération de données [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Par défaut Recupération de données
    Bonjour à tous,
    je viens à vous pour un problème de récupération d'information.
    J'ai un fichier avec 2 onglets: 1 nommé travail, l'autre Données. Sur l'onglet "Travail", je dispose d'un tableau entrée/sortie/nom/poste
    Lorsque j'entre un "nom" en entrée, mon code va chercher dans l'onglet "Données", le nom correspondant. Jusque ici, ça va. L'endroit où cela bloque, c'est que lorsque je vais en case sortie (quelques lignes plus bas par exemple) le code retrouve dans le tableau le même nom qu'en entrée et inscrit en .offset(1,1) les mêmes infos.
    J'aimerai que le fameux code ne se réfère pas à ma case entrée mais compare avec ma Bdd et ensuite compare le résultat dans ma colonne nom et inscrive de la même manière mes infos. Je dispose de ce code mais je ne sais comment le modifier correctement, tout mes essais se sont transformés en échecs.

    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
    target = UCase(target)
        If target = target.Offset(-1, -2) Then target.Offset(, 1) = Now: Exit Function
        Set VehIn = Sheets("DONNEES").Range("A:A").Find(target, LookIn:=xlValues, LookAt:=xlWhole)
        With Range("B36:B335")
            Set VehOut = .Find(target, LookIn:=xlValues, LookAt:=xlWhole)
            If Not VehOut Is Nothing Then
                fa = VehOut.Address
                Do
                    With VehOut.Offset(1, 2)
                        If .Value = "" Then .Value = CStr(target): .Offset(, 1) = Now: target = "": Exit Function
                    End With
     
                    Set VehOut = .FindNext(VehOut)
                Loop While Not VehOut Is Nothing And VehOut.Address <> fa
            End If
        End With
        target = ""
    Merci d'avance pour vos réponse. Bonne journée à tous.

  2. #2
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    moi bête, moi pas comprendre.
    Un classeur avec un exemple de ce que tu veux pourrait aider.

  3. #3
    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,

    moi pas comprendre juste pourquoi en sortie le code ne fait pas la même chose qu'en entrée, pourtant facile à corriger !

    Qui plus est l'extrait de code est incomplet …

  4. #4
    Membre averti
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Par défaut
    Bonjour, EngueEngue.
    Non, toi pas bête, moi simplement essayer de décrire un fichier et ça pas si simple.
    J'ai donc fais un fichier d'exemple afin de préciser mes demandes.
    Pour le code, le voici en entier mais peut être as-tu besoin d'autres infos?
    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
    Function Sortie(target)
        target = UCase(target)
        If target = target.Offset(-1, -2) Then target.Offset(, 1) = Now: Exit Function
        Set VehIn = Sheets("DONNEES").Range("A:A").Find(target, LookIn:=xlValues, LookAt:=xlWhole)
        With Range("B36:B335")
            Set VehOut = .Find(target, LookIn:=xlValues, LookAt:=xlWhole)
            If Not VehOut Is Nothing Then
                fa = VehOut.Address
                Do
                    With VehOut.Offset(1, 2)
                        If .Value = "" Then .Value = CStr(target): .Offset(, 1) = Now: target = "": Exit Function
                    End With
     
                    Set VehOut = .FindNext(VehOut)
                Loop While Not VehOut Is Nothing And VehOut.Address <> fa
            End If
        End With
        MsgBox "Ce véhicule n'est pas entré !", vbOKOnly + vbExclamation, "ERREUR"
        target = ""
    End Function
    j'allais oublié le code pour " l'entré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
    Function Entree(target)
    If Not IsEmpty(target) Then
        target.Value = UCase(target.Value)
        Set VehIn = Sheets("DONNEES").Range("A:A").Find(what:=target, LookIn:=xlValues, LookAt:=xlWhole)
        If VehIn Is Nothing Then
          MsgBox "Ce véhicule n'est pas répertorié ! Vérifiez que la plaque est bonne et renseignez la case modification.", vbOKOnly + vbExclamation, "ERREUR"
          target.Offset(0, 1) = Now
          Exit Function
        End If
        With target
            .Offset(0, 1) = Now
            Set Sh = Sheets("DONNEES")
            For c = 4 To 8
                .Offset(, c) = Sh.Cells(VehIn.Row, c - 2)
          Next
        End With
      End If
    End Function
    Cette partie de code n'est pas de moi, j'en ai compris l'essentiel mais je rame à pouvoir le modifier.

    Bonjour Marc-L, en faite, j'ai juste besoin de mettre, pour des facilités de lectures, les entrées et les sorties ensembles.
    Fichiers attachés Fichiers attachés

  5. #5
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Bonjour

    Même avec le fichier teste (qui ne contient pas les macros) j'ai du mal à comprendre.
    Il serait peut-être intéressant d'expliquer le but de ce fichier, c'est une sorte de système de suivi des utilisations de véhicules dans une entreprise?

    Plutôt que de nous expliquer étape par étape ce que le fichier doit faire, l'explication global nous permettrait sans doute de trouver une réponse peut-être plus adapté et/ou plus logique que celle que tu t'es forgé en tête et qu'il est visiblement difficile de retranscrire.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Membre averti
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Par défaut
    Bonjour à tous,
    je vais vous décrire mon fichier.

    Tout d'abord, il s'agit d'une gestion d'entrée et de sortie du personnel. Pour se faire, je dispose en premier lieu des plaques d'immatriculation des véhicules. Lorsque une voiture se présente, la plaque est inscrite dans la colonne des entrées, le code vba va chercher dans la BDD le nom correspondant et inscrit en face de la plaque: l'heure, le nom, l'autorisation d'entrée.....
    Quand un véhicule sort, il faut inscrire dans la case sortie sa plaque et le code Vba fait la même chose qu'en entrée mais pour des problèmes de lisibilités, j'ai besoins d'inscrire l'heure de sortie en "face" de l'heure d'entrée.
    Cela me permet en temps réel de savoir qui est encore présent sur le site. Car, en cas d'urgence, j'imprime la liste des personnes qui sont présente et seulement ça.
    Ce qui complique les chose, et le but de ma demande, c'est que, il arrive que du personnel entre en voiture, ressorte à pied revienne en vélo et finisse par partir en voiture.
    Actuellement, le fichier fonctionne bien avec des entées et sorties égales, c'est à dire, une entrée en voiture et une sortie en voiture. Mais lorsque, j'ai une entrée en voiture et une sortie à pied, le fichier gère l’événement comme étant 2 personnes différentes.
    Il est difficile de se baser sur autre chose que les "mouvements", par les noms par exemple car hormis, quelques personnes fixes, les autres sont, pour la plupart des interims, qui viennent pour quelques jours voir quelques mois.
    L'automatisation de mon fichier, sert à un gain de temps et éviter un maximum d'erreurs.
    Une colonne entrée où il suffit de cliquer n'importe ou sur la colonne pour que cela sélectionne automatiquement la première case vide dans la colonne pour avoir les entrée dans l'ordre. Idem, pour la colonne des sorties sauf que j'essaye de reconnaître à quel moment une personne est entrée malgré son moyen de locomotion.
    Voilà, espérant avoir réussi à vous expliquer le fonctionnement de ce fichier.
    Bonne journée à tous.

    Bonjour à tous,
    après quelques modifications sur mon fichier, je me permet de vous le soumettre à nouveau.
    J'ai réussi en partie à faire ce que je voulais mais il me reste quelques lacunes qui font que je n'avance plus.

    Dans mon fichier, j'aimerai pouvoir décaler le "résultat" allant de (F:J) à la (E:I).

    J'ai toujours un petit soucis sur mes paramètres de recherche et pour couronner le tout un défaut sur l'action de Suppr. et Backspace sur des cellules en colonnes (D).

    Le code n'étant pas de moi, j'ai réussi à le "comprendre et le modifier" en partie mais mes connaissances sont limitées à cette heure.

    Est-ce que l'un de vous pourrait m'aider?
    Merci d'avance
    Bonne soirée à vous
    Fichiers attachés Fichiers attachés

  7. #7
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Voila un exemple de gestion des entrée/Sortie dans ton tableau.

    J'ai fais quelques modifications sur la feuille et refait un code, je te laisse regarder, le code est commenté.

    J'ai essayé de tenir compte de tous les cas de figure comme je te l'avais expliqué dans un message précédent.
    Une seule procédure gère à la fois les entrées et les sorties. Je n'ai pas fait tous les testes, je te laisse regarder et modifier au besoin.

    ++
    Qwaz
    Fichiers attachés Fichiers attachés

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  8. #8
    Membre averti
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Par défaut
    Bonsoir Qwazerty, le forum.

    Que dire? Impeccable? Royal? .... Et j'en passe.

    Effectivement, cette gestion est plus simple.

    J'ai quand même quelques questions supplémentaires.

    Comment fait tu pour que la mise en forme se fasse (colonne autorisation) tout au long du tableau? La formule est simple et elle se recopie tout au long du tableau. Pourtant à la base, elle s'applique à une seule case (enfin, il me semble)

    Pour continue sur le tableau, est ce possible de garder le format "tableau à bande"?

    Lors de ma "régénération" dois-je supprimer l'ensemble des lignes du tableau et ne laisser que les entêtes?

    En tout cas, merci pour ton coup de main, je vais en théorie pouvoir finir mon fichier.

    Bon week-end à toi et au forum

    Bonjour à tous,
    j'ai trouvé concernant ma fameuse "régénération" de page comment faire pour effacer le tableau tout en gardant les formules et mise en forme.
    Je ne sais pas si le code est académique mais il fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
    Range(F_Travail.ListObjects("Tab_Travail")).Delete
    Set NewRow = F_Travail.ListObjects("Tab_Travail").ListRows.Add
    Range("A36").Select
        ActiveCell.FormulaR1C1 = "=ROW()-35-1"
    F_Travail.[C29].Select
            ActiveCell.FormulaR1C1 = "DEBUT"
    F_Travail.[C30].Select
            ActiveCell.FormulaR1C1 = "DEBUT"
        Range("A36:J36").Select
        Selection.ListObject.ListRows(1).Delete
    F_Travail.[C29].Select
    End Sub
    Par contre, je rame toujours question ligne à bande pour la visibilité.

    @ Qwazerty, j'ai fais des essais concernant les entrées, y a-t-il une solution pour que, si le véhicule est inconnu, cela l'inscrive quand même? La dernière colonne est réservé à cet effet et permet de créer une fiche ultérieurement tout en prenant en compte l'entrée et la sortie même si c'est un inconnu?

    Bonne journée à tous
    Fichiers attachés Fichiers attachés

  9. #9
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Comment fait tu pour que la mise en forme se fasse (colonne autorisation) tout au long du tableau? La formule est simple et elle se recopie tout au long du tableau. Pourtant à la base, elle s'applique à une seule case (enfin, il me semble)
    C'est le tableau qui le gère, je ne fais rien du tout, je lui est juste indiqué la formule, il se charge de la recopier à chaque création de ligne.

    Pour continue sur le tableau, est ce possible de garder le format "tableau à bande"?
    Il me semblait qu'il le faisait, tu veux bien dire garder la mise en forme couleur et format de la partie données?

    Lors de ma "régénération" dois-je supprimer l'ensemble des lignes du tableau et ne laisser que les entêtes?
    Tu peux simplifier ton code en notant directement les valeurs dans le tableau, sans passer par les cellules "entre" et "sort".

    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
    Private Sub CommandButton1_Click()
        'Vide le tableau
        'Range(F_Travail.ListObjects("Tab_Travail")).Delete 'attention à préciser la feuille F_Travail.Range(F_Travail.ListObjects("Tab_Travail")).Delete
        'Sinon plus "propre" et de plus attention si le tableau est vide ça plante
        With F_Travail.ListObjects("Tab_Travail")
            If .ListRows.Count > 0 Then .DataBodyRange.Delete
        End With
        'Ajoute une ligne vierge
        Set NewRow = F_Travail.ListObjects("Tab_Travail").ListRows.Add
        'Renseigne les valeurs de début
        NewRow.Range(2).Value = "Debut"
        'et ainsi de suite pour les autres cellules
        '...
     
        'On force la selection de la cellule "entre"
        F_Travail.[C29].Select
    End Sub

    Pour l'histoire du véhicule non répertorié, tu as 2 choix:
    • Soit tu l'enregistres automatiquement dans la liste, en plaçant la même valeur dans Identification, Nom et Prénom (tu y met l'immat du véhicule) dans ton tableau de la feuille Données (que tu pourrais d'ailleurs transformé en "tableau" comme celui de la feuille travail) et ensuite tu laisse dérouler le code
    • Soit tu crées une ligne dans le tableau "Travail" où tu renseigne ID, Nom et prénom en mettant la même valeur partout (la plaque d'immat.). Mais ça risque d'être plus compliqué pour la suite quand tu vas inscrire l'ID dans "sort"

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  10. #10
    Membre averti
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Par défaut
    Bonsoir Qwazerty, le forum,

    Une fois de plus dans le mille!

    Déjà, désolé, je n'avais pas renseigné mes lignes comme tu me l'avais conseillé. Je vais y faire plus attention à l'avenir

    L'effacement du tableau se fait sans problème et mieux en plus.

    Ce que j'appelle tableau à bande c'est lorsque tu as une ligne sur deux qui est en couleur par exemple. Effectivement, c'était à cause de ma mise en forme des cellules que mon tableau ne se remplissait pas correctement. Le modèle que j'avais d'avant est un tableau déjà constitué sur 400 lignes environ dont j'avais fait la mise en forme couleur.

    Pour l'histoire du véhicule non répertorié, tu as 2 choix:
    Soit tu l'enregistres automatiquement dans la liste, en plaçant la même valeur dans Identification, Nom et Prénom (tu y met l'immat du véhicule) dans ton tableau de la feuille Données (que tu pourrais d'ailleurs transformé en "tableau" comme celui de la feuille travail) et ensuite tu laisse dérouler le code
    Soit tu crées une ligne dans le tableau "Travail" où tu renseigne ID, Nom et prénom en mettant la même valeur partout (la plaque d'immat.). Mais ça risque d'être plus compliqué pour la suite quand tu vas inscrire l'ID dans "sort"
    Si je te suis bien, la première solution serai la meilleur. Dans le style, si le véhicule n'est pas reconnu, ouvrir un usf, mettre les renseignements et relancer le code d'entrée?

    Bonne soirée à tous

  11. #11
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Pense également à la déclaration de tes variable, j'ai oublié de la rajouter pour NewRow

    Hum, je pensais plutôt à directement ajouter une ligne dans le tableau "Données", à partir du code, par exemple

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    Sub Mouvement(Target As Range, TypeM As String)
    'Déclaration des variables
    Dim VehIn As Range
    Dim NomAgent As String, PrenomAgent As String
    Dim Sh As Worksheet
    Dim CellId As Range
    Dim FirstCellAdd As String
    Dim NewRow As ListRow
     
     
        'On recherche la ligne de données correspondante au vehicule saisi
        '(Ici jutilise le codeName de la feuille F_Donnees, il se trouve dans les propriétés de la feuille DONNEES sous l'appellation "(Name)")
        Set VehIn = F_Donnees.Range("A:A").Find(what:=Target, LookIn:=xlValues, LookAt:=xlWhole)
        If VehIn Is Nothing Then
            'Pas de correspondance
            'MsgBox "Le véhicule '" & Target.Value & "' n'est pas répertorié !", vbOKOnly + vbExclamation, "ERREUR"
            'Target = ""
            'On ajoute une ligne au tableau "Données" (il serait mieux de le convertir un tableau ListObject, c'est plus simple à manipuler)
            Set NewRow = F_Donnees.ListObject("Tab_Donnees")....
            'On renseigne le contenu, provisoirement la même chose dans les 3 cellules principales
            NewRow.Range(1) = Target
            NewRow.Range(2) = Target
            NewRow.Range(3) = Target
            'On pointe cette ligne comme correspondant à la demande
            Set VehIn = NewRow.Range(1)
        End If
        'On ferme le If, à partir d'ici VehIn aura forcement un contenu donné soit par la recherche Find, soit par le Set en fin de boucle.
     
     
        'Correspondance trouvée
        'On récup le nom + prénom de l'agent
        NomAgent = VehIn.Offset(, 1).Value
        PrenomAgent = VehIn.Offset(, 2).Value
     
        'On recherche si cet identifiant est déjà dans la liste
        With F_Travail.ListObjects("Tab_Travail").ListColumns("Nom").DataBodyRange 'On ne prend en compte que les données de la colonne "Nom" du tableau Tab_Travail
     
            'On fait une recherche en boucle dans la colonne "Nom"
            Do
                If CellId Is Nothing Then
                    Set CellId = .Find(NomAgent, LookIn:=xlValues, LookAt:=xlWhole)
                Else
                    Set CellId = .FindNext(CellId)
                End If
     
                'Si on a trouvé une entrée
                If Not CellId Is Nothing Then
     
                    'Si on est déjà passé par cette cellule
                    If CellId.Address = FirstCellAdd Then
                        '###Dans le cas d'une Sortie de personnel###
                        If TypeM = "Sortie" Then
                            'Un tour complet de la colonne a été fait sans trouver de correspondance
                            'A toi de voir comment tu veux gérer cette situation
                            MsgBox (NomAgent & " " & PrenomAgent & " : Personne non présente sur le site")
                        '###Dans le cas d'une Entrée de personnel###
                        Else
                            'On place une nouvelle ligne dans le tableau*
                            AjoutLigne Target, VehIn
                        End If
                        'Dans tous les cas, on sort de la pracédure
                        Exit Sub
                    End If
     
                    'Si c'est la 1ère occurence on se repère dans le tableau (pour ne pas boucler à l'infini)
                    If FirstCellAdd = "" Then FirstCellAdd = CellId.Address
     
                    'On regarde si le prénom correspond
                    If CellId.Offset(, 1).Value = PrenomAgent Then
                        'On concidère être sur la bonne personne
                        'On regarde si la sortie est renseigné
                        If CellId.Offset(, -1).Value = "" Then
                            '###Dans le cas d'une Sortie de personnel###
                            If TypeM = "Sortie" Then
                                'L'agent est bien présent dans les locaux, on idique son heure de sortie
                                CellId.Offset(, -1).Value = Time()
                                'On vide la case Sort
                                F_Travail.[C30].ClearContents
                            '###Dans le cas d'une Entrée de personnel###
                            Else
                                'Problème la personne rentre dans le site sans en être ressortie avant
                                'A toi de voir comment tu veux gérer cette situation
                                MsgBox (NomAgent & " " & PrenomAgent & " : Cet personne devrait déjà être sur le site.")
                            End If
                            'On quitte donc la boucle
                            Exit Do
                        End If 'dans le cas contraire on continue la boucle
     
                    End If
                Else
                    '###Dans le cas d'une Sortie de personnel###
                    If TypeM = "Sortie" Then
                        'Problème la personne qui sort n'a pas été inscrite à son entrée sur le registre
                        'A toi de voir comment tu veux gérer cette situation
                        MsgBox (NomAgent & " " & PrenomAgent & " : Personne non présente sur le site")
                    '###Dans le cas d'une Entrée de personnel###
                    Else
                        'On place une nouvelle ligne dans le tableau*
                        AjoutLigne Target, VehIn
                    End If
                    'Dans tous les cas, on sort de la pracédure
                    Exit Sub
                End If
     
            Loop Until CellId Is Nothing
        End With
     
    End Sub
    Essai e comprendre le code pour pouvoir le modifier à ta guise, le mieux pour se faire étant de mettre un point d'arrêt au début du code et ensuite de faire du pas à pas (touche F8), comme ça tu verras en fonction de ce que tu rentres dans les cases C29/C30 comme le code réagi.
    Il te sera difficile de modifier un code que tu ne comprends pas.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  12. #12
    Membre averti
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Par défaut
    Bonjour,

    j'ai bien essayé de comprendre le code mais il bloque à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            'On ajoute une ligne au tableau "Données" (il serait mieux de le convertir un tableau ListObject, c'est plus simple à manipuler)
            Set NewRow = F_Donnees.ListObject("Tab_Donnees")
    en disant: "Membre de méthode ou Données introuvables"

    J'ai tenté quelques instructions mais toutes ont été infructueuses.

    J'ai créer sur la F_Donnees, un tableau que j'ai nommé "Tab_Donnees" mais rien y fait.
    J'ai essayé de regarder sur internet comment déclarer un tableau en listobject mais je pense que je n'ai pas chercher aux bons endroits.

    Bonne journée.

    A plus

  13. #13
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    C'est juste que je n'avais pas écrit tout le code (j'ai peu de temps le matin).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    'On ajoute une ligne au tableau "Données"
    Set NewRow = F_Donnees.ListObject("Tab_Donnees")....
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'On ajoute une ligne au tableau "Données"
    Set NewRow = F_Donnees.ListObject("Tab_Donnees").ListRows.add
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  14. #14
    Membre averti
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Par défaut
    Bonsoir,
    j'ai fais la modification, mais le code bloque encore à: .ListObject

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Set NewRow = F_Donnees.ListObject("Tab_Donnees").ListRows.Add
    Ai-je oublié quelque chose?

    Bonne soirée.

    Re bonsoir,

    J'ai enfin trouvé d'ou venait le problème.
    Il manquait un "S" à ListObject pour que cela fonctionne.

    Je vais maintenant étudié ton code comme tu me l'as conseillé.
    Je te fais un retour d'informations dès demain.

    Merci.

    Bonne soirée

  15. #15
    Membre averti
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Par défaut
    Bonsoir Qwazerty, le forum.

    Donc, tout fonctionne ou presque.

    Pour pouvoir gérer, les modifications au tableau de la feuille de Donnees, j'ai rajouté au code une ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            'On renseigne le contenu, provisoirement la même chose dans les 3 cellules principales
            NewRow.Range(1) = Target
            NewRow.Range(2) = Target
            NewRow.Range(3) = Target
            NewRow.Range(4) = t 'pour le terme temporaire
    Vu que ces personnes viennent temporairement et qu'elles sont inscrites dans la Bdd, je voulais lors de ma "régénération" les supprimer du tableau. Pour les repérer, le "t" en 4ème colonne est l'idéal vu que les autres termes sont: "OUI" ou "NON".
    J'ai fais un code mais en faite, il ne fait pas les choses comme je veux.
    Soit, il ne fait pas toutes les lignes, soit il efface carrément la colonne 4.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub TestSuppression()
    Dim MyRange As Range, c As Range
    Set MyRange = F_Donnees.Range("d:d")
    'Pour chaque cellule de la plage de recherche
    For Each c In MyRange
    ' Si dans la cellule, il y a "t" alors Selection et Suppression de la ligne
    If c.Value = "t" Then c.Rows.Delete
    Next c
    End Sub
    A quel endroit me suis-je trompé?

    Bonne soirée à tous

  16. #16
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Lorsque tu veux faire une suppression d'une ou plusieurs lignes dans une boucle, il faut toujours faire une boucle inverse, c'est à dire en partant par la fin. Il n'est donc pas possible d'utiliser for EACH, il faut faire une boucle For "classic", regarde sur le forum, le problème est rencontré très souvent.

    Pour limité la taille de la boucle (Colonne complète avec une boucle For c'est trop important) pense à utiliser le ListObject,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    F_Donnees.ListObjects("....").ListColumns(Nomdelacolonne quivabien).datarange (à vérifier).

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  17. #17
    Membre averti
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Par défaut
    Bonjour Qwazerty, le forum,
    Je suis désolé de ne pas avoir répondu de suite à ton message.

    Je ne suis pas arrivé à mettre quelque chose de correcte en place avec ce que tu me proposais.

    Néanmoins, j'ai quand même réussi à trouver un petit bout de code que j'ai réussi à adapter et qui fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     For X = F_Donnees.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row To 1 Step -1
     If Cells(X, 4) = "t" Then Rows(X).Delete Shift:=xlUp
     Next X
    Ce n'est peut être pas ce à quoi tu pensais.
    En tout cas, j'ai pu faire considérablement avancer mon fichier. Bien sur, il n'est pas encore fini mais ça progresse.

    Je te remercie de ta patience et de tes explications.

    Bonne journée.
    A plus

  18. #18
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Je suis pas fan du Usedrange et je comprend pas pourquoi tu utilises .count + .rows

    Sinon quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For X = F_Donnees.cells(F_Donnees.rows.count,"A").end(xlup).row To 1 Step -1
         'Attention à bien préciser la feuille de travail
         If F_Donnees.Cells(X, 4) = "t" Then F_Donnees.Rows(X).Delete Shift:=xlUp
    Next X
    tu dois pouvoir aussi utiliser Find en inversant la boucle de recherche, il y a un paramètre pour faire ça regarde dans l'aide si besoin

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  19. #19
    Membre averti
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Par défaut
    Bonsoir Qwazerty,
    je me servais du .count + .rows car cela ne fonctionnait pas sans tout bêtement. Dès que je modifiait de ce côté là, cela ne marchait pas.

    Ton "Quelque chose comme" fonctionne très bien par contre.

    Je vais regarder du côté de Find.

    Bonne soirée à toi

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

Discussions similaires

  1. [vb.net]recupération de donnée provenant d'un fichier xml
    Par moust dans le forum Windows Forms
    Réponses: 24
    Dernier message: 04/07/2005, 09h55
  2. Pb recupération de donnée
    Par Mano dans le forum ASP
    Réponses: 16
    Dernier message: 11/05/2005, 18h08
  3. Réponses: 2
    Dernier message: 20/01/2005, 15h19
  4. [MFC]Recupération de donnée et conversion
    Par Guilhem dans le forum MFC
    Réponses: 8
    Dernier message: 16/06/2004, 10h36
  5. [Indy TCPClient] Recupérer le données reçues
    Par fandor7 dans le forum Web & réseau
    Réponses: 8
    Dernier message: 29/06/2003, 21h52

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