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. #1
    Membre éclairé 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
    Par défaut Demande d'aide pour sélection de date
    Bonjour,
    je dois faire un programme qui dois pouvoir sélectionner des lignes selon un intervalle de temps et les copier sur une nouvelle feuille d'un même classeur.
    Et, si possible, ajuster l'intervalle de date aux valeurs les plus proches du fichier par rapport à celles rentrées par l'utilisateur et faire la moyenne de chaque colonne.

    J'ai donc créer une partie sur l'import des données qui fonctionne et ensuite j'ai défini les deux intervalles de dates sur des cellules de la feuille de calcul afin que l'utilisateur puisse remplir lui-même les bornes.
    Une nouvelle page est ensuite créée mais au moment de la recherche de valeur (par comparaison) la macro s'arrête.

    Le problème c'est qu'au niveau de la sélection des données pour voir si les valeurs de la ligne sont dans l'intervalle, le programme me dit:
    erreur '1004'
    erreur définie par l'application ou par l'objet.
    J'ai du mal à voir comment faire.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Il faudrait que tu mettes le code, car sans cela, personne ne pourra t'aider.

    Philippe

  3. #3
    Expert éminent
    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
    Par défaut
    Bonjour, bonjour !

    Ici ce n'est ni un forum de génie ni de voyance : on a donc du mal à voir le code ‼
    Commencer donc par consulter les règles du forum …

  4. #4
    Membre éclairé 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
    Par défaut
    Comme ceci?

    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
    Sub detectionPalier()
     
    Min = Cells(3, 1)
    Max = (4.1)
    Dim tolerance As Date
    Dim Palier As Variant
    ' PARAMETRES
        tolerance = Cells(1, 2) '%
     
    ' PALIERS
        Worksheets("resultats").Activate
     
        For Min = 1 To Max
     
        'Récupérer la valeur temporelle du palier dans la feuille resultat
            Palier = Worksheets("resultats").Cells(3, 1) And Worksheets("resultats").Cells(4, 1)
     
        'Ajout d'une feuille
            Worksheets.Add
            ActiveSheet.Name = Palier 'l'appeler Palier fera que la feuille portera le nom de l'intervalle
            j = 1
            i = 1
     
     
     'Là, on demande au programme de chercher les données dans toute la feuille.
     
            fin = Worksheets("donnees").Range(Min).Range(Max)       'donc sur la feuille "données", la colonne 1 jusqu'à la fin des valeurs
            While i < fin
     
        'On définit ici les bornes du palier
                inter = Worksheets("donnees").Range(Min, Max)
                cellule = Cells(i, 1)
     
                If cellule >= Min Then
                    ' CAS POSITIF
                    If (cellule <= (Max * (1 + tolerance / 100) + 0.02)) And (cellule >= (Min * (1 - tolerance / 100) - 0.02)) Then  'si la cellule est plus petite que... Alors
                        Worksheets(CStr(Palier)).Cells(j, 2) = cellule
                        j = j + 1
                    End If
                Else
                    ' CAS NEGATIF
                    If (cellule >= (Min * (1 + tolerance / 100) - 0.02)) And (cellule <= (Max * (1 - tolerance / 100) + 0.02)) Then
                        Worksheets(CStr(Palier)).Cells(j, 2) = cellule
                        j = j + 1
                    End If
                End If
     
                i = i + 1
     
            Wend

  5. #5
    Membre confirmé
    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
    Par défaut
    Ton erreur se situe sur quelle ligne ?

  6. #6
    Expert éminent
    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
    Par défaut




    Je crois bien que la ligne n°16 est digne de JCVD : totalement aware !
    Devant déclencher une erreur en ligne n°20 lors de la seconde itération …

    Vérifier la valeur prise par la variable afin de savoir si c'est bien celle attendue et dans la négative,
    expliquer enfin ce qu'est censé réaliser la ligne n° 16 !

  7. #7
    Membre éclairé 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
    Par défaut
    Oui, je suis débutante en VBA et on va dire que je ne suis pas très douée. :s
    la ligne 16?
    Je voulais récupérer les deux bornes de mon intervalle avec cette ligne.

  8. #8
    Expert éminent
    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
    Par défaut




    Pour concaténer la valeur de deux chaînes de caractères, il faut utiliser l'opérateur &
    et non pas l'opérateur conditionnel logique And

    Ne pas vérifier le contenu des variables est s'exposer à de telles erreurs !

  9. #9
    Membre éclairé 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
    Par défaut
    Oui, mais ça me provoque toujours le même bug, cette fois pour renommer la page qui porte le nom de la variable Palier.
    (la fonction ActiveSheet.Name = Palier fait s'arrêter le programme.
    De plus, ma manière de chercher les valeurs par comparaison me parait bien barbare et brouillon.
    Je ne vois pas trop comment lui dire de récupérer les lignes dont les dates, contenues dans la première colonne rentrent dans un intervalle.

    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
     'Récupérer la valeur temporelle du palier dans la feuille resultat
            Palier = Worksheets("resultats").Cells(3, 1) & Worksheets("resultats").Cells(4, 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'intervalle
     
            j = 1
            i = 1
     
        'Là, on demande au programme de chercher les données dans toute la feuille.
     
            fin = Worksheets("donnees").Range(Min).Range(Max)                '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 * (1 + tolerance / 100) + 0.02)) And (cellule >= (Min * (1 - tolerance / 100) - 0.02)) Then     'si la cellule est plus petite que... Alors
                        Worksheets(CStr(Palier)).Cells(j, 2) = cellule
                        j = j + 1
                    End If
                Else
                    ' CAS NEGATIF
                    If (cellule >= (Min * (1 + tolerance / 100) - 0.02)) And (cellule <= (Max * (1 - tolerance / 100) + 0.02)) Then     ' si la cellule est plus grande que...Alors
                        Worksheets(CStr(Palier)).Cells(j, 2) = cellule
                        j = j + 1
                    End If
                End If
     
                i = i + 1
     
            Wend

  10. #10
    Expert éminent
    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
    Par défaut




    Oui, je me suis arrêté à cette ligne n°20 … Au passage ce n'est pas un bug mais juste une erreur de conception, de logique, …

    Réfléchir donc au besoin vis à vis de l'architecture de la feuille de calculs
    puis enfin prendre le temps d'exposer clairement la problématique …



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

  11. #11
    Membre éclairé 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
    Par défaut
    Je réfléchis depuis hier.
    Et je crois que le fait de donner deux valeurs à la variable palier est mauvais, nn?

    Edit: effectivement, le seul problème est maintenant à la ligne 27
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fin = Worksheets("donnees").Range(Min).Range(Max)
    cela veut donc dire que la sélection des données à trier doit se faire autrement?

  12. #12
    Membre confirmé
    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
    Par défaut
    Tu as défini Palier comme variant et non comme String, ce qui est probablement la raison pour laquelle ça ne fonctionne pas...

    Pour éviter ça, essaye autant que possible de donner un type bien défini à tes variables qui correspond à ce qu'elles doivent faire. Quitte à mettre "beaucoup" de variable. Donc essaye de définir Palier comme String.
    Avant ta fonction, je te conseille d'écrire Option explicit qui va t'obliger à déclarer tes variables et leur type. (avant la fonction) ça pourra aussi t'éviter des erreurs bêtes, et ça oblige a un minimum de rigueur dans le code. (d'autres te diront semblablement la même chose mais en termes compliqués et plus précis ! )

    Du coup si ta ligne 2 (dans ton [edit]avant-[/edit]dernier post) renvoie une erreur tu peux l'écrire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Palier = Worksheets("resultats").Cells(3, 1).value & Worksheets("resultats").Cells(4, 1).value

    Philippe

  13. #13
    Membre éclairé 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
    Par défaut
    Hum...
    En remettant la seconde condition à la variable Palier, le nom de la feuille ne se fait plus et stoppe la macro.
    Je crois que je vais laisser juste la première borne comme nom et essayer de résoudre cette histoire de comparaison extraction.

    Si je déclare mes variables Max et Min dès le début, c'est:
    Dim Max as Date ?

  14. #14
    Membre confirmé
    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
    Par défaut
    Alors comme j'ai pas tout compris, si c'est une date que tu entres dans Max oui, le format est Date.

    Pour t'aider avec tes déclarations de variables je te conseille de reprendre ce cours très bien fait : http://silkyroad.developpez.com/VBA/LesVariables/. Mets le dans tes favoris : c'est un bon document sur lequel je vais souvent jeter un oeil pour avoir un détail ou une réponse à une question parfois bête mais essentielle.

  15. #15
    Membre éclairé 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
    Par défaut
    Ok, merci Phifou ^^
    J'ai déclaré toutes mes variables
    Par contre, j'ai toujours ce problème de recherche de valeurs.

    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").Range("A").End(xlDown).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

  16. #16
    Membre confirmé
    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
    Par défaut
    Ta ligne 3, tu essayes d'avoir la dernière ligne avec des valeurs ? Si oui, essaye ce code plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fin = Worksheets("donnees").cells(cells.rows.count, 1).End(xlup).Row
    je n'utilise que ça désormais, ça fait un vrai miracle dans mes programmes.

    Sinon ton erreur apparaît à quelle ligne ?

  17. #17
    Membre éclairé 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
    Par défaut
    A la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Fin = Worksheets("donnees").Range("A").End(xlDown).Row
    J'essaye d'obtenir toutes les lignes dont la date qui se trouve dans la colonne A entrent dans l'intervalle de dates choisies par l'utilisateur.

  18. #18
    Membre confirmé
    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
    Par défaut
    Donc reprends mon code au-dessus qui lui fonctionne sur !

  19. #19
    Membre éclairé 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
    Par défaut
    Ok merci.
    Effectivement ton code marche.
    Maintenant c'est plus bas que cela coince.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    '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)
    C'est peut-être ce que j'ai mis entre parenthèses après "Range", mais comment indiquer un intervalle?

  20. #20
    Membre confirmé
    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
    Par défaut
    On va essayer de reprendre tranquillement le problème, parce que j'ai pas tout saisi.

    Tu veux déterminer un intervalle de quoi ?
    Parce que si je ne m'abuse, ton MIN et ton MAX ne sont pas du même type ? Si ?
    Range sert à "déterminer des emplacements", donc je ne suis pas sur de comprendre ce que tu essayes de faire avec ton range(Min, Max) si Max est une date...

    Essaye de rédéfinir rapidement et simplement le but de ton code, pour qu'on essaye de te guider simplement. (Histoire qu'on ne fasse pas que corriger ton code, mais qu'on t'aide à le structurer aussi. )

    Philippe

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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