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 :

Copie de valeur feuil1 vers feuil2, boucle for [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Par défaut Copie de valeur feuil1 vers feuil2, boucle for
    Bonjour,

    Voila mon soucis, J'ai deux feuilles de calcul sur excel :

    Feuil1:
    Colonne A - Colonne F
    8h30 - Donnée1
    8h40 - Donnée2
    8h50 - Donnée3
    ...

    Feuil2:
    Colonne A - Colonne G
    8h30 -
    8h30 -
    8h30 -
    8h30 -
    8h40 -
    8h40 -
    ...

    J'aimerais que:
    Pour chaque lignes, Si A,i Feuil1 = A,i Feuil2 Alors On colle F,i Feuil1 sur G,i Feuil2.

    Voila mon code (qui ne marche pas...), je crois avoir cerné mon problème: ma déclaration de variable n'est pas bonne.
    Comment déclarer que je travail sur A mais aussi sur F et G dans la boucle For?
    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
    Sub copie()
     
    Dim Origine As Worksheet
    Dim Destination As Worksheet
    Dim i As Integer
     
    Set Origine = Worksheets("Feuil1")
    Set Destination = Worksheets("Feuil2")
     
                For i = .Range("A" & .Rows.Count).End(xlUp).Row To 1 Step -1
     
    If Origine.Range("A" & i).Value = Destination.Range("A" & i).Value Then
    Destination.Range("G" & i).Value = Origine.Range("F" & i).Value
     
    End If
    End Sub

  2. #2
    Membre Expert Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 908
    Par défaut
    Bonjour,

    Je vois l'intérêt de ton code mais ce que je ne comprend pas, c'est où cela plante ?
    Mis à part qu'il manque un "next" dans le code, je ne vois rien de spécial...

    Comment déclarer que je travail sur A mais aussi sur F et G dans la boucle For?
    TU les utilise déjà dans ta boucle, donc je ne saisis pas vraiment ta question...

    Après, si tes cellules sont fixes, n'as-tu pas d'intérêt à utiliser une formule Excel directement ?

    Cordialement,

  3. #3
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Par défaut
    Il me surligne .Rows en me disant "référence incorrecte ou non qualifié".

    Je travail en macro parce que mon fichier est très lourd et je ne veux pas l'encombrer avec des formules à rallonge.
    L'interface doit rester clair

  4. #4
    Membre Expert Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 908
    Par défaut
    D'accord.

    Personnellement, je n'aime pas trop le ".Rows.Count" quand il s'agit de récupérer la dernière ligne...

    Utilises plutôt un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("A65536").end(xlup).row
    Cordialement,

  5. #5
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Par défaut
    La macro est fonctionnelle mais le résultat l'est moins...
    L'erreur c'est que je compare Ligne par Ligne alors que les valeurs à comparer ne sont pas forcément sur la même ligne...

    Je m'explique:
    Feuil1:
    Ligne A ->> 8h30 - Donnée1

    Feuill2:

    Ligne G ->> 8h30 - [Donnée1 a copier ICI]
    Ligne E ->> 8h30 - [Donnée1 a copier ICI]
    Ligne F ->> 8h30 - [Donnée1 a copier ICI]

    La macro nécessaire me parait beaucoup plus complexe...

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Gado2600 Voir le message
    D'accord.

    Personnellement, je n'aime pas trop le ".Rows.Count" quand il s'agit de récupérer la dernière ligne...

    Utilises plutôt un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("A65536").end(xlup).row
    Cordialement,

    Bonjour,

    il a taggué son sujet en version Excel 2007.
    il parle également de fichier lourd

    rien ne nous dis qu'il ne dépasse pas la limitation des version antérieures, et que son fichier comporte 500 000 lignes

  7. #7
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Par défaut
    En effet mon fichier fait plus de 900 000 lignes, je ne pourrais donc pas utiliser la fonction .Range("A65536").end(xlup).row, Mais ça ne règle pas mon problème

    Quelle est la méthode pour comparer les valeurs d'une colonne sans faire du ligne par ligne ?

  8. #8
    Membre émérite
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Par défaut
    Bonjour,
    Sans utiliser le comptage de ligne, tu peux faire comme ceci, testé chez moi il semble que cela corresponde à ton besoin
    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
    Sub copie()
     
    Dim Origine As Worksheet
    Dim Destination As Worksheet
    Dim i As Integer
    Dim j As Integer
    Set Orig = Worksheets("Feuil1")
    Set Dest = Worksheets("Feuil2")
    i = 1
    j = 1
      Do While Orig.Range("A" & i) <> ""
     
                If Orig.Range("A" & i).Value = Dest.Range("A" & j).Value Then
                Dest.Range("G" & j).Value = Orig.Range("F" & i).Value
                    If Dest.Range("A" & j + 1).Value = Dest.Range("A" & j).Value Then
                    i = i
                    j = j + 1
                    Else
                    i = i + 1
                    j = j + 1
                    End If
                Else
                i = i + 1
                j = j
                End If
     
     Loop
    End Sub
    Eric

    ebonjour,
    Pas vu les deux réponses précédentes, effectivement pour un nombre de ligne aussi important la gestion par des tableaux semble la solution la plus adaptée.
    Eric

    Bonjour,
    Le code suivant fonctionne plus rapidement que le premier réalisé, par contre je ne suis pas certain qu'il acceptera un si grand nombre de données.

    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
    61
    62
    Sub copie2()
    Dim Origine As Worksheet
    Dim Destination As Worksheet
    Dim Orig As Range
    Dim Dest As Range
    Dim Tableau1() As String
    Dim Tableau2() As String
    Dim i As Long
    Dim j As Long
    Dim Derligne1 As Long
    Dim Derligne2 As Long
    Set Origine = Worksheets("Feuil1")
    Set Destination = Worksheets("Feuil2")
    Set Orig = Origine.Range("A1")
    Set Dest = Destination.Range("A1")
    Orig = Orig.Offset()
    Dest = Dest.Offset()
    Dim Pass1 As Double
    Dim Pass2 As Double
    Pass1 = Timer
    With Sheets("Feuil1")
        Derligne1 = .Cells(.Rows.Count, 1).End(xlUp).Row
    End With
     
    With Sheets("Feuil2")
        Derligne2 = .Cells(.Rows.Count, 1).End(xlUp).Row
    End With
     
    ReDim Tableau1(0 To Derligne1)
    ReDim Tableau2(0 To Derligne2)
     
    For i = 0 To UBound(Tableau1)
    Tableau1(i) = Orig.Offset(i, 0)
    Next i
     
    For j = 0 To UBound(Tableau2)
    Tableau2(j) = Dest.Offset(j, 0)
    Next j
     
     i = 0
     j = 0
     
     Do While Tableau1(i) <> ""
     If Tableau1(i) = Tableau2(j) Then
     Dest.Offset(j, 6) = Orig.Offset(i, 5)
        If Tableau2(j + 1) = Tableau2(j) Then
        i = i
        j = j + 1
        Else
        i = i + 1
        j = j + 1
        End If
     Else
     i = i + 1
     j = j
     End If
     
     
     Loop
    Pass2 = Timer
    MsgBox Pass2 - Pass1 & " secondes "
    End Sub
    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

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

Discussions similaires

  1. [XL-2007] copier des lignes de feuil1 vers feuil2 si valeur différente de 0
    Par epsilonenadia dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 16/12/2013, 15h29
  2. somme feuil1 vers feuil2
    Par dianbobo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/06/2010, 22h18
  3. Prendre en compte une valeur insérée dans une boucle for
    Par SOPSOU dans le forum Intelligence artificielle
    Réponses: 6
    Dernier message: 08/07/2009, 16h20
  4. exporter feuil1 vers feuil2 + présentation automatique
    Par akmer dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 07/04/2008, 14h05
  5. utiliser une valeur float pour une boucle for
    Par didi59650 dans le forum Débuter
    Réponses: 6
    Dernier message: 18/04/2006, 17h32

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