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 :

Comparer plusieurs valeurs entre un ensemble de lignes


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Comparer plusieurs valeurs entre un ensemble de lignes
    Bonjour à tous,

    Je fais ici mon premier post suite à une galère assez importante sur un sujet. Habituellement je travaille sur Power BI mais là j'ai un sujet que je suis incapable de traiter sans du code (du moins selon moi).

    Voici la situation, j'ai un fichier qui contient des logs de connexions à différents serveurs par différents utilisateurs. Dans ces logs on récupère l'identifiant de la personne, et sa plage de connexion et le serveur sur lequel il s'est connecté naturellement.

    L'idée est, pour chaque ligne de compter les autres lignes qui rentrent dans cet intervalle de temps d'une part, et qui d'autre part portent sur le même serveur et sur un identifiant différent.



    Peut être qu'un ensemble de conditions avec NB.SI.ENS pourrait fonctionner, mais je n'ai pas été en mesure d'y arriver...

    J'ai tenté en VBA mais mes connaissances remontent à loin et même loin elles sont bien maigres... Voici quand même un aperçu, j'arrivais à remplir la première ligne mais en suivant puisque mes objets avaient pris la valeur de cellules et non plus les cellules en elles-mêmes, ça ne fonctionnait plus :

    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
    Sub timeline()
    Dim C As Object
    Dim d As Object
    Dim P As Object
    Dim G As Object
    Dim J As Object
    Dim L As Object
    Dim K As Object
    Dim T As Object
    Dim basedate As Double
    Dim start As Double
    Dim enddate As Double
    Dim IGGbase As String
    Dim IGGcompare As String
    Dim Serverbase As String
    Dim Servercompare As String
    Dim loops As Integer
    start = Range("B2").Value
    Set d = Range("B2").Cells
    enddate = Range("C2").Value
    Set P = Range("C2").Cells
    basedate = Range("B3").Value
    Set J = Range("B3").Cells
    Serverbase = Range("A2").Value
    Set C = Range("A2").Cells
    Servercompare = Range("A3").Value
    Set G = Range("A3").Cells
    IGGbase = Range("E2").Value
    Set L = Range("E2").Cells
    IGGcompare = Range("E3").Value
    Set K = Range("E3").Cells
    loops = Range("F2").Value
    Set T = Range("F2").Cells
    For Each C In Worksheets("Sheet1").Range("A2:A22").Cells
        While Serverbase = Servercompare And IGGbase <> IGGcompare
            If basedate >= start And basedate <= enddate Then
                loops = loops + 1
                Set C = C.Offset(1, 0)
                Set G = G.Offset(1, 0)
                Set J = J.Offset(1, 0)
                Set P = P.Offset(1, 0)
                Set d = d.Offset(1, 0)
                Set L = L.Offset(1, 0)
                Set K = K.Offset(1, 0)
                Serverbase = C
                Servercompare = G
                basedate = J
                enddate = P
                start = d
                IGGbase = L
                IGGcompare = K
                T = loops
            End If
                If Serverbase <> Servercompare Then
                    Set C = C.Offest(1, 0)
                    Set G = G.Offset(1, 0)
                    Set J = J.Offset(1, 0)
                    Set P = P.Offset(1, 0)
                    Set d = d.Offset(1, 0)
                    Set L = L.Offset(1, 0)
                    Set K = K.Offset(1, 0)
                End If
            Wend
    Next
    End Sub


    Le must serait d'éventuellement supprimer les lignes qui entrent dans un intervalle pour pas en créer sans cesse mais cela viendra plus tard !

    D'avance désolé si mon code vous fait sauter au plafond, et un grand merci à ceux qui tenteront de m'aider, à très vite pour échanger, bonne journée

  2. #2
    Rédacteur/Modérateur

    Salut,

    si je resume, tu veux savoir si tu as eu des moments où plusieurs utilisateurs différents ont été connectés simultanément à un serveur, c'est bien cela ?

    Quelle est la métrique que tu voudrais avoir exactement ? le temps en secondes/minutes/heure ? le nombre d'occurrences ? le nombre maximum d'utilisateurs simultanés ?

    Pour bien trouver une approche, qu'elle soit par fonction/filtre ou par programmation, il faut bien comprendre l'objectif, sinon tu pars bille en tete et tu codes pour "rien", car tu risque de te rendre compte plus tard que tu pars dans le mauvais sens.
    Cycle de vie d'un bon programme :
    1/ ca fonctionne 2/ ca s'optimise 3/ ca se refactorise

    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016 et Access 2019

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Nouveau Candidat au Club
    Citation Envoyé par Jean-Philippe André Voir le message
    Salut,

    si je resume, tu veux savoir si tu as eu des moments où plusieurs utilisateurs différents ont été connectés simultanément à un serveur, c'est bien cela ?

    Quelle est la métrique que tu voudrais avoir exactement ? le temps en secondes/minutes/heure ? le nombre d'occurrences ? le nombre maximum d'utilisateurs simultanés ?

    Pour bien trouver une approche, qu'elle soit par fonction/filtre ou par programmation, il faut bien comprendre l'objectif, sinon tu pars bille en tete et tu codes pour "rien", car tu risque de te rendre compte plus tard que tu pars dans le mauvais sens.
    Bonjour Jean-Philippe,

    Exact, pour chaque ligne j'aimerais combien d'autres lignes rentrent dans l'intervalle de temps de cette première ligne.

    Il me faudrait très exactement le nombre d'utilisateurs simultanés en effet. Et cela avec mon code j'arrive à faire la première ligne.

    J'espère vraiment que je suis clair si je ne le suis pas il ne faut pas hésiter, à bientôt

  4. #4
    Rédacteur/Modérateur

    Il existe bien sur plusieurs facons d'aborder le code, mais suite à ces infos on peut faire une fonction relativement simple en VBA, dans laquelle on passe
    - la plage des serveurs
    - la plage des dates/heure de debut
    - la plage des dates/heure de fin
    -la plage des utilisateurs

    ainsi que
    - le serveur qu'on veut traiter
    - l'utilisateur qu'on veut traiter
    -l'horaire de debut et de fin

    ce qui donnerait une signature de fonction
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    Function Exemple(RngServ as Range, RndDeb as Range, RngFin as Range, RngUser As Range, strServ AS string, strUser as string, dtDeb as date, dtFin as Date) As Integer
    End Function


    à l'intérieur de cette fonction, on effectue une boucle sur chaque ligne, et on compare
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim i As Integer
    For i=1 to RngServ.Rows.Count
    ' serie de comparaison
    if RngServ.Cells(i,1).value = strServ Then
    'etc. jusqu'à arriver à
    compteur = compteur +1
     
    Next i
    Exemple = compteur
    Cycle de vie d'un bon programme :
    1/ ca fonctionne 2/ ca s'optimise 3/ ca se refactorise

    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016 et Access 2019

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Nouveau Candidat au Club
    Merci beaucoup pour cette réponse complète, malheureusement j'ai bien peur de ne pas tout comprendre. Je ne suis pas sûr de savoir appeler une fonction ni de comment vraiment rentrer les arguments, je vais quand même essayer de m'y atteler

    Cela permet à la fin de la ligne de compléter la cellule avec le nombre de connexions simultanées (en F ) ?

  6. #6
    Rédacteur/Modérateur

    Oui, ca serait l'idée

    CA n'est pas nécessairement la solution optimale, mais c'est la plus simple à laquelle j'ai pensé pour arriver à tes fins
    Cycle de vie d'un bon programme :
    1/ ca fonctionne 2/ ca s'optimise 3/ ca se refactorise

    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016 et Access 2019

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  7. #7
    Nouveau Candidat au Club
    Citation Envoyé par Jean-Philippe André Voir le message
    Oui, ca serait l'idée

    CA n'est pas nécessairement la solution optimale, mais c'est la plus simple à laquelle j'ai pensé pour arriver à tes fins
    Est ce que tu crois qu'il te serait possible de m'expliquer un peu plus en détail ? Car je vois un if mais j'ai 3 conditions à respecter :

    • IGG de ligne =/= différent IGG d'après
    • Date début ligne d'après comprise entre date de début et date de fin de ligne de référence
    • Serveur de base identique à serveur d'après


    Il faudrait 3 if non ?

    L'appel de la fonction est toujours un peu obscur mais je m'y replonge, par exemple comment faire pour que range serveur soit appliqué à la colonne A, ou encore le nom du serveur ?

    Je sais que je suis un peu lourd mais j'aimerais vraiment comprendre tout ça car ça m'intéresse même si ce n'est pas mon domaine de prédilection, merci en tous cas

  8. #8
    Rédacteur/Modérateur

    Je t'ai proposé une ossature de code, je n'ai pas tout codé pour toi

    d'oèu mon commentaire :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    'etc. jusqu'à arriver à


    donc èa toi d'aller faire les autres tests ^^
    Cycle de vie d'un bon programme :
    1/ ca fonctionne 2/ ca s'optimise 3/ ca se refactorise

    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016 et Access 2019

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  9. #9
    Nouveau Candidat au Club
    Non vraiment ce n'est pas ce que je recherche je veux comprendre,

    Donc les variables de la fonction sont en fait les en têtes de colonne ?

    Le (i,1) permet de descendre à la première ligne soit sous l'en-tête (car i vaut 1 à la base) ?
    Puis utiliser le offset avec par exemple RngServ.Cells(i,3).value pour comparer les dates au lieu de faire Rngded.cells(i, 3) fonctionnerait par exemple ?

    Concernant les if, je peux faire if then if then if etc ?

    Enfin, Next i permet sauter encore la ligne pour tester l'autre ?

    Que veut dire exemple = compteur ? J'imagine que la fonction reçoit la valeur de compteur mais elle ne se range nulle part. Si je déclare compteur dans la fonction et que j'ai un en-tête qui s'appelle compteur alors ça rentrera dedans ?

    Je réitère, c'est pas vraiment évident pour moi donc désolé pour mes questions

    EDIT : J'anticipe si on me dit que je pourrais tester le code au lieu de poser les questions, c'est juste que je n'ai pas mon ordinateur de travail donc je n'ai pas les données, mais je ne manquerai pas de m'essayer demain !

  10. #10
    Membre expert
    Bonjour
    ce n'est qu'une tentative de réponse
    si tu cherche à compter le nombre entre deux date et sous condition je crois que sans VBA : sommeprod peut aider
    voila un exemple
    --------------------------------------------------------------*****----------------------------------------------------------------------------
    Bonne Continuation & Plein Succès
    Notre seul pouvoir véritable consiste à aider autrui avec modestie
    ______________________________________________________
    Pour dire merci, cliquer sur et quand la discussion est résolue, penser à cliquer sur le bouton

  11. #11
    Nouveau Candidat au Club
    Je te remercie pour cette technique que j'ai pu exploiter en doublant mon tableau de sorte que pour chaque ligne j'ai pu avoir le nombre de sessions concurrentes, je verrai de mon côté si la solution convient. D'entrée de jeu le souci c'est que la requête est très lourde car elle porte sur 200 000 lignes ce qui est assez colossal haha, passé ce détail cela semble fonctionner !

###raw>template_hook.ano_emploi###