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 dates et heures dans un tableau


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2016
    Messages : 29
    Par défaut Tri dates et heures dans un tableau
    Bonjour,

    En vue de réaliser un graphique à partir d'un tableau, j'ai besoin de supprimer des lignes de mon tableau à partir du remplissage d'un formulaire. Je m'explique :

    En colonne A de ma feuille Excel, j'ai des dates de la forme JJ/MM/AAAA.
    En B, j'ai des heures:minutes:secondes

    Vous trouverez en fichier joint le type de tableau décrit (j'ai gardé dans ce fichier uniquement les colonnes A et B qui nous sont utiles, les autres étant confidentielles).

    Dans mon Userform, l'utilisateur sélectionnes une date de début et une date de fin (avec les heures et minutes). J'aimerais que ma macro supprime lors du clic sur le bouton "valider" de mon Userform les lignes de mon tableau dont la date ou l'heure ne se situe pas dans la plage sélectionnée dans le formulaire.

    De plus, les secondes ne sont pas à prendre en compte mais les cellules de la colonnes B les affichent, je ne sais pas comment en faire abstraction dans le code.

    Quelqu'un aurait-il une solution ? J'ai pensé à une boucle For qui varie de 2 au nombre total de ligne pour ne garder que le jour voulu et une recherche "Find" des heures/minutes pour ne garder que la plage souhaitée. Je pense que cette méthode rend l'exécution du programme trop lente.

    Merci d'avance pour votre aide, vous comprendrez certainement mieux en jetant un œil au fichier joint.

    Greg
    Fichiers attachés Fichiers attachés

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Greg57365 Voir le message
    Quelqu'un aurait-il une solution ? J
    Bonjour,

    Vous pourriez faire votre graphique directement depuis un filtre avancé.

    Pièce jointe 232895


    Le bouton de l'onglet Résultat filtre lance la macro suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Sub FiltrerLesDonnees()
     
          Range("'Données'!Data").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
            "'Résultat filtre'!Criteria"), CopyToRange:=Range("'Résultat filtre'!Extract"), Unique:=False
     
    End Sub
    Pièce jointe 232899

    Regardez le tuto de Philippe TULLIEZ advancedfilter
    Dernière modification par Invité ; 08/01/2017 à 17h35.

  3. #3
    Membre expérimenté Avatar de EBRAG
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Avril 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 125
    Par défaut
    Bonsoir,

    Outre la solution du filtre proposée par Eric, voici un code qui répond à la demande (à l'exception prêt que j'ai masqué les ligne... je ne les ai pas supprimées (adapter le code en conséquence...
    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
    Private Sub CommandButton1_Click()
      Dim i As Long
      Dim lMin As Long
      Dim lMax As Long
      Application.ScreenUpdating = False
    'On assure le coup au cas où !... trier les dates et Heures
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range( _
            "A2:A14834"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range( _
            "B2:B14834"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        With ActiveWorkbook.Worksheets("Feuil1").Sort
            .SetRange Range("A1:B14834")
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    '============================================
      Range("A1").EntireRow.Hidden = False
      For i = Range("A1048576").End(xlUp).Row To 1 Step -1
        Application.StatusBar = "Analyse ligne " & i
        If i > 1 Then
          If Cells(i, 1) + VBA.Hour(Cells(i, 2)) / 24 + VBA.Minute(Cells(i, 2)) / (24 * 60) > _
            VBA.DateSerial(VBA.Year(Range("A2")), VBA.Month(Range("A2")), CLng(Me.ComboBox4.Text)) + _
            VBA.CLng(Me.ComboBox5) / 24 + VBA.CLng(Me.ComboBox6) / (24 * 60) Then
     
            lMax = i - 1
          End If
          If Cells(i, 1) + VBA.Hour(Cells(i, 2)) / 24 + VBA.Minute(Cells(i, 2)) / (24 * 60) < _
          VBA.DateSerial(VBA.Year(Range("A2")), VBA.Month(Range("A2")), CLng(Me.ComboBox1.Text)) + _
          VBA.CLng(Me.ComboBox2) / 24 + VBA.CLng(Me.ComboBox3) / (24 * 60) Then
     
            lMin = i
            Exit For
          End If
        End If
      Next
      MsgBox "Min " & lMin & " - Max " & lMax
      If lMin > 2 Then
        Range("A2:A" & lMin - 1).EntireRow.Hidden = True
      End If
      Range("A" & lMax + 1 & ":A" & Range("A1").CurrentRegion.Rows.Count).EntireRow.Hidden = True
    Application.StatusBar = False
     
    End Sub

  4. #4
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2016
    Messages : 29
    Par défaut
    Bonsoir,

    En utilisant le fichier de ERBAG, c'est exactement ce qu'il me faut, mise à part le fait de rendre les lignes invisibles au lieu de les supprimer. Un grand merci à toi !!

    Par contre, lorsque je modifie le code "Entirerow.hidden = True" en "EntireRow.Delete", certaines lignes non souhaitées ne se suppriment pas, je ne comprends pas pourquoi puisque les calculs du programme n'ont pas été modifiés...

    Y-a-t-il quelque chose que je n'ai pas saisi avec la propriété "Delete" ??

    Merci,

    Greg

Discussions similaires

  1. Problème de formatage des dates et heure dans une mshflexgrid
    Par Virtualité dans le forum VB 6 et antérieur
    Réponses: 20
    Dernier message: 27/11/2007, 14h07
  2. Date et heure dans une macro
    Par Anaelody dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/07/2007, 18h06
  3. Date et heure dans un enregistrement
    Par guiguikawa dans le forum Access
    Réponses: 4
    Dernier message: 27/06/2006, 10h26
  4. [SQL] date en français dans un tableau
    Par chouchouboy dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 25/06/2006, 22h56
  5. Réponses: 7
    Dernier message: 16/09/2005, 10h14

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