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 :

Liste avec compteur de 0


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 19
    Par défaut Liste avec compteur de 0
    Bonjour,
    Voila, j'ai une liste de chiffre se présentant sous cette forme (à x ligne et 6 colonnes)
    122 222 77 0 0 55
    222 88 3 0 0 0 0
    0 4 4 4 33 3 99
    4 0 55 33 88 0 0 ...

    Chaque ligne représente 1h donc une colonne représente 10 min (6 colonnes)

    Je souhaiterai répertorier le nombre de 0 (correspondant à un arrêt) inférieur à 10min (cad au minimum deux zéro qui se suivent) , à 1h (cad au minimum 6 zéro qui se suivent) et supérieur à 1h.

    J'ai commencé une macro, mais je pense ne pas être sur la bonne voie :
    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
    Sub Macro1()
    Dim DD As String
    Dim rr As String
    Dim m As Long
    Dim i As Variant, p As Variant, j As Variant, u As Variant, q As Variant
    For p = 0 To 774
    For i = 0 To 6
        With Feuil1
        rr = .Range("D5").Offset(i, p).Text
        If rr = "" Then Exit Sub
        If i = 6 Then p = p + 1 And i = 0
          If rr = 0 And rr = .Range("D4").Offset(i + 1, p).Text Then
           m = m + 1
           Else
           Feuil18.Range("K & i").Value = m
     
    End If
     
     
    MsgBox (m)
     
    End With
     
    Next
    Next
    End Sub
    Si vous avez des idées

    D'avance Merci

    azsdcv

  2. #2
    Membre Expert
    Femme Profil pro
    Data engineer
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Data engineer
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Bonjour,

    Si j'ai bien compris, tu veux compter les blocs de 0 consécutifs et savoir s'il s'agit de blocs de moins de 2, moins de 6 ou plus de 6.

    A la lecture de ton code j'ai quelques remarques :
    • Premier conseil : donner des noms explicites aux variables et indenter le code.
    • Pour boucler sur 6 colonnes, il faut aller de 0 à 5, et non de 0 à 6
    • la fonction Offset est mal utilisée car il faut donner la ligne en premier et la colonne en deuxième
    • Je n'ai pas bien compris d'où doit partir la boucle : D4 ou D5 ?
    • L'endroit où écrire le résultat n'est pas clair non plus


    Je te propose ce code qui démarre en A1 et affiche le résultat dans un MsgBox, tu peux ensuite modifier la cellule de départ et utiliser les variables comme tu l'entends :
    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
    Sub CompteArrets()
    Dim lngLigne As Long
    Dim intColonne As Integer
    Dim lngCompte0 As Long
    Dim lngNb10mn As Long
    Dim lngNb1h As Long
    Dim lngNbPlus As Long
    Dim strCell As String
     
    For lngLigne = 0 To 774
        For intColonne = 0 To 5
            strCell = Feuil1.Range("A1").Offset(lngLigne, intColonne).Text
            If strCell = "0" Then
                lngCompte0 = lngCompte0 + 1
            ElseIf lngCompte0 <> 0 Then
                If lngCompte0 < 2 Then
                    lngNb10mn = lngNb10mn + 1
                ElseIf lngCompte0 < 6 Then
                    lngNb1h = lngNb1h + 1
                Else
                    lngNbPlus = lngNbPlus + 1
                End If
                lngCompte0 = 0
            End If
            If strCell = "" Then Exit For
        Next intColonne
        If strCell = "" Then Exit For
    Next lngLigne
     
    MsgBox "Nombre d'arrêts inférieurs à 10 mn = " & lngNb10mn & "," & vbCrLf _
         & "Nombre d'arrêts inférieurs à 1 heure = " & lngNb1h & "," & vbCrLf _
         & "Nombre d'arrêts supérieurs à 1 heure = " & lngNbPlus
     
    End Sub

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Par défaut
    salut
    Je souhaiterai répertorier le nombre de 0 (correspondant à un arrêt) inférieur à 10min (cad au minimum deux zéro qui se suivent) , à 1h (cad au minimum 6 zéro qui se suivent) et supérieur à 1h.
    Je voudrais en ce qui me concerne 2 précisions :
    1) comment distingues-tu les pauses supérieures à 1 h ? (puisque tu dis n'avoir que 6 colonnes
    Voila, j'ai une liste de chiffre se présentant sous cette forme (à x ligne et 6 colonnes)
    et que 6 zéros consécutifs signifient 1 h de pause ?
    2) ton décompte des pauses doit-il être fait par ligne (et dans ce cas dans quelle colonne de cette ligne) ou au total (et dans ce cas dans quelle cellule ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Au delà de l'imprécision de l'énoncé (parfois tu as 6 colonnes, parfois 7 dans le tableau que tu donnes), je propose l'utilisation des formules Excel au sein de VBA qui évitent les boucles et les tests.

    En considérant que la plage à tester est la plage A2:F21, tu auras le nombre de pauses de 10 minutes maximum (1 seul zéro par ligne) avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    evaluate("SUMPRODUCT((((A2:A21=0)+(B2:B21=0)+(C2:C21=0)+(D2:D21=0)+(E2:E21=0)+(F2:F21=0))=1)*1)")
    et le nombre de pauses de 1h (6 zéros par ligne) avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    evaluate("SUMPRODUCT((((A2:A21=0)+(B2:B21=0)+(C2:C21=0)+(D2:D21=0)+(E2:E21=0)+(F2:F21=0))=6)*1)")
    Il y a bien sûr moyen d'adapter le code pour des plages dynamiques, mais là aussi, je préfère de loin nommer les plages en Excel et utiliser les plages nommées en VBA.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Sauf qu'il faudrait compter par exemple un 0 à la fin d'une ligne X et un 0 en début de ligne X+1
    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
    Dim LastLig As Integer, i As Integer, j As Integer, t As Integer
    Dim Tblo(1 To 3) As Integer
     
    With Sheets("Feuil2")
        LastLig = .Cells(Rows.Count, 1).End(xlUp).Row
        For i = 1 To LastLig + 1
            For j = 1 To 6
                If .Cells(i, j).Value = 0 And .Cells(i, j).Value <> "" Then
                    t = t + 1
                Else
                    If t > 1 Then
                        Select Case t
                            Case Is < 6: Tblo(1) = 1 + Tblo(1)
                            Case 6: Tblo(2) = 1 + Tblo(2)
                            Case Is > 6: Tblo(3) = 1 + Tblo(3)
                        End Select
                    End If
                    t = 0
                End If
            Next j
            If i = LastLig + 1 Then Exit For
        Next i
    End With
    '-------------------------------------
    If Tblo(1) > 0 Then MsgBox Tblo(1) & " arrêts supérieur à 10 min"
    If Tblo(2) > 0 Then MsgBox Tblo(2) & " arrêts d'une heure"
    If Tblo(3) > 0 Then MsgBox Tblo(3) & " arrêts supérieur à 1 heure"

  6. #6
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 19
    Par défaut re
    Bonjour,
    Merci de ton aide Tedo01
    Ta macro marche du tonnerre

    J'aurai un petit service à vous demander :
    A côté de ces 6 colonnes de chiffre son affiché sur la première colonne la date, sur la deuxième l'heure. Est-on capable de dire à quel moment c'est passé l'arrêt (=0) entre telle et telle heure.
    ex : à la ligne 1
    3 éme colonne :2h
    4 éme colonne :2h10
    5 éme colonne :2h20
    6 éme colonne :2h30
    7 éme colonne :2h40
    8 éme colonne :2h50

    à la ligne 2
    3 éme colonne :3h..;vous avez compris

    Cdt,

    azsdcv

  7. #7
    Membre Expert
    Femme Profil pro
    Data engineer
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Data engineer
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Bonjour,

    Voilà ce qu'on peut faire. Je ne sais pas où tu veux voir les heures d'arrêt, j'ai donc juste construit une chaîne de caractères avec les informations dedans :

    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
    Public Sub CompteArrets()
     
    Dim lngLigne As Long
    Dim intColonne As Integer
    Dim lngCompte0 As Long
    Dim lngNb10mn As Long
    Dim lngNb1h As Long
    Dim lngNbPlus As Long
    Dim strCell As String
    Dim strJournal As String
    Dim datHeure As Date
     
    For lngLigne = 0 To 774
        For intColonne = 0 To 5
            strCell = Feuil1.Range("A1").Offset(lngLigne, intColonne).Text
            If strCell = "0" Then
                lngCompte0 = lngCompte0 + 1
                If lngCompte0 = 1 Then
                    datHeure = Feuil1.Range("A1").Offset(lngLigne, 7).Text
                    datHeure = TimeSerial(Hour(datHeure), intColonne * 10, 0)
                    strJournal = strJournal & _
                                 "Arrêt le " & Feuil1.Range("A1").Offset(lngLigne, 6).Text & _
                                 " à " & datHeure & vbCrLf
                End If
            ElseIf lngCompte0 <> 0 Then
                If lngCompte0 < 2 Then
                    lngNb10mn = lngNb10mn + 1
                ElseIf lngCompte0 < 6 Then
                    lngNb1h = lngNb1h + 1
                Else
                    lngNbPlus = lngNbPlus + 1
                End If
                lngCompte0 = 0
            End If
            If strCell = "" Then Exit For
        Next intColonne
        If strCell = "" Then Exit For
    Next lngLigne
     
    MsgBox "Nombre d'arrêts inférieurs à 10 mn = " & lngNb10mn & "," & vbCrLf _
         & "Nombre d'arrêts inférieurs à 1 heure = " & lngNb1h & "," & vbCrLf _
         & "Nombre d'arrêts supérieurs à 1 heure = " & lngNbPlus
    MsgBox "Journal : " & vbCrLf & strJournal
     
    End Sub
    J'ai supposé que la date et l'heure étaient saisies en format date. Si ce n'est pas le cas, il faudra changer un peu le code...

  8. #8
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 19
    Par défaut re
    Rebonjour,

    Cela ne fonctionne pas il devrai m'indiquer 4 arrêt sup à 1h au lieu de cela il Indique 26 arrêts sup à 1h et 1 arrêt inf à 10 min

    Cf ci joint
    Fichiers attachés Fichiers attachés

  9. #9
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Adapte cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strCell = Feuil1.Range("A1").Offset(lngLigne, intColonne).Text
    à ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strCell = Feuil1.Range("C1").Offset(lngLigne, intColonne).Text

  10. #10
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 19
    Par défaut
    L'idée est de dire nous avons autant d'heure d'arrêt inf à 10 min, inf à 1,...
    Les arrêt de 10 min se sont passé le ....
    Les arrêt inf à 30 min se sont passé le ....

    D'avance merci

    azsdcv

    En effet cette adaptation cela fonctionne mieux pour l'incrémentation de nombre d'arrêt

    Le journal ne prend pas les bonnes valeurs :
    le 0 à 00:30:00
    le 0 à 00:00:00

    Cdt,

    azsdcv

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

Discussions similaires

  1. [MySQL] Compteur sur liste avec fusion
    Par DevLqncer dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 02/08/2013, 13h37
  2. Liste de listes avec compteur
    Par lilly74 dans le forum Général Python
    Réponses: 3
    Dernier message: 09/03/2010, 09h49
  3. Liste avec ascenceur
    Par Guitch dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 20/10/2004, 15h32
  4. [MFC] creer une liste avec des check????
    Par ginounet dans le forum MFC
    Réponses: 4
    Dernier message: 16/06/2004, 11h47
  5. [PB CONCEPTUEL] avec compteur/trigger
    Par kase74 dans le forum SQL
    Réponses: 6
    Dernier message: 25/03/2004, 11h02

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