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 :

Importation de données avec conditions


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 89
    Points : 41
    Points
    41
    Par défaut Importation de données avec conditions
    Bonjour,

    Pour simplifier une procédures assez lourde j'ai créé une macro qui bloque à un mmt je ne sais pas pkoi....

    Je tiens d'abord à dire que je suis un fan de l'aide VBA ms en ce moment je suis au luxembourg et mon pc a été réinstallé en Italien (me demander pas pkoi...) dc je capte ke dalle (et on ne se moque pas merci !!!)

    Donc pour faire simple : pour chaque ligne, si ds la collone E il y a : "action " ou "Obligation " alors je prend les collones H, G et N (dans ce fichier et pour une ligne J) que je copie dans un autre fichier en A, B et C.

    Voici mon code :

    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
    Sub copy_tech()
     
    'J'ouvre le fichier qui m'interesse
    Workbooks.Open Filename:="T:\Arnaud Test VBA\Test World Invest\AINV REPORTS\0071006.CSV", local:=True
     
    Dim cond1 As String
    Dim cond2 As String
     
    cond1 = "ACTION    "
    cond2 = "OBLIGATION    "
     
    Windows("0071006.CSV").Activate
     
    ' Je demarre la recherche de ma condition
    For J = 1 To 400
    d = J + 14
     
    If Sheets("0071006").Cells(5, J).Value = cond1 Or Sheets("0071006").Cells(5, J).Value = cond2 Then
     
    'Ici ca fonctionne pour les 6 premiers J après ca bug et ca me met erreur 9 : "indice non incluso nell'intervallo" = "index non inclus dans l'intervalle"
     
    ' Je prend la valeur en H8 du fichier "PRICE CHECK - WI.xls" et la copie dans Worksheets("TECH").Cells(d, 1) --> d ct pour eviter de chercher la dernier ligne 
     
        Cells(J, 8).Select
        Selection.Copy
        Windows("PRICE CHECK - WI.xls").Activate
        ActiveSheet.Paste Destination:=Worksheets("TECH").Cells(d, 1)
     
    'pareil ici...
        Windows("0071006.CSV").Activate
        Cells(J, 7).Select
        Selection.Copy
        Windows("PRICE CHECK - WI.xls").Activate
        ActiveSheet.Paste Destination:=Worksheets("TECH").Cells(d, 2)
     
    'pareil ici...    
        Windows("0071006.CSV").Activate
        Cells(J, 14).Select
        Selection.Copy
        Windows("PRICE CHECK - WI.xls").Activate
        ActiveSheet.Paste Destination:=Worksheets("TECH").Cells(d, 3)
     
       End If
     
     J = J + 1
     
    Next J
     
    End Sub
    Bon ca marche pour deux lignes et après plus rien ...

    Merci d'avance !

    PS : si qq a des pb avec excel en italien je commence à maitriser

  2. #2
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 51
    Points
    51
    Par défaut proposition de solution
    Bonjour,

    j'ai fait tourner ton code et tenté de le déboguer. Pour simplifier, je n'ai utilisé qu'un seul fichier et j'ai remplacé les windows(NN).activate par des sheets. activate:

    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
     
    Sub copy_tech()
     
    'J'ouvre le fichier qui m'interesse
    ' Workbooks.Open Filename:="T:\Arnaud Test VBA\Test World Invest\AINV REPORTS\0071006.CSV", local:=True
     
    Dim cond1 As String
    Dim cond2 As String
     
    cond1 = "action"
    cond2 = "Obligation"
     
    Sheets("0071006").Activate
     
    ' Je demarre la recherche de ma condition
    For J = 1 To 400
    d = J + 14
     
    If Sheets("0071006").Cells(J, 5).Value = cond1 Or Sheets("0071006").Cells(J, 5).Value = cond2 Then
     
    'Ici ca fonctionne pour les 6 premiers J après ca bug et ca me met erreur 9 : "indice non incluso nell'intervallo" = "index non inclus dans l'intervalle"
     
    ' Je prend la valeur en H8 du fichier "PRICE CHECK - WI.xls" et la copie dans Worksheets("TECH").Cells(d, 1) --> d ct pour eviter de chercher la dernier ligne
     
        Sheets("0071006").Activate
        Cells(J, 8).Select
        Selection.Copy
        Sheets("TECH").Activate
        ActiveSheet.Paste Destination:=Worksheets("TECH").Cells(d, 1)
     
    'pareil ici...
        Sheets("0071006").Activate
        Cells(J, 7).Select
        Selection.Copy
        Sheets("TECH").Activate
        ActiveSheet.Paste Destination:=Worksheets("TECH").Cells(d, 2)
     
    'pareil ici...
        Sheets("0071006").Activate
        Cells(J, 14).Select
        Selection.Copy
        Sheets("TECH").Activate
        ActiveSheet.Paste Destination:=Worksheets("TECH").Cells(d, 3)
     
       End If
     
    Next J
     
    End Sub
    => mon analyse :
    1. dans les paramètres de CELL, tu as confondu les lignes et les colonnes dans la condition => donc tu n'as dû boucler que sur les colonnes
    2. dès lors que tu as for i = 1 to 400 ... next i, ce n'est pas la peine de faire i = i+1 car sinon tu vas de 2 en 2 ...


    amélioration envisageable :
    ainsi, ton code doit être interdit aux épileptiques ... essaye ç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
     
    Sheets("TECH").Activate
     
    If Sheets("0071006").Cells(J, 5).Value = cond1 Or Sheets("0071006").Cells(J, 5).Value = cond2 Then
     
    'Ici ca fonctionne pour les 6 premiers J après ca bug et ca me met erreur 9 : "indice non incluso nell'intervallo" = "index non inclus dans l'intervalle"
     
    ' Je prend la valeur en H8 du fichier "PRICE CHECK - WI.xls" et la copie dans Worksheets("TECH").Cells(d, 1) --> d ct pour eviter de chercher la dernier ligne
        Worksheets("TECH").Cells(d, 1) = Sheets("0071006").Cells(J, 8)
     
    'pareil ici...
        Worksheets("TECH").Cells(d, 2) = Sheets("0071006").Cells(J, 7)
     
    'pareil ici...
        Worksheets("TECH").Cells(d, 3) = Sheets("0071006").Cells(J, 14)
     
       End If
     
    Next J

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    0071006.CSV est à la fois un nom de fichier et 0071006 un nom de feuilles ?
    Pour ton code, il très lourd et en outre présente un certain nombre d'erreurs. Déjà, tu peux remplacer
    Windows("0071006.CSV").Activate
    Cells(J, 7).Select
    Selection.Copy
    Windows("PRICE CHECK - WI.xls").Activate
    ActiveSheet.Paste Destination:=Worksheets("TECH").Cells(d, 2)
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Workbooks("0071006.CSV").Cells(J, 7).Copy _
          destination:=Workbooks("PRICE CHECK - WI.xls").Worksheets("TECH").Cells(d, 2)
    ou encore, en instanciant tes feuilles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim FL1 as Worksheet
    Dim FL2 as Worksheet
    Set FL1 = Workbooks("0071006.CSV").Worksheets("Nom de la feuille")
    Set FL2 = Workbooks("PRICE CHECK - WI.xls").Worksheets("TECH")
        FL1.Cells(J, 7).Copy destination:=FL2.Cells(d, 2)
    Idem pour tout ton code.

    Une autre remarque, en fin de boucle, tu actives Windows("PRICE CHECK - WI.xls").
    or en début de boucle, quand tu mets
    " Cells(J, 8).Select"
    dans quel fichier es-tu censé te trouver ? Si ce n'est pas dans "PRICE CHECK - WI.xls" alors tu auras une erreur au deuxième tour de boucle.
    Commence par corriger tout ça

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 89
    Points : 41
    Points
    41
    Par défaut
    Oui le fichier c'est 0071006.csv et la feuille c'est 0071006 !
    Ca ne peut, malheureusement, pas être changé, trop de chose dépendent de ça !

    Ha bha merde j'étais loin du compte !!!

    Bon pour être honnête cette s*****perie d'Excel en Italien m'a vraiment soulé...

    Comme toujours merci pour ton aide ! Je vais essayer toutes ces modifs sur mon codes et on verra..

    @++

    Arnaud

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Citation Envoyé par nono le golfeur Voir le message
    Oui le fichier c'est 0071006.csv et la feuille c'est 0071006 !
    Ca ne peut, malheureusement, pas être changé, trop de chose dépendent de ça !
    Ok, pas d'importance, c'était pour être sûr

  6. #6
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 51
    Points
    51
    Par défaut
    as tu également de prendre en compte la crrection que j'ai mise dans ma première réponse:
    avec ces corrections, chez moi, ça tourne jusqu'à la ligne 400...

    A+
    Dam2P

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Désolé, dam2p, je n'avais pas vu ta réponse. Elle est meilleure que la mienne. Tu devrais l'adopter, nonos le golfeur
    Juste une chose : Si tu instancies tes feuilles ça simplifiera encore le code.
    A toi de jouer, nono.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 89
    Points : 41
    Points
    41
    Par défaut
    Merci à vous deux !!!

    Bon pour être le plus diplomate possible vous m'avez bien aidé tous les deux, maintenant tout fonctionne parfaitement...

    Donc :

    1- J'avais effectivement mélangé Ligne et collone
    2- J'avais oublié de réactiver le classeur en début de boucle donc effectivement ça foiré...

    Voici mon code qui fonctionne cette fois !

    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
    Sub copy_tech()
     
    Workbooks.Open Filename:="T:\Arnaud Test VBA\Test World Invest\0071006.CSV", local:=True
    Application.ScreenUpdating = False
     
    Dim FL1 As Worksheet
    Dim FL2 As Worksheet
    Dim cond1 As String
    Dim cond2 As String
    Dim L As Range
     
    Set FL1 = Workbooks("0071006.CSV").Worksheets("0071006")
    Set FL2 = Workbooks("PRICE CHECK - WI.xls").Worksheets("TECH")
     
    'Define the condition to search for
     
    cond1 = "ACTION    "
    cond2 = "OBLIGATION    "
     
    'Loop to search for the Equities & Bonds to import in the Price Check file
     
    For J = 1 To 300
    d = J + 13
     
    Workbooks("0071006.CSV").Activate
    If Sheets("0071006").Cells(J, 5).Value = cond1 Or Sheets("0071006").Cells(J, 5).Value = cond2 Then
     
        Workbooks("0071006.CSV").Activate
        FL1.Cells(J, 8).Select
        Selection.Copy
        Workbooks("PRICE CHECK - WI.xls").Activate
        ActiveSheet.Paste Destination:=FL2.Cells(d, 1)
     
        Workbooks("0071006.CSV").Activate
        FL1.Cells(J, 7).Select
        Selection.Copy
        Workbooks("PRICE CHECK - WI.xls").Activate
        ActiveSheet.Paste Destination:=FL2.Cells(d, 2)
     
        Workbooks("0071006.CSV").Activate
        FL1.Cells(J, 14).Select
        Selection.Copy
        Workbooks("PRICE CHECK - WI.xls").Activate
        ActiveSheet.Paste Destination:=FL2.Cells(d, 3)
     
       End If
     
    Next J
     
    'Closing of the 0071006.CSV Workbook
      Workbooks("PRICE CHECK - WI.xls").Activate
      Workbooks("0071006.CSV").Close
     
    'Replacement of the spaces by nothing
     
        'Workbooks("PRICE CHECK - WI.xls").Worksheets("TECH")
        FL2.Range("B14:B1000").Select
        Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Comme quoi un oeuil externe est toujours apréciable .. Merci encore et bonne journée !

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Juste deux petites remarques :
    Quand tu utilises l'instance d'une feuille il n'est pas nécessaire d'activer le classeur.
    Tu n'es jamais obligé de sélectionner une cellule, que ce soit pour la copier ou pour la modifier
    Tu pourrais ainsi remplacer ces sept lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Workbooks("0071006.CSV").Activate
    If Sheets("0071006").Cells(J, 5).Value = cond1 Or Sheets("0071006").Cells(J, 5).Value = cond2 Then
     
        Workbooks("0071006.CSV").Activate
        FL1.Cells(J, 8).Select
        Selection.Copy
        Workbooks("PRICE CHECK - WI.xls").Activate
        ActiveSheet.Paste Destination:=FL2.Cells(d, 1)
    par ces deux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If FL1.Cells(J, 5).Value = cond1 Or FL1.Cells(J, 5).Value = cond2 Then
        FL1.Cells(J, 8).Copy destination:=Destination:=FL2.Cells(d, 1)
    Enfin, pour copier la cellule d'une feuille dans une autre, la syntaxe proposée par dam2p est plus rapide que la copie.
    Zut, ça fait trois remarques !
    Bonne chance pour la suite

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 89
    Points : 41
    Points
    41
    Par défaut
    Oui effectivement pourquoi ce compliquer la vie ??? J'ai remplacer ça fonctionne bien avec ton truc !

    J'ai maintenant deux petit pb :

    J'aimerais après avoir copier mes cellules insérer des formules dans la cells(d,4) et (d,5) mais ca j'ai jamais fait et ca bug...

    mon code pour ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Workbooks("PRICE CHECK - WI.xls").Activate
        Sheets("TECH").Cells(d, 4).Formula = "=IF(B&d=0,"",SUMIF(ANAGRAFICHE!$B$2:$B$1100,B&d,ANAGRAFICHE!$C$2:$C$1100))"
     
    'et 
     
    Workbooks("PRICE CHECK - WI.xls").Activate
        Sheets("TECH").Cells(d, 4).Formula = "=IF(B&d=0,"",SUMIF(ANAGRAFICHE!$B$2:$B$1100,B&d,ANAGRAFICHE!$C$2:$C$1100))"
     
        Workbooks("PRICE CHECK - WI.xls").Activate
        Sheets("TECH").Cells(d, 4).Formula = "=IF(B&d=0,"",IF(D&d=C&d,"OK",(D&d-C&d)/D&d))"
    Et un truc qui va être surmement enfantin mais je pige pas comment faire, après avoir insérer mes lignes, je souhaite copier coller une plage de donnée sous la derniere ligne mais moi le seul truc que j'arrive à faire c'est coller sur la dernier ligne, donc je pers une ligne à chaque fois...

    Merci d'avance !

  11. #11
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 51
    Points
    51
    Par défaut
    Hi,

    Tu regarderas que dans la formule que tu as préparée sous VBA, tu gères mal les guillemets : n'oubles pas que non seulement les formules Excel utilisent les guillemets, mais aussi VBA, et qu'il faut respecter des syntaxes précises pour que VBA s'y retrouve quand les deux interagissent ensemble.

    Moi, quand je veux insérer des formules dans une cellule par l'intermédiaire de VBA, je me la fais bourrin en passant par l'enregistrement d'une nouvelle macro:
    1. prépare ta formule dans la cellule voulue sous Excel - comme tu dis que tu commence à maîtriser Excel en italien, ça ne devrait pas poser de pb - et vérifie qu'elle fonctionne comme tu veux;
    2. fais Outils:Macro:nouvelle macro;
    3. double-clique à l'intérieur de la cellule qui contient la formule qui marche, puis tape sur la touche entrée;
    4. clique sur "terminer l'enregistrement";
    5. sous VBA, copie/colle la ligne créée dans la nouvelle macro vers le bout de code que tu veux mettre à jour, remplace les valeurs en dur par les variables et constantes qui vont bien (très mauvais les valeurs en dur dans le code), et teste. Profites-en pour voir comment la question des guillemets est gérée...

    Je pense qu'il n'est pas bon qu'on te débogue ton bout de code : cette démarche sera plus didactique pour toi. Après, si tu as bonne mémoire, tu sauras le refaire sans passer par enregistrer macro, sinon, fais comme moi : bourrin à chaque fois.

    Je suppose que tu auras encore des difficultés après tes premiers essais, tu me redemandera alors, probablement sur la question du "comment remplacer les valeurs en dur par les constantes qui vont bien"; A bientôt donc

    N'oublie pas de marquer "Résolu" sur l'ensemble de tes questions, ça me permettra de passer plus rapidement au statut envié de "membre du club" .

    A+
    Dam2P

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Je te laisse le temps de lire et de bien assimiler ce que te dit dam2p...
    Pour ton pb, je te répondrai donc tantôt si personne ne l'a fait entre temps
    Bon courage

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 89
    Points : 41
    Points
    41
    Par défaut
    Merci dam2p, tu vas rire mais j'avais justement commencé à faire ça !!

    Pour l'instant j'ai juste un peu de mal à intégrer les variables et constantes mais bon ça devrais le faire...

    Par contre je dois aboslument copier les cellules en copiant juste les valeurs car les fichiers de bases sont pas bon du tout...

    Mais avec la façon d' OUskeln'or je ne vois pas trop comment faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    If FL1.Cells(J, 5).Value = cond1 Or FL1.Cells(J, 5).Value = cond2 Or FL1.Cells(J, 5).Value = cond3 Then
     
        FL1.Cells(J, 8).Copy Destination:=FL2.Cells(d, 1)
     
         FL1.Cells(J, 7).Copy Destination:=FL2.Cells(d, 2)
     
         FL1.Cells(J, 14).Copy Destination:=FL2.Cells(d, 3)
     
     
       End If
    J'aimerais ne pas reprendre ma vieille version un peu trop lourde....

    Any idea ?

    @++

  14. #14
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 51
    Points
    51
    Par défaut
    Esssaye ça (avec ma méthode de copie entre cellules) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'transfert des données de 0071006 vers TECH pour les actions et les obligations :
    If FL1.Cells(J, 5).Value = cond1 Or FL1.Cells(J, 5).Value = cond2 Or FL1.Cells(J, 5).Value = cond3 Then
         'ici, on fait une copie "par valeurs".
         FL2.Cells(d, 1).Value = FL1.Cells(J, 8).Value
         FL2.Cells(d, 2).Value = FL1.Cells(J, 7).Value
         FL2.Cells(d, 3).Value = FL1.Cells(J, 14).Value
     
    End If

    ou ça (variante que je trouve moins jolie, et plus consommatrice de temps CPU ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'transfert des données de 0071006 vers TECH pour les actions et les obligations :
    If FL1.Cells(J, 5).Value = cond1 Or FL1.Cells(J, 5).Value = cond2 Or FL1.Cells(J, 5).Value = cond3 Then
         'ici, on fait un "collage spécial" par valeur, comme on l'aurait fait en interactif sous Excel.
         FL1.Cells(J, 8).Copy
         FL2.Cells(d, 1).PasteSpecial Paste:=xlPasteValues
         FL1.Cells(J, 7).Copy
         FL2.Cells(d, 2).PasteSpecial Paste:=xlPasteValues
         FL1.Cells(J, 14).Copy
         FL2.Cells(d, 3).PasteSpecial Paste:=xlPasteValues
    End If

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Si ce sont des valeurs, avec la méthode de dam2p, tu peux aussi faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         FL2.Cells(d, 1) = Val(FL1.Cells(J, 8))
         FL2.Cells(d, 2) = Val(FL1.Cells(J, 7))
         FL2.Cells(d, 3) = Val(FL1.Cells(J, 14))

  16. #16
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 51
    Points
    51
    Par défaut
    Cher Ouskel'nor,

    Citation Envoyé par ouskel'n'or Voir le message
    Si ce sont des valeurs, avec la méthode de dam2p, tu peux aussi faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         FL2.Cells(d, 1) = Val(FL1.Cells(J, 8))
         FL2.Cells(d, 2) = Val(FL1.Cells(J, 7))
         FL2.Cells(d, 3) = Val(FL1.Cells(J, 14))
    Bien d'accord avec toi, mais ce type de syntaxe qui est simple, il faut le reconnaître, est peut être moins évidente à comprendre pour un newbie car plus éloignée du type de code que retourne l'enregistrer macro d'Excel...

    Pour Nono,
    Pour ta question de formules, j'ai vu que tu as ouvert un autre forum. La réponse que Lou Pitchoun y a faite est très bonne, tu devrais trouver avec ça. Bon courage.

    A+
    Dam2P

  17. #17
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Si ce sont des valeurs, avec la méthode de dam2p, tu peux aussi faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         FL2.Cells(d, 1) = Val(FL1.Cells(J, 8))
         FL2.Cells(d, 2) = Val(FL1.Cells(J, 7))
         FL2.Cells(d, 3) = Val(FL1.Cells(J, 14))
    @Ouskel'nor : en fait, j'ai répondu trop vite dans ma réponse précédente car quand tu fais Val(FL1.Cells(J, 8)), tu récupères 0 dans la cellule FL2.Cells(d, 1).
    Ca s'explique car Val ne sert pas à ça : le help Excel donne : Renvoie le nombre contenu dans une chaîne de caractère sous la forme d'une valeur numérique d'un type approprié. Donc ta solution ne marche pas.

    @Nono le golfeur : merci de nous dire quand ce sera OK
    A+
    Dam2P

  18. #18
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Citation Envoyé par dam2p
    @Ouskel'nor : en fait, j'ai répondu trop vite dans ma réponse précédente car quand tu fais Val(FL1.Cells(J, 8)), tu récupères 0 dans la cellule FL2.Cells(d, 1).
    Ca s'explique car Val ne sert pas à ça : le help Excel donne : Renvoie le nombre contenu dans une chaîne de caractère sous la forme d'une valeur numérique d'un type approprié. Donc ta solution ne marche pas.
    Tu as testé ? Moi je l'ai fait, avec des valeurs...
    Citation Envoyé par ousk'
    Si ce sont des valeurs, avec la méthode de dam2p, tu peux aussi faire
    T'as répondu encore trop vite

  19. #19
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 51
    Points
    51
    Par défaut
    Oui, j'ai testé deux fois : en utilisant une formule qui retourne une valeur de type numérique, Val fonctionne, mais Val retourne 0 avec une formule qui retourne une valeur de type texte...
    Mais si je me plante, alors je te présente mes excuses... Sinon, il n'est pas sûr que j'ai répondu trop vite ...

    => j'avais fait ça pour tester la perfo de cette instruction, avec =SI(C1=1;"truc";"trac") dans la cellule A1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub quantifier()
    Dim heure
     
        heure = Time
        For i = 1 To 65536
            Cells(i, 2) = Val(Cells(1, 1))
        Next i
        Cells(1, 3).Value = Time - heure
    End Sub
    Cela-dit, je sors de ce forum car je pense que toutes les réponses nécessaires à Nono le golfeur lui ont été fournies. Merci de me répondre sur mail privé pour éviter le troll.
    A+
    Dam2P

  20. #20
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Je suis bien obligé de répondre ici sinon je peux pas coller d'image
    Il est normal que tu aies 0
    Si tu prends l'heure = maintenant et que tu fais Time - heure, à moins que ta routine passe l'heure suivante, tu as Heure - Time = 0
    De mon côté, j'ai fait cette macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test2()
    Dim i As Long, TextPasText As Byte
    For i = 1 To 65535
       TextPasText = Int((2 * Rnd) + 1)
       Select Case TextPasText
            Case 1
                Cells(i, 1) = i
            Case 2
                Cells(i, 1) = CStr(i)
        End Select
        Cells(i, 2) = Val(Cells(i, 1))
    Next
    End Sub
    Cette macro qui donne de manière aléatoire un nombre ou un string, affiche le résultat avec Val dans la colonne 2.
    Je ne mets que quelques lignes Pièce jointe 18242 la colonne de gauche étant au format "Standard"
    Tu peux tester.
    J'ai constaté qu'avec Val, une valeur reste une valeur.
    Si c'est une date, elle est convertie en N° de série.
    Pour tout dire, j'ai découvert ça en cherchant autre chose et ça m'a déjà bien rendu service avec les dates.
    Ceci dit, tes intervensions m'ont rappelé qu'une bonne solution prise "à l'envers" peut être bien meilleure si on reparts du problème qu'on veut régler, non de la solution proposée
    Merci donc de tes interventions
    A+

Discussions similaires

  1. Importer des données avec une condition
    Par marcelstan dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/05/2014, 16h53
  2. db2: récupération de données avec condition max
    Par letuyen dans le forum Langage SQL
    Réponses: 8
    Dernier message: 07/03/2007, 16h45
  3. Réponses: 4
    Dernier message: 09/05/2006, 08h55
  4. import de données avec BCP
    Par doudou10000 dans le forum Outils
    Réponses: 2
    Dernier message: 09/12/2005, 16h10
  5. [DTS] Import de données avec des doublons
    Par Hotchotte dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 24/03/2005, 14h19

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