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 :

Problème avec recherche de valeurs et condition


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 40
    Points : 23
    Points
    23
    Par défaut Problème avec recherche de valeurs et condition
    Bonjour à tous,

    J'ai optimisé une macro qui avait déjà été programmé par quelqu'un d'autres. Je vous explique son fonctionnement.

    J'utilise un classeur source et un classeur destination.
    Dans le classeur source je vais rechercher des valeurs qui sont à intervalle régulier.

    J'utilise donc ce code ci qui fonctionne très bien. :
    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
    Sub CopyConfocalite(classeurEntree As Workbook, laser As String, destinationColumn As String)
     
        Dim rowNumber As Range
        Dim source As Worksheet, destination As Worksheet
     
        Set source = classeurEntree.Worksheets("Confocalite")
        Set destination = classeurSortie.Worksheets("confocalite")
     
        ' Numero de ligne du lambda correspondant
        Set rowNumber = source.Range("B:B").Cells.Find(What:=laser)
     
        If (source.Range("E" & rowNumber.Row + 5).Value) = "" Then
            idest = 0
        Else
            idest = source.Range("E" & rowNumber.Row + 5).Value
        End If
        destination.Range(destinationColumn & destination.Range(destinationColumn & source.Rows.Count).End(xlUp).Row + 1) = idest
     
        ' Import date
        destination.Range("D" & destination.Range(destinationColumn & source.Rows.Count).End(xlUp).Row) = Now
        ' Source file
        destination.Range("E" & destination.Range(destinationColumn & source.Rows.Count).End(xlUp).Row) = classeurEntree.Path & "\" & classeurEntree.Name
    Or dans une certaine feuille, j'ai besoin de récupérer des données qui ne sont pas a intervalle régulier.

    J'ai donc écris ce code qui ne marche pas :
    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
    Sub CopyPuissanceéchantillons(classeurEntree As Workbook, laser As String, destinationColumn As String)
        Dim rowNumber As Range
        Dim source As Worksheet, destination As Worksheet
     
        Set source = classeurEntree.Worksheets("data_objectifs")
        Set destination = classeurSortie.Worksheets("Puissance échantillon")  
        Set rowNumber = source.Range("I:I").Cells.Find(What:=laser)
     
        If (source.Range("I" & rowNumber.Row + 12).Value) = "" Then
            idest = 0
        Else
            idest = source.Range("I" & rowNumber.Row + 12).Value
        End If
     
            If (source.Range("I" & rowNumber.Row + 17).Value) = "" Then
                idest = 0
            Else
                idest = source.Range("I" & rowNumber.Row + 17).Value
            End If
     
                If (source.Range("I" & rowNumber.Row + 22).Value) = "" Then
                    idest = 0
                Else
                    idest = source.Range("I" & rowNumber.Row + 22).Value
                End If
    destination.Range(destinationColumn & destination.Range(destinationColumn & source.Rows.Count).End(xlUp).Row + 1) = idest
     
        ' Import date
        destination.Range("D" & destination.Range(destinationColumn & source.Rows.Count).End(xlUp).Row) = Now
        ' Source file
        destination.Range("E" & destination.Range(destinationColumn & source.Rows.Count).End(xlUp).Row) = classeurEntree.Path & "\" & classeurEntree.Name
    End Sub
    Or le code ne fonctionne pas, il ne va pas me chercher les bonnes valeurs. Faut-il faire une boucle ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Contrôleur de gestion en activité
    Inscrit en
    Juillet 2012
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Contrôleur de gestion en activité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 545
    Points : 939
    Points
    939
    Par défaut
    Bonjour,

    j'ai juste regardé les deux codes, mais la principale différence se trouve sur le nombre de fois que tu définies ta variable idest.

    je ne comprends pas bien le role de ta variable, mais les deux premières fois où idest est calculée sont effacées par la troisième.

    tu dois faire trois variables idest 1, idest2 et idest3 et en faire la somme, la max ou je sais pas quoi encore.

    Michel

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Merci de ta réponse Supermichou. Je te met les classeurs, peut être que ca t'aidera car c'est vrai que c'est un peu abstrait expliqué comme ca.

    idest, sert a simplement a remplir des champs vide par 0. Car quand il y'a une nouvelle importation, il copie les valeurs dans les champs qui doivent être vide. D'ou l'utilité de mettre un 0, ainsi la case n'est pas vide et la nouvelle importation sera dans la cellule suivante.

    Le but c'est d'importer 3 valeurs des classeurs ouvert vers le classeur N°1

    dans le fichier zip tu auras 2 classeurs que tu mettras dans un dossier de ton choix et que tu iras chercher avec le classeur "sortie avec P"

    je te remercie d'avance pour ton aide.
    Fichiers attachés Fichiers attachés

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,

    Il y a un défaut de logique. Essaie :

    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
    Sub CopyPuissanceéchantillons(classeurEntree As Workbook, laser As String, destinationColumn As String)
        Dim rowNumber As Range
        Dim source As Worksheet, destination As Worksheet
     
        Set source = classeurEntree.Worksheets("data_objectifs")
        Set destination = classeurSortie.Worksheets("Puissance échantillon")
        Set rowNumber = source.Range("I:I").Cells.Find(What:=laser)
     
        If (source.Range("I" & rowNumber.Row + 12).Value) <> "" Then
            idest = source.Range("I" & rowNumber.Row + 12).Value
        ElseIf (source.Range("I" & rowNumber.Row + 17).Value) = "" Then
            idest = source.Range("I" & rowNumber.Row + 17).Value
        ElseIf (source.Range("I" & rowNumber.Row + 22).Value) = "" Then
            idest = source.Range("I" & rowNumber.Row + 22).Value
        Else
            idest = 0
        End If
    destination.Range(destinationColumn & destination.Range(destinationColumn & source.Rows.Count).End(xlUp).Row + 1) = idest
     
        ' Import date
        destination.Range("D" & destination.Range(destinationColumn & source.Rows.Count).End(xlUp).Row) = Now
        ' Source file
        destination.Range("E" & destination.Range(destinationColumn & source.Rows.Count).End(xlUp).Row) = classeurEntree.Path & "\" & classeurEntree.Name
    End Sub

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Merci Daniel.C

    J'ai essayé ton code, mais il me copie toujours la valeur 47.5, alors qu'il me faudrait les 3 "power at sample" de chaque classeur.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    C'est bien les cellules I17 ou I23 ou I29 que tu veux récupérer dans le classeur "2012-04-18_New Quality Control (XploRA)(ver120222) (11).xls" ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    C'est bien ça Daniel. Il faut savoir que des fois le programme va ouvrir plusieurs dizaine de classeurs. Ce n'est pas QUE dans le classeur que tu as cité.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Suivant qu'on recherche "Laser1", Laser2" ou "Laser3" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        idest = 0
        Set rowNumber = source.Range("I:I").Cells.Find(laser)
        'Laser1
        If (source.Range("I" & rowNumber.Row + 12).Value) <> "" Then
            idest = source.Range("I" & rowNumber.Row + 12).Value
        'Laser2
        ElseIf (source.Range("I" & rowNumber.Row + 17).Value) <> "" Then
            idest = source.Range("I" & rowNumber.Row + 17).Value
        'Laser3
        ElseIf (source.Range("I" & rowNumber.Row + 22).Value) <> "" Then
            idest = source.Range("I" & rowNumber.Row + 22).Value
        End If

Discussions similaires

  1. problème avec liste de valeur
    Par Golgotha dans le forum SQL
    Réponses: 12
    Dernier message: 16/01/2009, 08h40
  2. Problème avec application.run([VALEURS.UNIQUES],"plage",1)
    Par gregyard@hotmail.com dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 18/01/2008, 11h31
  3. Problème avec recherche
    Par Mimisio dans le forum IHM
    Réponses: 2
    Dernier message: 06/07/2007, 13h28
  4. problème avec switch et valeur 0
    Par melisse dans le forum Langage
    Réponses: 12
    Dernier message: 23/02/2007, 13h20
  5. Problème avec Me.RecordSource : valeur non conforme
    Par Tchupacabra dans le forum Access
    Réponses: 6
    Dernier message: 02/12/2005, 17h01

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