Rechercher : dans
Par :

Boucle à 2 variable?

Dernière réponse le 19 aoû 2008 à 10:13:19 Pawn, le 7 aoû 2008 à 10:22:18 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « Boucle à 2 variable? » dans :
[PHP] Les ressemblances à ne pas confondre VoirIntroduction Concaténation ou paramètres ? Guillemets/Apostrophe Structure require/include isset vs empty htmlentities ou htmlspecialchars ? Nombre de signes égal Introduction Cette astuce présente plusieurs fonction ou astuces en...
Les variables en C++ VoirLes variables en C++ 1. Les différents types de variables 1.1 bool 1.2 char 1.3 unsigned short int 1.4 short int 1.5 unsigned long int 1.6 long int 1.7 int (16 bits) 1.8 int (32 bits) 1.9 unsigned int (16 bits) 1.10 unsigned int (32...
[Shell] Tester une variable numérique VoirTester une variable numérique    Préambule Dans un environnement "shell", les variables sont, par défaut, de type "chaîne de caractères". De ce fait il n'est pas possible de déclarer une variable de type "entier" (enfin, ceci n'est pas tout à...

1

ddez, le 7 aoû 2008 à 14:02:10

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 

Répondre à ddez

4

Pawn, le 7 aoû 2008 à 15:41:31

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 ....

Répondre à Pawn

5

Pawn, le 7 aoû 2008 à 16:40:52

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

Répondre à Pawn

6

ddez, le 7 aoû 2008 à 16:47:30

Ha oui ...
Quand on code, on évite au maximum les caractères spéciaux, les accents ...

Répondre à ddez

7

Pawn, le 8 aoû 2008 à 08:59:38

Salut, 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.

Répondre à Pawn

2

Polux31, le 7 aoû 2008 à 14:05:22

Bonjour,

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

;o) «Ce que l'on conçoit bien s'énonce clairement, Et les mots p­our le dire arrivent aisément.» 
Nicolas Boileau

Répondre à Polux31

3

Pawn, le 7 aoû 2008 à 15:23:31

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 "

Répondre à Pawn

8

lermite222, le 8 aoû 2008 à 10:14:53

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+
L'expérience instruit plus sûrement que le conseil. (André Gide)  

Répondre à lermite222

9

Pawn, le 11 aoû 2008 à 15:04:39

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

Répondre à Pawn

10

lermite222, le 12 aoû 2008 à 09:12:36

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

L'expérience instruit plus sûrement que le conseil. (André Gide)  

Répondre à lermite222

11

Pawn, le 13 aoû 2008 à 09:22:52

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....

Répondre à Pawn

12

lermite222, le 13 aoû 2008 à 13:51:20

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. L'expérience instruit plus sûrement que le conseil. (André Gide)  
Si tu te cogne à un pot et que ça sonne creux, c'est pas forcement le pot qui est vide. ;-)(Confucius)

Répondre à lermite222

13

Pawn, le 13 aoû 2008 à 16:19:08

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

Répondre à Pawn

14

lermite222, le 13 aoû 2008 à 17:36:11

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+ L'expérience instruit plus sûrement que le conseil. (André Gide)  
Si tu te cogne à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)

Répondre à lermite222

15

lermite222, le 14 aoû 2008 à 08:04:09

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..
L'expérience instruit plus sûrement que le conseil. (André Gide)  
Si tu te cogne à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)

Répondre à lermite222

16

 Pawn, le 19 aoû 2008 à 10:13:19

Salut,

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

A+

Répondre à Pawn
Collection CommentÇaMarche.net