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 détection série de cellules [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Par défaut Macro détection série de cellules
    Bonjour,

    Je cherche un code qui me permette de détecter si j'ai plus de 7 cellules non vides consécutives sur une ligne donnée. j'ai bien trouvé comment detecter si une cellule est non vide, mais ça ne convient pas. Il faudrait que je repète le code en incrémentant le range de 1 jusqu'au bout de ma ligne, fastidieux et pas vraiment optimisé...

    Si quelqu'un à une idée je suis preneur

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Application.WorksheetFunction.CountBlank(Rows(1)) > 7 Then

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Par défaut
    Ca pourrait fonctionner mais je n'ai pas donné assez de détails en fait

    mon fichier est un planning, j'ai donc sur une même ligne, des cellules pleines pour les jours travaillés et des cellules vides pour les jours de repos. Sachant que j'ai 3 semaines de planing sur une même ligne j'ai plus de 7 cellules pleines au total.
    Ce que je voudrait détecter c'est lorsque j'ai plus de 7 cellules pleines qui se suivent puisque ça voudrait dire que la semaine de travail est trop longue.

    Merci

    Pas d'autre idée??

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Non, fais une boucle, comme tu l'as suggéré.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Par défaut
    Bonjour à tous,

    J'ai fini par trouver le code qui va bien, donc je vous le donne pour info si ça peut interésser quelqu'un:

    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
    Sub P7J()
    Dim Pers(), HCl(), plgR(), refDate$
    Dim i&, j&, k&, p&, d&, VF1 As Boolean, VF2 As Boolean
    Dim c&, ep$
    Dim d1 As Date, d2 As Date
        With Worksheets("Paramètres")
    'Lecture des paramètres.
           On Error GoTo E1
    'Liste du personnel. Elle peut comporter des lignes vides, mais pas de doublon.
           Pers = .[A1].Resize(.Cells(.Rows.Count, 1).End(xlUp).Row).Value
            On Error GoTo E2
    'Liste des mentions ne donnant pas lieu à décompte. Elle peut être vide.
           HCl = .[B1].Resize(.Cells(.Rows.Count, 2).End(xlUp).Row).Value
            On Error GoTo 0
    'Intitulé de la ligne portant les dates. Valeur unique.
           refDate = .[C2].Value
        End With
        With Worksheets("Cycle Planning")
    'Lecture des données à traiter.
           On Error GoTo E1
    'La plage de données à traiter commençant en A1 doit avoir un nombre constant de colonnes.
    'Le nombre de lignes est indifférent. Chaque bloc de données peut même avoir un nombre
    'différent de lignes. L'ordre des noms des employés peut être différent dans chaque bloc.
           plgR = .[A1].Resize(.Cells(.Rows.Count, 1).End(xlUp).Row, .Cells(2, .Columns.Count).End(xlToLeft).Column).Value
            On Error GoTo 0
        End With
    'Traitement des données.
    'On traite chaque employé tour à tour.
       For p = 2 To UBound(Pers, 1)
            If Not IsEmpty(Pers(p, 1)) Then
                ep = Pers(p, 1)
    'Pour un employé donné, on parcourt la plage de données ligne par ligne...
               For d = 1 To UBound(plgR, 1)
    '...jusqu'à y trouver une ligne de dates.
                   If plgR(d, 1) = refDate Then
    'Une ligne de dates étant trouvée on parcourt les lignes suivantes...
                       For i = d + 1 To UBound(plgR, 1)
    '...jusqu'à y trouver le nom de l'employé recherché.
                           If plgR(i, 1) = ep Then
    'Si le nom de l'employé est trouvé, on parcourt la ligne de données.
                               For j = 2 To UBound(plgR, 2)
    'Pour chacune des cellules de cette ligne, on regarde son contenu en utilisant le booléen VF1.
    'Si la cellule est vide ou contient une mention ne donnant pas lieu à décompte, on pose VF1=Vrai.
                                   VF1 = IsEmpty(plgR(i, j))
                                    For k = 2 To UBound(HCl, 1)
                                        VF1 = VF1 Or plgR(i, j) = HCl(k, 1)
                                    Next
                                    If VF1 Then
    'Dans le cas où VF1 est Vrai et où le compteur c d'occurrences successives de "VF1=Faux" excède 6,
    'on affiche un message d'alerte.
                                       If c > 6 Then MsgBox ep & " :" & vbLf & "du " & d1 & " au " & d2
    'Réinitialisation du booléen VF2 à Faux et du compteur c à zéro.
                                       VF2 = False
                                        c = 0
                                    Else
    'Dans le cas où VF1 est Faux, on note la date d2 correspondante, et on incrémente le compteur c
    'd'occurrences successives de "VF1=Faux".
                                       d2 = plgR(d, j)
                                        c = c + 1
                                        If Not VF2 Then
    'Si le booléen VF2 a la valeur Faux, on lui attribue la valeur Vrai et on note la date
    'd1 correspondante. (d1 est donc la date de début d'une séquence de cellules telle que
    'VF1 garde la valeur Faux.)
                                           VF2 = True
                                            d1 = plgR(d, j)
                                        End If
                                    End If
    'Passage à la cellule à droite.
                               Next
                            ElseIf plgR(i, 1) = refDate Or IsEmpty(plgR(i, 1)) Then
                                Exit For '...pour passer au bloc de données suivant.
                           End If
                        Next
                    End If
    'Passage au bloc de données suivant.
               Next
    'Tous les blocs de données ayant été explorés, on affiche un dernier message d'alerte si besoin est...
               If c > 6 Then MsgBox ep & " :" & vbLf & "du " & d1 & " au " & d2
    '...puis on réinitialise le booléen VF2 à la valeur Faux et le compteur c à zéro...
               VF2 = False
                c = 0
            End If
    '...et on passe à l'employé suivant.
       Next
    Exit Sub 'Ouf !
    'Gestionnaire d'erreurs de lecture des paramètres :
    E1:
        MsgBox "Aucun contrôle à faire." 'Parce que la liste du personnel est vide et/ou il
    'n'y a pas de données à traiter.
       End
    E2:
        ReDim HCl(1 To 1, 1 To 1) '... dans le cas où la iste des mentions ne donnant pas lieu
    'à décompte est vide.
       Resume Next
    End Sub

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

Discussions similaires

  1. Macro pour coller série de cellules dans liste
    Par Phyvon61 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/01/2009, 19h26
  2. macro - détection horizontale cellule vide
    Par cati_78 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/11/2008, 22h18
  3. Réponses: 3
    Dernier message: 06/12/2006, 10h01
  4. macro simple de copie cellule
    Par icecream33 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/07/2006, 12h06
  5. Macro Excel: enreg d1 cellule en conservant le mise en forme
    Par repié dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 02/12/2005, 15h48

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