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 :

[VBA-E]Trouver et recopier des cellules d'une feuille à une autre


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Points : 66
    Points
    66
    Par défaut [VBA-E]Trouver et recopier des cellules d'une feuille à une autre
    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 findproc()
     
    Dim i As Integer, j As Integer, feuil1 As Worksheet, feuil2 As Worksheet, critere As String, reponse As Range, NbLignesFeuil2 As Long, NbLignesFeuil1 As Long, li As Long, co As Long
     
    Set feuil1 = ThisWorkbook.Worksheets("feuil1")
    Set feuil2 = ThisWorkbook.Worksheets("feuil2")
     
    NbLignesFeuil1 = feuil1.Cells(65536, 1).End(xlUp).Row
    NbLignesFeuil2 = feuil2.Cells(65536, 1).End(xlUp).Row
     
    For i = 2 To NbLignesFeuil2
     
    critere = feuil2.Cells(i, 1)
    Set reponse = feuil1.Range(Cells(2, 1), Cells(NbLignesFeuil1, 1)).Find(critere, feuil1.Cells(2, 1), xlValue, xlWhole, xlByRows, xlNext)
    If Not reponse Is Nothing Then
    li = reponse.Row
    f2.Cells(i, 2) = f1.Cells(li, 2)
    End If
     
    Next i
     
    End Sub
    Je dispose de deux feuilles. Les elements des premieres colonnes de chaque feuilles constituent une clé. Je n'ai donc pas besoin de findnext car la premiere reponse trouvé par find suffit amplement.

    Précédemment, j'avais commencé par du:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for i=1 to NbLignesFeuil1
    for j=1 to NbLignesFeuil2
     
    if feuil1.cells(i,1) = feuil2.cells(i,2) then
    ....
    end if
     
    next j
    next i
    En terme de performance, c'était très mauvais (sur ma bécanne, en 10000 * 5000 lignes, ça prend 50 minutes...oui le PC est mauvais mais je n'y peux rien).

    Ensuite je suis passé à du

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for i=1 to NbLignesFeuil1
    j=0
     
    do
    j=j+1
    loop while j<=NbLignesFeuil2 and feuil1.cells(i,1) <> feuil2.cells(i,2)
     
    if j<=NbLignesFeuil2 then
     
    .......
     
    end if
     
    next i
    c'est mieux, on passe a 30 minutes.

    Mais quand je compare a du vlookup, je me dis que ça reste vraiment très mauvais.

    Pour des raisons assez ininteressantes, Vlookup ne m'interesse pas.

    Je me tourne vers .find. Mais dans mon code, la methode range echoue.

    Quelqu'un sait pourquoi?

    (ps: les fichiers d'aide vba ont été suprimé)

    Question subsidiaire: le .find est-il le plus rapide possible?

  2. #2
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Points : 66
    Points
    66
    Par défaut
    personne n'a donc d'idées pk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set reponse = feuil1.Range(Cells(2, 1), Cells(NbLignesFeuil1, 1)).Find(critere, feuil1.Cells(2, 1), xlValue, xlWhole, xlByRows, xlNext)
    ça ne fonctionne pas?

  3. #3
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Pourquoi ne pas utiliser le VlookUp ?

    Pourquoi sinon ne pas créer une nouvelle colonne dans ton fichier Excel, ou tu met justement ta rechercheV que ut pourra par ailleurs tirer par une macro justement ?
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  4. #4
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Points : 66
    Points
    66
    Par défaut
    a vrai dire au vu de mon probleme initial, j'ai du mal a voir comment m'en servir.

    table de reference:

    client 1 200€ 300€ 400€
    client 2 100€
    client 3 300€ 250€

    fichier a enregistrer

    client 3 100€

    => la macro tourne

    client 1 200€ 300€ 400€
    client 2 100€
    client 3 300€ 250€ 100€

    comme je dois entrer mes valeurs a des positions variables, vlookup me gene. obtenir une adresse aurait été plus simple.

    En plus, g 4 feuilles a renseigner (genre feuille2=lieu d'achat) etc...

    du coup il me faudrait 4 vlookup si vlookup ne me renseigne pas sur l'adresse.

    C'est pourquoi find me plait.



    et puis ça fait si classsseeeeee


    (mais je suis preneur de toute solution rapide a l'execution hein! )

  5. #5
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Je réitère ma deuxième question :

    Pourquoi sinon ne pas créer plus simplement une nouvelle colonne dans ton fichier Excel, ou tu met justement ta rechercheV que tu pourra par ailleurs tirer par une macro justement ?
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  6. #6
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Points : 66
    Points
    66
    Par défaut
    j'arrive pas à voir comment tu ferais ça

    imaginons

    Table a completer

    num v1 v2 v3
    1 100 200
    2 100
    3 50
    4 100 200 300

    table de donnees mensuelles

    num valeur
    2 200
    3 100
    5 200

    je dois donc ajouter 200 à la ligne 2, 100 à la ligne 3, et ajouter une ligne pour le client 5 avec 200 comme valeur.

    avec un find, je cherche la ligne correspondante et avec l'adresse je peux renseigner les cases correspondantes. Et si find ne trouve rien je j'ajoute

    en revanche si je fais un vlookup, je ne connais pas l'adresse correspondante, juste la valeur.

    Ou je me trompe?

Discussions similaires

  1. [VBA-E]recopier des cellules dans un fichier
    Par Lex O'Mil dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 19/04/2007, 21h01
  2. Réponses: 4
    Dernier message: 30/05/2006, 17h21
  3. [VBA-E]Extraire les infos des cellules
    Par boosty dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 11/04/2006, 09h46
  4. [VBA-E]définir l'ensemble des cellules d'une feuille?
    Par yaya54 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 02/03/2006, 08h46
  5. [VBA] [EXCEL 97] Formatage automatique des cellules
    Par plante20100 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/09/2005, 09h49

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