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 :

Boucles sur tableau à deux dimensions


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    université
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : université

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Boucles sur tableau à deux dimensions
    Bonjour, bonjour à tous,

    J'aurais besoin d'un petit coup de pouce de votre part car je tourne en rond et je ne vois pas le bout de mon problème.

    J'aimerais effectuer deux boucles sur un tableau à deux dimensions ci-dessous :

    Nom_PC      Date
    PC1          01/02/2014
    PC1          02/02/2014
    PC1          03/02/2014
    PC1          04/02/2014
    PC1          05/02/2014
    PC1          06/02/2014
    PC2          01/02/2014
    PC2          02/02/2014
    PC2          03/02/2014
    PC2          05/02/2014
    PC2          07/02/2014
    PC2          09/02/2014
    PC3          01/02/2014
    PC3          02/02/2014
    PC3          02/02/2014
    Le problème c'est que j'aimerais effectuer une première boucle sur la liste des PC et ensuite une boucle sur les dates.
    En gros ma macro doit pouvoir effectuer ceci -> Prend première ligne PC1 -> Boucle sur toutes les dates du PC1 -> Prend première ligne PC2 -> Boucle sur toutes les dates du PC2 etc.

    Sur internet j'ai trouvé plusieurs exemples et j'ai essayé de m'en inspirer mais chaque fois je m'en mêle les pinceaux parce que les exemples que j'ai trouvé c'est des doubles boucles (première sur lignes et seconde sur colonnes et j'ai besoin de faire l'inverse).

    Je sais que ça paraitra tout bête peut être pour certains d'entre vous ou pour tous mais je suis tellement axé sur ce problème que j'aurais besoins d'avis extérieure sur mon problème.

  2. #2
    Expert éminent sénior
    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
    Points : 18 674
    Points
    18 674
    Par défaut

    Bonjour, bonjour,

    mais où est donc le code ?‼

    Et puis une présentation claire & exhaustive est nécessaire car boucler dans le vide ne sert à rien !

    Selon le besoin, il n'y aurait peut-être même pas besoin de boucle, un filtre suffirait …

  3. #3
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 141
    Points : 9 979
    Points
    9 979
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    comme indiqué par Marc-L, sans finalité sur le but de ta boucle/format de récupération des résultats, les réponses ne seront pas pertinentes.

    une piste (optimisable) pour la méthode VBA :

    - boucle sur la liste des PC au moyen d'une liste vide qui s'alimente à chaque nouveau nom
    - dans cette boucle, on imbrique une seconde boucle qui liste (pour chaque nouveau PC de la liste) les dates

    Dans l'attente de précisions ...

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,



    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 essai()
      derlig = [A65000].End(xlUp).Row
      i = 2
      npc = 0
      Do While i <= derlig
        tmp = Cells(i, 1)
        ndate = 0
        Do While Cells(i, 1) = tmp And i <= derlig
          ndate = ndate + 1
          i = i + 1
        Loop
        npc = npc + 1
        Cells(npc + 1, "d") = tmp
        Cells(npc + 1, "e") = ndate
      Loop
    End Sub
    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 essai2()
      derlig = [A65000].End(xlUp).Row
      i = 2
      npc = 0
      Do While i <= derlig
        tmp = Cells(i, 1)
        ndate = 0
        npc = npc + 1
        Cells(npc + 1, "h") = tmp
        Do While Cells(i, 1) = tmp And i <= derlig
          ndate = ndate + 1
          Cells(npc + 1, 8 + ndate) = Cells(i, 2)
          i = i + 1
        Loop
      Loop
    End Sub
    Jacques Boisgontier
    Fichiers attachés Fichiers attachés

  5. #5
    Futur Membre du Club
    Homme Profil pro
    université
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : université

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Désolé pour ma réponse tardive,

    Merci pour vos réponses, je vous apporte plus de précision alors

    Je vous met le code

    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
     
    'Déclaration
        Dim i, j, m, a, b As Integer
        Dim derniere_ligne As Integer
        Dim tab_exemple() As Variant
        Dim date1, date2, date3 As Date
        Dim Interval As Integer
     
        date1 = Range("E2")
        date3 = Range("E2")
        date2 = Range("F2")
     
        derniere_ligne = Range("A1").End(xlDown).Row
     
        ReDim tab_exemple(derniere_ligne - 2, 1) 
     
    'Enregistrement des valeurs dans le tableau
    For i = 0 To UBound(tab_exemple)
        tab_exemple(i, 0) = Range("A" & i + 2)
        tab_exemple(i, 1) = Range("B" & i + 2)
    Next
     
    'MsgBox tab_exemple(1, 0)
     
    'a = 1
    b = 2
    k = 5
    m = 4
     
    For i = 0 To UBound(tab_exemple, 1) 'boucle sur la 1ere dimension. Commençant à la première ligne
            For j = 1 To UBound(tab_exemple, 2) 'boucle sur la 2eme dimension donc les colonnes, en commençant à 0 la boucle va bouclé sur la première colonne puis sur la deuxième colonne
               'If tab_exemple(0, 1) <> date1 Then
                    'date1 = DateSerial(2014, 2, 2 - 1)
     
               If tab_exemple(i, 1) = date1 Then
                Sheets("Sheet1").Cells(b, m) = "Ok"
                date1 = DateAdd("d", 1, date1)
                b = b + 1
     
                ElseIf Not tab_exemple(i, 1) = date1 And tab_exemple(i, 1) = date3 Then
                date1 = date3
                'date1 = DateAdd("d", 1, date1)
                Sheets("Sheet1").Cells(b, m) = tab_exemple(i, 0)
                date1 = DateAdd("d", 1, date1)
                'Interval = DateDiff("d", tab_exemple(i, 0), date2)
                'For a =
                b = b + 1
     
                ElseIf tab_exemple(i, 1) <> date1 Then
                m = m + 1
                Sheets("Sheet1").Cells(b, m) = date1
                date1 = DateAdd("d", 1, date1)
                'b = b + 1
                m = m - 1
                i = i - 1
                End If
            Next j
    Next i
    Le but :
    C'est de pouvoir écrire les dates quand mes PCs ont été inactifs. Au début du topic je vous ai donné une petite liste comme exemple.
    Donc nous avons une colonne des PCs et une colonne des dates qui montrent quand les PCs ont été actifs.

    Maintenant dans ce lot de dates, il y a des jours où les PCs n'ont pas tourné (elles ne sont pas présente dans la liste ci-dessus donc) c'est justement ces dates là que j'aimerais récupérer.

    Mon code ci-dessus arrive à vérifier chaque date de la colonne des dates et à écrire la date lorsque cette date se trouve entre 2 jours actifs (ex : 05/02/2014 - 07/02/2014, le code me sors la date 06/02/2014) mais par contre je n'arrive pas à faire sortir plusieurs dates à la suite quand par exemple il y a une inactivité de plusieurs jours à suivre d'un même PC, par exemple : 05/02/2014 à 10/02/2014, je n'arrive pas à sortir comme dates le 06, le 07, le 08, le 09. Cela me sort uniquement le 09/02/2014 donc la dernière date.

    J'utilise aussi également la première colonne des PCs pour à un moment précis mettre la valeur de tab_exemple(i,0) ex : PC1 la cellule avant les dates que je sortirai pour ce PC. Donc au final pour avoir un meilleur aperçu ça donne ceci :

    Activité PC1 :
    04/02/2014
    05/02/2014
    10/02/2014

    Et ce que j'aimerais que ça me ressorte toute à la fin c'est ça

    PC1 06/02/2014 07/02/2014 08/02/2014 09/02/2014

    Le PC1 et une seule date j'arrive à faire ressortir de mon tableau mais pas plusieurs dates à suivre comme je vous ai expliqué ci-dessus .

  6. #6
    Expert éminent sénior
    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
    Points : 18 674
    Points
    18 674
    Par défaut

    La première colonne est-elle forcément triée ?

    Sinon mettre en pièce jointe un classeur (.xls ou .xlsx) avec une feuille source et une feuille résultat …

  7. #7
    Futur Membre du Club
    Homme Profil pro
    université
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : université

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Voilà,

    Je vous fournis le code :

    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
     
    Option Explicit
     
    Sub test()
    'Déclaration
        Dim i, j, k, m, a, b, L As Integer
        Dim derniere_ligne As Integer
        Dim tab_exemple() As Variant
        Dim date1, date2, date3 As Date
        Dim Interval As Integer
     
        date1 = Range("E2")
        date3 = Range("E2")
        date2 = Range("F2")
     
        derniere_ligne = Range("A1").End(xlDown).Row
     
        ReDim tab_exemple(derniere_ligne - 2, 1) 'Tableau de 11 x 3 "cases"
     
    'Enregistrement des valeurs dans le tableau
    For i = 0 To UBound(tab_exemple)
        tab_exemple(i, 0) = Range("A" & i + 2)
        tab_exemple(i, 1) = Range("B" & i + 2)
    Next
     
    'MsgBox tab_exemple(1, 0)
     
    'a = 1
    b = 2
    k = 5
    m = 3
     
     
    For i = 0 To UBound(tab_exemple, 1) 'boucle sur la 1ere dimension. Commençant à la première ligne
            For j = 1 To UBound(tab_exemple, 2) 'boucle sur la 2eme dimension donc les colonnes, en commençant à 0 la boucle va bouclé sur la première colonne puis sur la deuxième colonne
               'If tab_exemple(0, 1) <> date1 Then
                    'date1 = DateSerial(2014, 2, 2 - 1)
     
               If tab_exemple(i, 1) = date1 Then
                Sheets("Sheet1").Cells(b, m) = "Ok"
                date1 = DateAdd("d", 1, date1)
                b = b + 1
     
                ElseIf Not tab_exemple(i, 1) = date1 And tab_exemple(i, 1) = date3 Then
                date1 = date3
                'date1 = DateAdd("d", 1, date1)
                Sheets("Sheet1").Cells(b, m) = tab_exemple(i, 0)
                date1 = DateAdd("d", 1, date1)
                'Interval = DateDiff("d", tab_exemple(i, 0), date2)
                'For a =
                b = b + 1
     
                ElseIf tab_exemple(i, 1) <> date1 Then
                m = m + 1
                Sheets("Sheet1").Cells(b, m) = date1
                date1 = DateAdd("d", 1, date1)
                'b = b + 1
                m = m - 1
                i = i - 1
                End If
            Next j
    Next i
     
    End Sub
    Et le fichier excel est en pièce jointe

    La feuille -> Sheet1 c'est la feuille résultat

    Et pour te répondre Marc-L oui la colonne des PCs serait utile pour pouvoir mettre le nom du PC (ex : PC1) avant les dates où il y a eu inactivité(s)

    Exemple :

    PC1 06/02/2014 07/02/2014 10/02/2014 15/02/2014

    Merci d'avance pour votre aide
    Fichiers attachés Fichiers attachés

  8. #8
    Expert éminent sénior
    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
    Points : 18 674
    Points
    18 674
    Par défaut

    T'es sûr de toi là ? Car c'est limite sans rapport avec la présentation initiale et les précisions du post #5 !

    Tel quel, il n'y a même pas besoin de code, le B-A-BA de l'utilisation d'une feuille de calculs d'Excel suffit largement ‼

    Sinon effectuer enfin une présentation claire et exhaustive !


    __________________________________________________________________________________________
    If you can’t explain it simply, you don’t understand it well enough … (Albert Einstein)

  9. #9
    Futur Membre du Club
    Homme Profil pro
    université
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : université

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Oui je suis sur de moi.

    C'est clair que la démarche du début a été remanier après une longue réflexion.

    Après réflexion je me suis dit qu'il fallait plutôt une double boucle axé sur la colonne des dates tout en lisant ligne par ligne (d'où le fait que j'ai commencé ma 2ème boucle (celle des colonnes) avec j = 1 et non j = 0.

    Mon but de départ est toujours le même c'est de pouvoir analyser chaque dates une à une en fonction d'un PC (je n'avais pas approfondi la description de ma tâche au départ, désolé) mais là au lieu de me baser sur la colonne des PCs je me base sur la colonne des dates pour savoir quand un PC a changé de nom (ex : 06/02/2014 07/02/2014 -> 01/02/2014 (là changement de PC))

    Mon explication n'est pas claire ? Je ne vois pas où c'est pas clair quand je dis que au final le résultat qu'il faut c'est les dates où les PCs ont été inactifs (donc celles qui ne sont pas affichés dans la colonne des dates). Si tu me dis que c'est possible de faire ça avec Excel sans code, je veux bien savoir comment...

    Et je ne comprends pas pourquoi tu dis que ça à rien à voir avec ce que j'ai mis au poste 5 de cette discussion. Je répète ce que j'ai dit à ce moment là par contre oui si tu me parles du poste 1 de la discussion là oui d'accord.

  10. #10
    Expert éminent sénior
    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
    Points : 18 674
    Points
    18 674
    Par défaut

    Tel le fichier en pièce jointe :

    ◘ Formule de la cellule C2 : =SI(A2<>A1;A2;"Ok") à recopier vers le bas.

    ◘ Formule de la cellule D3 (format Date) : =SI(B3-B2>1;B3-1;"") à recopier vers le bas.

    Niveau grand débutant, B-A-BA d'utilisation d'Excel …

    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …


    __________________________________________________________________________________________
    Il n'y a pas que les aigles qui atteignent les sommets, les escargots aussi mais ils en bavent !


  11. #11
    Futur Membre du Club
    Homme Profil pro
    université
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : université

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    écoute de 1 si je n'utilise pas de formule Excel c'est qu'il y a une raison, ce poste ne concerne qu'une partie de ce que je dois faire et le tout doit être automatisé en VBA. Sinon oui je me serais basé sur des formules Excel et je ne serais pas venu poser cette question sur ce forum. Tu vas me dire peut être que je peux paramétrer mes cellules en fonctions du résultat de ma partie précédente sauf que je n'ai pas envie de faire cela pour diverses raisons.

    De 2, oui c'est bien jolie de me dire ça mais ça ne réponds quand même pas à ma question de comment faire quand il y a plusieurs dates inactifs qui se suivent... et ce en VBA donc.

    Et de 3 sur ce forum il y a des personnes qui sont moins fortes que toi, merci d'avoir de l'indulgence pour ces personnes. Le but d'un forum c'est de pouvoir poser des questions, d'être aidé, d'apprendre des conseils des autres et c'est pas le but de se faire dénigrer et traiter de nul.

  12. #12
    Expert éminent sénior
    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
    Points : 18 674
    Points
    18 674
    Par défaut
    Citation Envoyé par Slavo Voir le message
    Si tu me dis que c'est possible de faire ça avec Excel sans code, je veux bien savoir comment...
    J'y ai donc répondu vis à vis du fichier en pièce jointe car, tel quel, il ne nécessite pas de VBA !

    Si un fichier avec le résultat est demandé, deuxième chance accordée après une présentation bancale,
    et que tu n'es pas capable ou, pire, que tu ne fasses pas l'effort d'en fournir un complet
    correspondant exactement au besoin, ce n'est certainement pas de ma faute ‼

    La moindre des choses est de présenter clairement & exhaustivement son besoin dès sa demande initiale !

    La formule contenant la réponse à ta problématique est facilement adaptable en VBA …

    Sur ce, bonne fin de journée et bon dimanche !

    __________________________________________________________________________________________
    Deux choses sont infinies : l’Univers et la bêtise humaine.
    Mais en ce qui concerne l’Univers, je n’en ai pas encore acquis la certitude absolue. (Albert Einstein)


Discussions similaires

  1. sizeof() sur un tableau à deux dimensions
    Par Marc22 dans le forum Langage
    Réponses: 2
    Dernier message: 13/12/2010, 21h02
  2. Réponses: 1
    Dernier message: 18/11/2005, 12h38
  3. tri alphabétique dans un tableau deux dimensions
    Par *!!cocco!!* dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 06/12/2004, 22h38
  4. Passage d'un tableau à deux dimensions
    Par karl3i dans le forum C
    Réponses: 3
    Dernier message: 20/10/2003, 15h50

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