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 :

Tri de donnée pour suivre état d'avancement des opérations


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 59
    Points : 40
    Points
    40
    Par défaut Tri de donnée pour suivre état d'avancement des opérations
    Bonjour à tous,

    Excusez moi pour l'intitulé de la discussion mais je n'ai pas réussi à exprimer mon problème en une phrase compréhensible...

    J'ai mis en pièce jointe mon fichier.
    Tri.xls
    J'ai rajouté sur le fichier quelques explications pour comprendre mon problème.
    Chaque donnée affiche un nombre de tache réalisée par rapport au total des taches à effectuer. Par exemple 2/6. On a ici 2 tache effectuée sur 6 à faire au total.

    Pour permettre le tri des données j'ai pensé peut etre à transformer ces 2/6, 1/3,... Par la différence entre le total et le réalisé : 6-2 = 4. Ca peut eventuellement simplifier le tri. Qu'en pensez vous ?


    J'aimerais faire cela car je dois suivre l'état d'avancement des taches effectués qui sont accecible sur un site annexe qui donne les données de cette maniere (2/6,...).


    Je ne sais pas trop si c'est faisabe via VBA. Si vous avez d'autres idées pôur traiter mon probleme n'hesitez pas à me les donner

    Un grand merci à tous !

    Bonne journée !

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Tu pourrais le faire avec formule en changeant A1 par la bonne cellule:

    =GAUCHE(A1;TROUVE("/";A1;1)-1)
    =DROITE(A1;NBCAR(A1)-TROUVE("/";A1;1))
    En VBA, il y a Split qui te permet de tranférer dans un tableau
    Tu aurais donc Tablo(0) et Tablo(1) comme résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim Tablo
    Tablo = Split(Range("A1"), "/")
    MsgBox Tablo(0)
    MPi²

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 59
    Points : 40
    Points
    40
    Par défaut
    J'ai réussi à trouver une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell = Right(Cells(13, 7), Len(Cells(13, 7)) - InStr(Cells(13, 7), "/")) - Left(Cells(13, 7), InStr(Cells(13, 7), "/") - 1)
    Cells pointe vers une cellule avec la donnée 4/6. Après exécution de la macro je retrouve bien 2.

    Cependant je ne trouve pas comment faire pour appliquer ça à toutes les cellules de plusieurs colonnes.
    J'ai commencé par faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub CommandButton2_Click()
      Dim Col As Range
      Dim C As Range
          For Each Col In Range("G1:I65000").Columns
              For Each C In Col.Cells
                   If C.Value = "" Then
                   Else
                   C.Value = Right(Cells(13,7), Len(Cells(13,7)),  - InStr(Cells(13,7), , "/")) - Left(Cells(13,7), , InStr(Cells(13,7), , "/") - 1)
                   End If
              Next C
          Next Col
    End Sub
    Dans ce code je ne sais pas comment remplacer Cells(13,7) pour faire référence à la cellule en cours.

    Avez vous des idées ? svp

    Merci !

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Essaie en changeant 13 par C.Row
    Cells(13,7) deviendrait Cells(C.Row,7)
    MPi²

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 59
    Points : 40
    Points
    40
    Par défaut
    Parfait, ca marche !

    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
     
    Sub Filtrage_données()
    Dim Col As Range 'Colonne
    Dim Cel As Range 'Cellule
     
                For Each Col In Range("F8:M65000").Columns 'Selection des colonnes
                For Each Cel In Col.Cells
                    If Cel.Value = "" Then
                    Else
                    ' On veut obtenir le nombre de tache                
                     Cel.Value = Right(Cells(Cel.Row, Col.Column), Len(Cells(Cel.Row, Col.Column)) - InStr(Cells(Cel.Row, Col.Column), "/")) - Left(Cells(Cel.Row, Col.Column), InStr(Cells(Cel.Row, Col.Column), "/") - 1)
                    'Remplacer les cellules avec un 0 pour avoir une meilleure visibilité
                    If Cel.Value = "0" Then Cel.Value = ""
                End If
                Next Cel
                Next Col
    End Sub
    Question bonus : Le lancement de la macro met un peu de temps. Avec le code ci-dessus, on utilise toutes les lignes de la feuille -> Range("F8:M65000").
    Si on sélectionne uniquement la plage de données contenant des valeurs (en utilisant par exemple xlup, ou autres fonctions), est-ce que ca irait plus vite?

    Merci bien !

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 59
    Points : 40
    Points
    40
    Par défaut
    J'ai fait le test et effectivement ca excécute plus vite
    Voici le code final, si ca peut aider :

    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
    Sub Filtrage()
    Dim Col As Range 'Colonne
    Dim Cel As Range 'Cellule
    derligne = 8
    Do While Cells(derligne, 4).Value <> ""
    derligne = derligne + 1
    Loop
                For Each Col In Range(Cells(8, 6), Cells(derligne, 13)).Columns 'Selection des colonnes 
                For Each Cel In Col.Cells
                    If Cel.Value = "" Then
                    Else
                    ' On veut obtenir le nombre de tache qui reste à réaliser 
                   Cel.Value = Right(Cells(Cel.Row, Col.Column), Len(Cells(Cel.Row, Col.Column)) - InStr(Cells(Cel.Row, Col.Column), "/")) - Left(Cells(Cel.Row, Col.Column), InStr(Cells(Cel.Row, Col.Column), "/") - 1)
                    'Remplacer les cellules avec un 0 pour avoir une meilleure visibilité
                    If Cel.Value = "0" Then Cel.Value = ""
                End If
                Next Cel
                Next Col
    End Sub
    Il y a forcement plus simple.

  7. #7
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonjour,

    essayes (fait à main levée, alors à controler)
    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
    Sub Filtrage_données()
    Dim tbl, x As Long, DerCel As Range, y As Long
    With Sheets("nom de ta feuille")
      Set DerCel = .Range("M" & .Rows.Count).End(xlUp)
      tbl = .Range("F8", DerCel)
      For x = 1 To UBound(tbl, 1)
        For y = 1 To UBound(tbl, 2)
          If tbl(x, y) <> "" Then
            tbl(x, y) = Split(tbl(x, y), "/")(1) - Split(tbl(x, y), "/")(0)
            If tbl(x, y) = 0 Then tbl(x, y) = ""
          End If
        Next y
      Next x
      .Range("F8").Resize(UBound(tbl, x), UBound(tbl, y)) = tbl
    End With
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

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

Discussions similaires

  1. Tri de données pour post-traitement
    Par Corsaire_1 dans le forum MATLAB
    Réponses: 13
    Dernier message: 25/01/2011, 18h32
  2. [AC-2003] Récupérer une donnée pour un état !
    Par rjl dans le forum IHM
    Réponses: 1
    Dernier message: 04/09/2010, 13h36
  3. Réponses: 0
    Dernier message: 26/10/2007, 11h43
  4. affecter la source de données pour mon état
    Par islamune9 dans le forum VB.NET
    Réponses: 4
    Dernier message: 10/05/2007, 10h11

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