Boucle à 2 variable?

Résolu
Bonjour,

je rencontre un problème sur une macro que je viens de crée.
J'ai un 1er classeur de 16 000 lignes et un 2éme de 300 lignes.
Le but est d'extraire les donnée du 2eme vers le Premier via la boucle for (K=2 to Lsce).Pour augmenter la rapidité j'ai penser à mettre une autre boucle for. Probléme, la valeur de j reste à 0
Une idée ? La boucle K pose probléme ?

Merci !

ps : Excel 2003
----------------------------------------------------------------------

Windows("C2.xls").Activate
Sheets("Feuil2").Activate
Range("A2").Select

Lsce = 2
Do
Lsce = Lsce + 1
Loop Until Range("A" & Lsce).Value = Empty
MsgBox (Lsce)

For K = 2 To Lsce

Cells(K, 3).Select
Vcherche = ActiveCell.FormulaR1C1
MsgBox (Vcherche)

If Vcherche = "1" Then
Début = 2
If Vcherche = "2" Then
Début = 100
If Vcherche = "3" Then
Début = 1000
If Vcherche = "4" Then
Début = 2000

End If
End If
End If
End If

Windows("C2.xls").Activate
Sheets("Feuil2").Activate

For j = 2 To ligne
MsgBox (j)
Windows("C1.xls").Activate
Sheets("Feuil1").Activate
Cells(j, 5).Select
Valcherche = ActiveCell.FormulaR1C1

'MsgBox (valeurchercher)
trouve = False
q = 1
Do
Windows("C2.xls").Activate
Sheets("Feuil2").Activate
Cells(q, 1).Select

If Selection.Value = valeurchercher Then
trouve = True
Cells(q, 2).Select
Selection.Copy
Windows("C1.xls").Activate
Sheets("Feuil2").Activate
Cells(j, 7).Select
ActiveSheet.Paste
---------------------------------------------------------
Configuration: Windows XP
Internet Explorer 6.0

