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 :

copier des données avec conditions


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 138
    Points : 72
    Points
    72
    Par défaut copier des données avec conditions
    Bonjour !
    Dans le jeu de données ci-joint, je voudrais copier les valeurs de la colonne C dans la colonne H selon plusieurs critères…
    Par exemple je veux copier pour les valeurs de la colonne A « 3160T1,1 » la plus petite valeur positive de la colonne C…ici, la valeur est 286.
    J’ai une ébauche de code que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Range("a1").Select
     
      For Index = 2 To 50
              If (Cells(Index, 1) = "3160T1,1" and cells(Index,3)>0)Then
               Range(Cells(Index, 3), Cells(Index, 3)).Select
     
            Selection.Copy
             Range(Cells(Index, 8), Cells(Index, 8)).Select
            ActiveSheet.Paste
     
          End If
        Next Index
     
    End Sub
    Ce code ne répond pas à « la plus petite valeur positive »…de plus, je ne sais pas généraliser ce code pour les autres valeurs de la colonne A : j’ai d’autres valeurs comme 3160t1,10 3160t1,11…(la valeur du chiffre après la virgule variant de 1 à 40 mais toutes les valeurs n’y sont pas forcément)…
    Merci à ceux qui pourront m’aider
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    SAlut
    Voila un debut je n'est aps trop le temps mais ce bout de code devrait te permettre de faire la liste des differents noms contenus dans ta colonne A

    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
    Sub MiniVal
    Dim PlageNom as Range, TestRange as range
    Dim StrList(10) as String
    Dim LastStr as Integer
     
    PlageNom = Range("A1", Range("A1").End(xlDown))
    LastStr = 0
    'On cré la liste de nom differents existant dans la colonne A
    For each TestRange In PlageNom
        For i = 0 to High(StrList)
             If TestRange.Text = StrList(I) Then 
                 Goto Deja
             ElseIf TestRange.Text = "" Then
                 Exit For
             End If
        Next i
        StrList(LastStr) = TestRange.Text 
        If LastStr = High(StrList) Then Redim Preserve StrList(High(StrList) + 10) 'Allocation par bloc de 10 pour evité l'etalement en memoire
        LastStr = LastStr +1
    Deja:
    Next TestRange 
     
    End Sub
    Je regarderai pour la suite apres mangé

    J'ai fait ca sous Open Office ! et oui je l'avais oublié celui la mais bon j'ai pas l'aide a la syntaxe donc y'a peut etre des erreur de terme je n'ai pas testé le code

    A++
    QWaz

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 138
    Points : 72
    Points
    72
    Par défaut
    Merci...
    Problème de définition de "High"...dois je le définir en range ?
    Encore merci de ton aide

  4. #4
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'Ensuite il faut chercher la valeur la plus petite
    ValeurP 9999999 'Mettre une valeur tres grande je sais pas si en vb il y a pas un truc style Max_Int (qui represente la plus grande valeur possible pour un Integer
    For i = 0 To LastStr
        For each TestRange In PlageNom 'A la place de la boucle Fro each tu doit pouvoir utiliser Cells.find mais je ne l'ai jamais utilisé renseigne toi, ca gagnerai beaucoup de temps
            If (StrList(i) = TestRange.Text) And (cInt(ValeurP.text) > Cint(Cells(TestRange.row,3))) Then 
                ValeurP := CInt(Cells(TestRange.row,3))
                RowP := TestRange.row 
            end If
        Next TestRange      
        Cells(rowP,8) = ValeurP
        ValeurP.Text = cstr(9999999)
    Next i
    Heu zut pour High non c'est que je fait plus du Delphi que du VB High est un mot clef qui te permet d'optenir la plus grande valeur d'un tableau,je regarde ca
    ++
    Qwaz

  5. #5
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Re
    Voila j'ai pas retrouvé la function qui le fait je pensais a HigherBound ou HighBound mais je l'ai pas retrouvé, enfin bref

    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
     
    Sub MiniVal
    Dim PlageNom as Range, TestRange as range
    Dim StrList(10) as String
    Dim LastStr as Integer
    Dim ValeurP, RowP as Integer
    Dim MaxStr as Integer
     
    MaxStr = 10
     
    PlageNom = Range("A1", Range("A1").End(xlDown))
    LastStr = 0
    'On cré la liste de nom differents existant dans la colonne A
    For each TestRange In PlageNom
        For i = 0 to High(StrList)
             If TestRange.Text = StrList(I) Then 
                 Goto Deja
             ElseIf TestRange.Text = "" Then
                 Exit For
             End If
        Next i
        StrList(LastStr) = TestRange.Text 
        If LastStr = MaxStr Then
            MaxStr = MaxStr + 10 'Allocation par bloc de 10 pour evité l'etalement en memoire
            Redim Preserve StrList(MaxStr)
        End
        LastStr = LastStr +1
    Deja:
    Next TestRange
     
    'Ensuite il faut chercher la valeur la plus petite
    ValeurP 9999999 'Mettre une valeur tres grande je sais pas si en vb il y a pas un truc style Max_Int (qui represente la plus grande valeur possible pour un Integer
    For i = 0 To LastStr
        For each TestRange In PlageNom 'A la place de la boucle Fro each tu doit pouvoir utiliser Cells.find mais je ne l'ai jamais utilisé renseigne toi, ca gagnerai beaucoup de temps
            If (StrList(i) = TestRange.Text) And (cInt(ValeurP.text) > Cint(Cells(TestRange.row,3))) Then 
                ValeurP := CInt(Cells(TestRange.row,3))
                RowP := TestRange.row 
            end If
        Next TestRange      
        Cells(rowP,8) = ValeurP
        ValeurP.Text = cstr(9999999)
    Next i
     
    End Sub
    Je n'ai pas put le tester Open Office reconnait pas les as range .....

    A++
    Qwaz

  6. #6
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    SAlut
    En cherchant autre chose pour quelqu'un d'autre je suis tombé sur BDMin qui te permet de sortir la plus petite valeur celon critere, en l'assemblant avec d'autre function ca serait peut etre possible de resortir ce que tu veux sans avoir a faire du code
    A++
    Qwaz

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 138
    Points : 72
    Points
    72
    Par défaut
    je te remercie beaucoup...je vais me pencher sur cette fonction car j'avoue que le code que tu m'as proposé me pose des soucis et révèle mes faiblesses en VBA.
    Encore merci du tuyau

  8. #8
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    SAlut
    J'ai envoyer mon code au boulot poue le tester sous excel j'ai corrigé les erreurs voila le code corrigé

    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
    Sub MiniVal() 
    Dim PlageNom As Range, TestRange As Range 
    Dim StrList() As String 
    Dim LastStr As Integer 
    Dim ValeurP, RowP As Integer 
    Dim MaxStr As Integer 
    Dim i As Integer 
     
    MaxStr = 10 
    ReDim Preserve StrList(MaxStr) 
     
    Set PlageNom = Range("A2", Range("A1").End(xlDown)) 
    LastStr = 0 
    'On cré la liste de nom differents existant dans la colonne A 
    For Each TestRange In PlageNom 
        For i = 0 To MaxStr 
             If TestRange.Text = StrList(i) Then 
                 GoTo Deja 
             ElseIf TestRange.Text = "" Then 
                 Exit For 
             End If 
        Next i 
        StrList(LastStr) = TestRange.Text 
        If LastStr = MaxStr Then 
            MaxStr = MaxStr + 10 'Allocation par bloc de 10 pour evité l'etalement en memoire 
            ReDim Preserve StrList(MaxStr) 
        End If 
        LastStr = LastStr + 1 
    Deja: 
    Next TestRange 
     
    'Ensuite il faut chercher la valeur la plus petite 
    ValeurP = 32700 'Mettre une valeur tres grande je sais pas si en vb il y a pas un truc style Max_Int (qui represente la plus grande valeur possible pour un Integer 
    For i = 0 To LastStr 
        For Each TestRange In PlageNom 'A la place de la boucle Fro each tu doit pouvoir utiliser Cells.find mais je ne l'ai jamais utilisé renseigne toi, ca gagnerai beaucoup de temps 
            If (StrList(i) = TestRange.Text) And (CInt(ValeurP) > CInt(Cells(TestRange.Row, 3))) Then 
                ValeurP = CInt(Cells(TestRange.Row, 3)) 
                RowP = TestRange.Row 
            End If 
        Next TestRange 
        Cells(RowP, 8) = ValeurP 
        ValeurP = 32700 
    Next i 
     
    End Sub
    A++
    Qwaz

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 138
    Points : 72
    Points
    72
    Par défaut
    C'est exactement ce qu'il me fallait!
    Un TRES GRAND merci à toi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Grouper des données avec condition
    Par jzb10n dans le forum Excel
    Réponses: 3
    Dernier message: 21/01/2015, 11h01
  2. copier des infos avec condition entre deux feuilles
    Par suikasensei dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/07/2011, 17h36
  3. Copier des données sous condition
    Par delphine1987 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/04/2011, 22h17
  4. Copier des données selon conditions
    Par BOU59000 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/07/2009, 17h15
  5. Ajout des données avec une condition
    Par jean sami dans le forum SQL
    Réponses: 2
    Dernier message: 15/09/2008, 06h21

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