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 :

Demande d'aide pour sélection de date


Sujet :

Macros et VBA Excel

  1. #21
    Membre averti Avatar de eliniel
    Femme Profil pro
    Ingénieure Essais et validation
    Inscrit en
    Septembre 2014
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieure Essais et validation
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 115
    Points : 429
    Points
    429
    Par défaut
    Alors le programme est censé prendre les dates situées dans un intervalle de dates.
    C'est-à-dire que le programme doit balayer la première colonne qui contient les dates, et copier les lignes correspondant à cet intervalle dans une autre feuille.
    Je crois qu'il n'apprécie pas ma comparaison
    et il me semble que l'on ne peut pas donner comme valeurs deux cellules précises à Range?
    Je crois qu'il n'apprécie pas la façon dont je l'ai écrit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'intervalle = Worksheets("donnees").Range(Min, Max)
    Quoi qu'il en soit, il doit comparer et extraire les lignes appropriées.
    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
        For Min = 1 To Max
        'Là, on demande au programme de chercher les données dans toute la feuille.
            Fin = Worksheets("donnees").Cells(Cells.Rows.Count, 1).End(xlUp).Row         'donc sur la feuille "données", la colonne 1 jusqu'à la fin des valeurs de la colonne
            While i < Fin
     
        'On définit ici les bornes du palier
                'intervalle = Worksheets("donnees").Range(Min, Max)            'intervalle de dates entre min et max
                cellule = Cells(i, 1)                                       ' cellule de la colonne 1 avec la ligne qui change à chaque itération
     
                If cellule >= Min Then
                    ' CAS POSITIF
                    If (cellule <= (Max) And (cellule >= (Min))) Then     'si la cellule est plus petite que... Alors
                        Worksheets(CStr(Palier)).Cells(j, 1) = cellule
                        j = j + 1
                    End If
                Else
                    ' CAS NEGATIF
                    If (cellule >= Min) And (cellule <= (Max)) Then       ' si la cellule est plus grande que...Alors
                        Worksheets(CStr(Palier)).Cells(j, 1) = cellule
                        j = j + 1
                    End If
                End If
     
                i = i + 1
     
            Wend
    Ingénieure essais validation

    J'essaye d'écrire du mieux que je peux.

  2. #22
    Membre régulier
    Homme Profil pro
    Ingénieur Logistique
    Inscrit en
    Octobre 2013
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Logistique
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 104
    Points : 97
    Points
    97
    Par défaut
    Rapidement, avant de prendre l'avion :

    Attention à la manière dont tu écris tes variables et tu les utilises. Si Min et Max sont des dates, tu ne peux pas les utiliser dans un Range, le Range reçoit des "adresses"...
    Quand je te parle du type de ta variable, ce n'est pas le type de la variable qui se trouve dans la cellule.

    Tu peux très bien écrire ton Range ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    worksheets("donnees").range(cells(1, 1), cells (4, 3)).select
    qui te permet de sélectionner une plage par exemple.

    Donc si tu veux que min et max puissent entrer dans ton range, tu ne peux pas les appeler comme des dates.

    Au passage, quelques erreurs dans ton code :
    - manque le next à la fin (erreur de copier-coller ?)
    - Tu peux définir "fin" en dehors de la boucle, c'est toujours la même valeur non ?

    Est-ce que tu peux remettre ton code avec la définition des variables ? Essaye de relire (au moins rapidement) le cours sur les variables de Silkroad donné plus haut, ça t'aidera bien. Arrêtes toi un peu sur les Ranges.

    Bonne journée,


    Philippe

  3. #23
    Membre averti Avatar de eliniel
    Femme Profil pro
    Ingénieure Essais et validation
    Inscrit en
    Septembre 2014
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieure Essais et validation
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 115
    Points : 429
    Points
    429
    Par défaut
    Oui, j'en suis arrivée à la même conclusion sur le range Vendredi.
    J'ai modifié le programme.
    Maintenant, la boucle marche mais lorsque je lance la boucle, seule une cellule est copiée.
    De plus, quel type mettre pour les dates?
    J'ai effectivement une erreur d'incompatiblité depuis ce matin. Surement à cause des types définies par les variables Min et Max.

    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
    Sub detectionPalier()
     
    Dim Palier As String
    Dim Min As Single
    Dim Max As Single
    Dim tolerance As Date
    Dim adr1 As String
    Dim adr2 As String
     
     
    Min = Cells(3, 1)          'valeur minimum de l'intervalle date
    Max = Cells(4, 1)
     
                  ' écart toléré par rapport à la date voulue
     
    ' PARAMETRES
        tolerance = Cells(10, 1) '%
     
        'Recherche Paliers
        Worksheets("resultats").Activate
     
        'Récupérer la valeur temporelle du palier dans la feuille resultat
            Palier = Worksheets("resultats").Cells(3, 1)   ' définition d'un intervalle
     
        'Ajout d'une feuille
            Worksheets.Add
            ActiveSheet.Name = Palier 'l'appeler Palier fera que la feuille portera le nom de l'intervall
            j = 1
            i = 1
            'ActiveSheet.Name = Format(Palier, "mm / ss, 0")      'à tester pour formater le nom
     
            Worksheets("donnees").Activate
            Z = 0
     
        Fin = Worksheets("donnees").Cells(Cells.Rows.Count, 1).End(xlUp).Row    'Là, on demande au programme de chercher les données dans toute la feuille.
     
        'On définit ici les bornes du palier
                intervalle = Worksheets("donnees").Range("A3:A4")            'intervalle de dates entre min et max
        While Z = 0
                cellule = Cells(i, 1)       ' cellule de la colonne 1 avec la ligne qui change à chaque itération
                Cells(i, 1).Activate
                If cellule >= Min Then
                    ' CAS POSITIF
                    ActiveCell.Select
                    Selection.Copy
                    Worksheets(Palier).Paste
                    'adr1 = ActiveCell.Address
                    Worksheets("resultats").Activate
                    Range("B18").Value = "donnees!" & adr1
                    'MsgBox (ActiveCell.Address)         'On copie les valeurs sélectionnées
                Z = 1 'arrêt de la boucle While
     
                Else
     
                    ' CAS NEGATIF
                i = i + 1
                Z = 0 'poursuite de la boucle While
                End If
        Wend
     
    Worksheets("donnees").Activate
    Z = 0
     
        While Z = 0
                cellule = Cells(i, 1)                                       ' cellule de la colonne 1 avec la ligne qui change à chaque itération
                Cells(i, 1).Activate
                If cellule >= Max Then
                    ' CAS POSITIF
                    ActiveCell.Select
                    Selection.Copy
                    Worksheets(Palier).Paste
                    'adr2 = ActiveCell.Address
                    Worksheets("resultats").Activate
                    Range("B19").Value = "donnees!" & adr2
                    'MsgBox (ActiveCell.Address)         'On copie les valeurs sélectionnées
                Z = 1 'arrêt de la boucle While
     
                Else
     
                    ' CAS NEGATIF
                i = i + 1
                Z = 0 'poursuite de la boucle While
                End If
        Wend
     
    End Sub
    Ingénieure essais validation

    J'essaye d'écrire du mieux que je peux.

  4. #24
    Membre régulier
    Homme Profil pro
    Ingénieur Logistique
    Inscrit en
    Octobre 2013
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Logistique
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 104
    Points : 97
    Points
    97
    Par défaut
    Hello,

    je ne suis pas sur encore d'avoir tout suivi, mais je vais essayer de comprendre avec ça déjà.

    Bon, ton code est assez moche (sans offense), il y a des réflexes que tu n'as pas encore biens...

    Si tu peux mettre un fichier excel en PJ de tes mails, ça aidera aussi à saisir.

    Si je comprends bien, en cellule A3 tu as ta date minimale et en cellule A4 ta date maximale.
    Si tu veux avoir l'intervalle entre les deux (j'imagine que tu veux dire le nbr de jours entre les deux dates ?) Mais d'ailleurs à quoi sert ta ligne 38 ?
    tu définis une variable que tu n'utilise pas après... Pourquoi ?

    Mets en Haut de ton code "Option explicit" ça te forceras à définir tes variables. A toi de les déclarer et donne nous les messages d'erreur que tu obtiens lorsque tu as des incompatibilité de type par exemple...

  5. #25
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 761
    Points : 28 619
    Points
    28 619
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour la ligne 38 de ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    intervalle = Worksheets("donnees").Range("A3:A4")
    ' intervalle de dates entre min et max
    En VBA, il existe une fonction DateDiff qui calcule l'intervalle (Année, trimestre, mois, semaine, etc.) dont la syntaxe est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateDiff(Ecart, DateAncienne, DateRecente)
    Et pour info, il y a une formule Excel non documentée DATEDIF dont la syntaxe est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATEDIF(DateAncienne, DateRecente, Ecart)
    où l'argument Ecart peut avoir comme valeur Y, M, D, YM, YD, MD
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #26
    Membre averti Avatar de eliniel
    Femme Profil pro
    Ingénieure Essais et validation
    Inscrit en
    Septembre 2014
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieure Essais et validation
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 115
    Points : 429
    Points
    429
    Par défaut
    Salut,
    Oui, je sais que c'est assez moche.
    Je cherche à donner deux dates, et le programme doit cherche toute les lignes où les dates rentrent dans cet intervalle, et les copier sur une autre feuille.
    La ligne 38, c'est à cause de mon ancienne méthode que j'avais testée mais je n'en ai plus besoin je crois.
    Phifou, tu voudrais le fichier en pièce jointe ou je n'ai pas bien compris?

    Le programme s'éxécute une fois, et copie le nom de la colonne "Horodatage", ce qui n'est déjà pas une date et encore moins la borne inférieure.
    Ensuite, lorsque la boucle est finie, il recrée une feuille vierge. Pourtant, la partie création de feuille n'est pas dans ma boucle While?

    Je crois que si la cellule 1 de la colonne 1 est copiée c'est parce que le programme prend la cellule active.
    Mais il devrait normalement boucler vu que la cellule est : donc à chaque itération, il est censée prendre la suite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Cells(i, 1).Activate
                If cellule >= Max Then
                    ' CAS POSITIF
                    ActiveCell.Select
                    Selection.Copy
                    Worksheets(Palier).Paste
    Ingénieure essais validation

    J'essaye d'écrire du mieux que je peux.

  7. #27
    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 677
    Points
    18 677
    Par défaut





    Je verrais bien un filtre ou mieux, un filtre avancé ou élaboré


    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  8. #28
    Membre averti Avatar de eliniel
    Femme Profil pro
    Ingénieure Essais et validation
    Inscrit en
    Septembre 2014
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieure Essais et validation
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 115
    Points : 429
    Points
    429
    Par défaut
    Salut,
    Merci pour ton article très intéressant, j'ai fait une refonte totale de mon programme hier, ce qui l'a rendu plus simple et plus lisible. (niveau lisibilité c'était pas dur de faire pire)
    Il me manque juste à arriver à calculer une moyenne à partir de numéros de lignes en VBA et je devrais avoir finie. ^^
    Ingénieure essais validation

    J'essaye d'écrire du mieux que je peux.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Demande d'aide pour un exercice
    Par IDE dans le forum C
    Réponses: 3
    Dernier message: 29/10/2005, 15h09
  2. [xsl][xalan]Demande d'aide pour un comptage
    Par HomoErectus dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 19/09/2005, 09h22
  3. Demande d'aide pour query difficile
    Par ericjean514 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/02/2005, 18h52
  4. Demande d'aide pour une requête
    Par arkzor dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/12/2004, 02h40
  5. [TPW][cours]Demande d'aide pour finir un programme
    Par jf dans le forum Turbo Pascal
    Réponses: 21
    Dernier message: 16/06/2003, 18h10

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