7 réponses

  1. Ta boucle for n'a pas de fin :
    For K = 2 To Lsce 
    ...
    Next K
    

    D'autre part, ce code ne me semble pas judicieux :
    If Vcherche = "1" Then 
       Début = 2 
       If Vcherche = "2" Then 
          Début = 100 
          If Vcherche = "3" Then 
             Début = 1000 
             If Vcherche = "4" Then 
                Début = 2000 
             End If 
          End If 
       End If 
    End If 
    

    J'aurai plus vu un truc du genre :
    If Vcherche = "1" Then 
       Début = 2 
    End If 
    If Vcherche = "2" Then   
       Début = 100 
    End If 
    If Vcherche = "3" Then 
       Début = 1000 
    End If 
    If Vcherche = "4" Then 
       Début = 2000 
    End If 
    
    0
    1. Salut, ça n'a pas servi à grand chose, j'ai été obligé de retirer les End If.
      ça doit être dut aux 2 variables.
      si je remplace le "Début" par une valeur fixe, sa fonctionne, mais c'est trop long.
      trop de ligne ....
      0
    2. le Next K se situe a la fin de la Sub
      j'ai extrais une partie.
      Si je met une valeur a Debut, sa marche bien, mais dés qu'il y a "Début" le "j" reste à 0 et la sub bloque sur

      Cells(j, 5).Select
      0
    3. @PawnHa oui ...
      Quand on code, on évite au maximum les caractères spéciaux, les accents ...
      0
    4. @ddezSalut, j'ai remplacé le "Début" par "n" et le problème reste le même.

      j'ai tenté de mettre "Dim n as .... " mais rien ne change. est-ce un mauvais choix de boucle ?

      merci pour tes réponses.
      0
  2. bonjour,

    Probléme, la valeur de j reste à 0 ... où est initialisé ligne dans For j = 2 to ligne ?

    ;o)
    0
    1. Salut, elle est initialisé par une boucle loop que j'ai mise au dessus du la boucle for

      ligne = 1
      do
      ligne = ligne +1
      loop until range("A" & ligne) = empty

      il reste à 0 par rapport à la variable "début".
      il garde pas en memoire la valeur de la variable, enfin je crois ....

      " dim Début as Variant "
      0
  3. Contributeur
    bonjour tous,
    Peut-être avec cette tite macro...
    Sub VB12()
    Dim K As Long, J As Long
    Dim FL1 As Worksheet
    Dim FL2 As Worksheet
        Set FL1 = Workbooks("C1.xls").Sheets("Feuil1")
        Set FL2 = Workbooks("C2.xls").Sheets("Feuil2")
        
        For K = 2 To FL1.Range("E65536").End(xlUp).Row
            For J = 2 To FL2.Range("A65536").End(xlUp).Row
                If FL1.Cells(K, 5) = FL2.Cells(J, 1) Then
                    FL2.Cells(J, 2).Copy FL1.Cells(K, 7)
                    Exit For
                End If
            Next J
        Next K
    End Sub

    Si j'ai bien compris ce que tu veux faire.
    A+
    0
    1. SAlut lermit222
      Effectivement c'est bien cela, l'ennui, c'est que la macro met du temps avant de se terminer.
      Aurais-tu une idée pour augmenter la rapidité de la chose ?

      Merci
      0
  4. Contributeur
    Quand tu fait des opérations sur 2 classeurs, ça prend toujours plus de temps ça dépend aussi du nombre de lignes à traiter, dans ton cas il faut tester 16000 x 300 = 4.800.000 lignes !!
    Tu peu déjà un peu accélérer en intercalant les lignes ...
        Set FL2 = Workbooks("C2.xls").Sheets("Feuil2")
    
        Application.EnableEvents = False 'annule provisoirement les macro qui pourraient-êtres dans les événements de feuilles.
        Application.ScreenUpdating = False ' annule provisoirement la mise à jour de l'affichage.
    
    
        For K = 2 To FL1.Range("E65536").End(xlUp).Row

    et...

        Application.EnableEvents = True
        Application.ScreenUpdating = True
    End Sub

    0
    1. Ok je vais essayer ça, pour le coup 16 000 x 300 j'avais bien compris que sa serai long, mais je pensais pas que j'en aurais pour 30 min :s sa me parait toujours énormes.

      autre question, quand il y a :

      fl1.range("E65536").end(xlUp).row

      tu par cours de la derniere ligne à la premiere ?
      ou c'est la meme chose qu'une boucle loop qui compte les lignes ?
      derniere chose,

      sur un des classeur j'ai des nom et prémon les un en dessous des autres,
      j'arrive pas a faire
      If activecell.value<> ..... alors next K j'ai essayer ac un petit goto, mais il compte toute les lignes....
      0
  5. Contributeur
    fl1.range("E65536").end(xlUp).row
    Exact, sauf que c'est une fonction Excel VBA et le résultat est pratiquement immédiat.
    Pour ta 2ém question, j'ai pas compris.
    0
    1. Pour ma 2nd questions, c'est pas très grave, j'en ai une un peu plus interressante à posé avant de cloturer la demande.

      Suite à ton petit code, j'ai cherché à mettre en variable le nom d'un fichier.
      c'est à dire que FL2 est un classeur renouveller chaque mois avec un nom different.
      j'ai tester avec Workbooks.Open:=FP
      mais ça ne passe pas as-tu une idée ?

      ps : Dim FP as String

      Merci
      0
  6. Contributeur
    Dim FP as string
    FP= "C:\Répertoir\SousRépertoir\NomFichier.xls" 'Le chemin complet + nom + extention
    Workbooks.Open (FP)
    et pour sauver c'est
    Workbooks(FP).Save 'mais là, le nom et l'extention suffisent.
    A+
    0
    1. Contributeur
      Essaie cette macro, elle devrait être sensiblement plus rapide.
      Sub VB12()
      Dim K As Long, J As Long, Plage() As String
      Dim Cherch As String, Ligne As Long, Lig As Long
      Dim FL1 As Worksheet
      Dim FL2 As Worksheet
      
          'annule provisoirement les macro qui pourraient-êtres dans les événements de feuilles.
          Application.EnableEvents = False
          'annule provisoirement la mise à jour de l'affichage.
          Application.ScreenUpdating = False
          
          Set FL1 = Workbooks("C1.xls").Sheets("Feuil1") 'Destination
          Set FL2 = Workbooks("C2.xls").Sheets("Feuil2") 'origine
      
          Lig = FL2.Range("A65536").End(xlUp).Row
          Ligne = FL1.Range("E65536").End(xlUp).Row
          
          ReDim Plage(2 To Lig)
          For J = 2 To Lig: Plage(J) = FL2.Cells(J, 1): Next
          
          For K = 2 To Ligne
              Cherch = FL1.Cells(K, 5)
              For J = 2 To Lig
                  If Cherch = Plage(J) Then
                      FL2.Cells(J, 2).Copy FL1.Cells(K, 7)
                      Exit For
                  End If
              Next J
              DoEvents
          Next K
          Application.EnableEvents = True
          Application.ScreenUpdating = True
      
      End Sub

      Tu dit..
      0
      1. Salut,

        Je te remercie pour tes services, c'est cool, pas de bug, mes questions sont résolues ^^

        A+
        0