Je bloque pour copier coller

Nathan

XLDnaute Nouveau
J'essaie de créer un copie conditionnelle, j'y suis presque arrivé, problème les lignes sont en position 1260 à 1300, du coup j'ai rajouter un j, mais depuis cela ne fonctionne plus. D'autre part lorsque je met un end if vba me dit que je n'ai pas de boucle IF.

Sub Envo()

Dim i As Integer
Dim j As Integer

Workbooks.Open ("C:\Nath\Suivi Batches\2011 - W09 - IED IOSIS.xls")

j = 2

For i = 1000 To 2000

If Workbooks("2011 - W09 - IED IOSIS.xls").Worksheets("HK").Cells(i, 5).Value = "57" Then Workbooks("Classeur3.xls").Worksheets("Feuil1").Cells(j, 1).Value = Workbooks("2011 - W09 - IED IOSIS.xls").Worksheets("HK").Range("J" & i).Value
j = j + 1
End If

Next i


End Sub
 

Dranreb

XLDnaute Barbatruc
Re : Je bloque pour copier coller

Il n'y a pas lieu de mettre un End If derrière un If dont le Then est directement suivi d'une instruction sur la même ligne: VBA considère que tout ce qui est séparé de ":" sur la même ligne ou avec " _" de continuation est à exécuter si la condition est vraie. Si plusieurs ligne de codes soumises à la condition, détacher la première instructon après le Then sur une nouvelle ligne et laisser le End If.
(pas de bonjour ni d'À+ ? me dérange pas j'en mets pas non plus c'est tout.)
 

Nathan

XLDnaute Nouveau
Re : Je bloque pour copier coller

Je voudrais aussi copier les cellules des colonnes M,R,S,T des même ligne.

j'ai essayé une fonction else mais ça ne fonctionne pas

Sub Envo()

Dim i As Integer
Dim j As Integer
j = 2

Workbooks.Open ("C:\Nath\Suivi Batches\2011 - W09 - IED IOSIS.xls")

For i = 1000 To 2000

If Workbooks("2011 - W09 - IED IOSIS.xls").Worksheets("HK").Cells(i, 5).Value = "57" Then
Workbooks("Classeur3.xls").Worksheets("Lot 57").Range("A" & j).Value = Workbooks("2011 - W09 - IED IOSIS.xls").Worksheets("HK").Range("J" & i).Value
j = j + 1
End If
Next i


End Sub
 

Dranreb

XLDnaute Barbatruc
Re : Je bloque pour copier coller

Moi, chaque fois que j'utilise plus d'une fois un "Workbooks("2011 - W09 - IED IOSIS.xls").Worksheets("HK")" dans un module je fais :
VB:
Dim FHK As Worksheet, FLot57 As Worksheet
...
Set FHK = Workbooks("2011 - W09 - IED IOSIS.xls").Worksheets("HK")
Set Lot57 = Workbooks("Classeur3.xls").Worksheets("Lot 57")
...
If FHK.Cells(i, 5).Value = "57" Then
   Lot57.Range("A" & j).Value = FHK.Range("J" & i).Value
...
 

Nathan

XLDnaute Nouveau
Re : Je bloque pour copier coller

C'est bon j'ai fait comme tu m'as dit et le code est beaucoup plus propre et facile à lire.

Sub Envo()

Dim i As Integer
Dim j As Integer
j = 2
Dim FHK As Worksheet, FLot57 As Worksheet

Workbooks.Open ("C:\Nath\Suivi Batches\2011 - W09 - IED IOSIS.xls")

Set FHK = Workbooks("2011 - W09 - IED IOSIS.xls").Worksheets("HK")
Set Lot57 = Workbooks("Classeur3.xls").Worksheets("Lot 57")

For i = 1000 To 2000

If FHK.Cells(i, 5).Value = "57" Then
Lot57.Range("A" & j).Value = FHK.Range("J" & i).Value
Lot57.Range("B" & j).Value = FHK.Range("M" & i).Value
Lot57.Range("C" & j).Value = FHK.Range("R" & i).Value
Lot57.Range("D" & j).Value = FHK.Range("S" & i).Value
Lot57.Range("E" & j).Value = FHK.Range("T" & i).Value
Lot57.Range("F" & j).Value = FHK.Range("W" & i).Value
Lot57.Range("G" & j).Value = FHK.Range("X" & i).Value
j = j + 1
End If
Next i


End Sub
 

Dranreb

XLDnaute Barbatruc
Re : Je bloque pour copier coller

C'est bien. Mais j'ai commis une erreur qui serait apparue si le module portait "Option Explicit" en tête.
C'est à mon avis plus une assistance utile qu'une contrainte qu'on s'impose.
J'ai déclaré FLot57 avec un F comme feuille devant alors que j'utilise Lot57. Le plus simple est d'enlever le F dans la déclaration.

D'autre part après une ouverture, le classeur ouvert devient le classeur actif. Donc :
VB:
Set FHK = Workbooks("2011 - W09 - IED IOSIS.xls").Worksheets("HK")
peut être remplacé par
VB:
Set FHK = ActiveWorkBook.Worksheets("HK")
 
Dernière édition:

Nathan

XLDnaute Nouveau
Re : Je bloque pour copier coller

C'est bon j'ai réussi cette manipulation, par contre j'ai un nouveau problème : à partir du classeur3, je vais chercher dans un nouveau doc qui fait plus de 12000 lignes d'autre données, problème je doit trouver dans ces 12000 ce qui corresponde au nom de document, donc voici ma procédure

PHP:
Sub RECUP_WBS()

Dim i As Integer
Dim j As Integer
Dim WBS As Worksheet, Lot57 As Worksheet


Workbooks.Open ("C:\Nath\Suivi Batches\2011-03-03 - Documents with WBS NI1-L_2011_03_03.xls")

Set WBS = ActiveWorkbook.Worksheets("Feuil1")
Set Lot57 = Workbooks("Classeur3.xls").Worksheets("Lot 57")

    For i = 3 To 20000
    For j = 4 To 500
        If WBS.Cells(i, 16).Value = Lot57.Range("A" & j).Value And WBS.Cells(i, 8).Value = Lot57.Range("B" & j).Value Then
        Lot57.Range("H" & j).Value = WBS.Range("W" & i).Value
        Lot57.Range("I" & j).Value = WBS.Range("V" & i).Value
        End If
        Next j
    Next i
    
End Sub

Le problème est que lorsque je lance cette macro cela plante le pc je pense que c'est trop gros.
je vois bien un solution pour raccourcir qui est d'utiliser une autre colonne dans laquelle je cherche la valeur "HK" ce qui devrait reduire à peut etre 2000 lignes.
Mais je ne sais pas comment utiliser cela.
 

Nathan

XLDnaute Nouveau
Re : Je bloque pour copier coller

C'est bon j'ai réussi à faire tourner ma macro, je ne sais pas si c'est la meilleure façon mais en tout cas ça tourne! :)

PHP:
Sub RECUP_WBS()

Dim i As Integer
Dim j As Integer
Dim WBS As Worksheet, Lot57 As Worksheet


Workbooks.Open ("C:\Nath\Suivi Batches\2011-03-03 - Documents with WBS NI1-L_2011_03_03.xls")

Set WBS = ActiveWorkbook.Worksheets("Feuil1")
Set Lot57 = Workbooks("Classeur3.xls").Worksheets("Lot 57")

    For i = 3 To 20000
        If WBS.Cells(i, 12).Value = "HK" Then
            For j = 4 To 500
            If WBS.Cells(i, 16).Value = Lot57.Range("A" & j).Value And WBS.Cells(i, 8).Value = Lot57.Range("B" & j).Value Then
            Lot57.Range("H" & j).Value = WBS.Range("W" & i).Value
            Lot57.Range("I" & j).Value = WBS.Range("V" & i).Value
            End If
            Next j
        End If
    Next i
        
End Sub
 

Dranreb

XLDnaute Barbatruc
Re : Je bloque pour copier coller

Oui, comme je le disais dans un autre fil, ce que vous avez écrit est la pire configuration en terme de performance: multiplier les requêtes à Excel dans une boucle qui tourne 10000000 fois, sans demander aucun travail intelligent ni à Excel ni presque à VBA !
Il vaudrait mieux réserver une colonne de travail dans Lot57, y mettre d'un seul coup une formule de la forme
Code:
=MATCH(" & Rg1.Address(External:=True) & "," & Rg2.Address(External:=true) & ",0)'
en déclarant Rg1 et Rg2 comme Range et en les initialisant de façon appropriée. Quant aux colonnes à renseigner, mettez y
Code:
=INDEX((" & Rg1.Address(External:=True) & ",$X:$X,W)
Si lX est la colonne où vous avez mis l'EQUIV, ensuite figez les Value et effacer l'EQUIV.
Ouf ! J'aurais plus vite fait de le programmer que de l'écrire je crois...
Si seulement j'avais des bouts de fichiers...

Bonne soirée, je m'en vais du boulot.
 
Dernière édition:

Nathan

XLDnaute Nouveau
Re : Je bloque pour copier coller

Bonjour,

J'ai essayé d'envoyer des bouts de fichiers, mais ils sont trop gros et le réseau de mon entreprise bloque les serveurs d'upload.
Je vais donc essayer de comprendre le dernier message.

Merci de votre aide
 
Dernière édition:

Nathan

XLDnaute Nouveau
Re : Je bloque pour copier coller

Alors étant donné que je ne peux envoyer mes fichiers, j'aurais quelques questions :
Il vaudrait mieux réserver une colonne de travail dans Lot57, y mettre d'un seul coup une formule de la forme
Code:
=MATCH(" & Rg1.Address(External:=True) & "," & Rg2.Address(External:=true) & ",0)'
en déclarant Rg1 et Rg2 comme Range et en les initialisant de façon appropriée.

Dans mon lot57, je rajoute une colonne avec la fonction match, mais moi je compare 4 colonnes ( 2 colonnes par document, est ce possible?) , et pour déclarer rg1 et rg2 en range, comment fait on?

Merci
 

Dranreb

XLDnaute Barbatruc
Re : Je bloque pour copier coller

Bonjour,
On déclare les range comme n'importe quelle autre variable en mettant As Range comme type.
On peut ensuite utiliser l'instruction Set pour y affecter un objet Range rendu par une méthode Excel.
C'est exactement comme pour les WorkSheet et d'ailleurs aussi pour la quasi totalité des entités Excel.

Il serait intéressant d'affecter des noms à vos plages impliquées pour rendre les macros indépendantes des adresses exactes des plages, et pour clarifier tant les opérations faites en VBA que les formules.

Ah oui, vous cherchez une combinaison de deux colonnes, je n'avais pas vu. Il faudrait les concaténer dans une colonne unique pour pouvoir utiliser Match.

P.S. Ne pourriez vous vraiment pas bricoler un petit classeur muni d'une copie des feuilles des deux classeurs en ne laissant qu'une vingtaine de lignes du plus gros et 6 ou 7 de l'autre ?

À+
 
Dernière édition:

Nathan

XLDnaute Nouveau
Re : Je bloque pour copier coller

J'ai réussi à réduire les fichiers
Donc voici les trois fichiers car je ne comprend pas bien ou je doit écrire les choses.
 

Pièces jointes

  • Copie de 2011-03-03 - Documents with WBS NI1-L_2011_03_03bis.zip
    2 KB · Affichages: 21
  • Copie de 2011 - W09 - IED IOSIS.zip
    3.2 KB · Affichages: 18
  • copie de Classeur3.zip
    19.5 KB · Affichages: 24

Statistiques des forums

Discussions
312 683
Messages
2 090 914
Membres
104 695
dernier inscrit
akke