Optimisation rapidité de transfert

coco_lapin

XLDnaute Impliqué
Bonjour le forum.

J'ai souvent des transferts de données à effectuer et je suis à la recherche de la méthode la plus rapide.

Pour cela j'utilise le principe de la triple boucle décrit ci-dessous.

Ceci pourrait se faire en placant les données dans des tableaux, je crois que cette méthode serait alors plus rapide mais ne n'ai pas l'habitude d'utiliser les tableaux.

Sur mon PC le classeur est traité en 4 secondes environ (d'ailleurs il serait interessant de placer un compteur dans la macro ce qui permettrait de comparer les differentes méthodes mais ceci non plus je ne sais pas faire, mais c'est secondaire).

Je vous joins le classeur en annexe. [file name=bouclerapide.zip size=20041]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/bouclerapide.zip[/file]

Message édité par: coco_lapin, à: 14/01/2006 19:24
 

Pièces jointes

  • bouclerapide.zip
    19.6 KB · Affichages: 20

myDearFriend!

XLDnaute Barbatruc
Bonsoir coco_lapin, le Forum

Dans l'exemple ci-joint une façon de faire.

J'ai utiliser la procédure ci-dessous :
Sub transfert2()
Dim TabTemp As Variant, TabTemp2 As Variant
Dim
F1 As String, F2 As String
Dim
i As Integer, j As Byte, k As Byte
      F1 = 'Feuil1'
      F2 = 'Feuil2'
      'Effacer les données feuille 2
      Sheets(F2).Range('2:65536').Delete
      'Charge les données dans un tableau variant temporaire
      TabTemp = Sheets(F1).UsedRange.Cells.Value
      'Prépare le tableau variant conteneur des résultats
      With Sheets(F2)
            TabTemp2 = .Range(.Cells(1, 1), .Cells(UBound(TabTemp, 1), UBound(TabTemp, 2))).Value
      End With
      'Traitement (de tableau variant à tableau variant)
      For i = 2 To 428
        For j = 1 To 16
            If TabTemp(i, j) DIFFERENT DE '' Then
              For k = 1 To 16
                  If TabTemp(1, j) = TabTemp2(1, k) Then
                    TabTemp2(i, k) = TabTemp(i, j)
                    Exit For
                  End If
              Next k
            End If
        Next j
      Next i
      'MAJ de la feuille 2
      With Sheets(F2)
            .Range(.Cells(1, 1), .Cells(UBound(TabTemp2, 1), UBound(TabTemp2, 2))).Value = TabTemp2
      End With
End Sub


Remplacer l'expression DIFFERENT DE par les sigles 'Inférieur à' et 'Supérieur à' car ces 2 sigles consécutifs ne s'affichent plus dans les posts du Forum...
(je n'ai pas trouvé de différence notoire en utilisant là ScreenUpdating ou en désactivant le calcul automatique par exemple).
Cela dit, dans un tel cas de figure, je me demande si un traitement par colonne entière ne serait pas plus rapide que cette méthode élément par élément...

Tu trouveras également dans cet exemple une fonction pour te permettre de comparer les temps de traitement :
Private Sub Temps(Optional Debut As Boolean)
Static T As Single
      If Debut Then
            T = Timer
            Exit Sub
      Else
            T = Timer - T
      End If
      MsgBox 'Durée : ' & T & ' secondes.'
End Sub
Cordialement, [file name=PourCocoLapin.zip size=30003]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/PourCocoLapin.zip[/file]
 

Pièces jointes

  • PourCocoLapin.zip
    29.3 KB · Affichages: 12

coco_lapin

XLDnaute Impliqué
Bonsoir myDearFriend!

Je te remercie pour ta réponse et tes commentaires.

J'ai parcouru ton code, c'est ce qu'il me faut.

C'est pas étonnant puisque cela vient de toi. J'ai parcouru déjà quelques uns des fils que tu traites et généralement tu fais 'mouche' tout de suite.

Je vais décortiquer pour bien assimiler et voir l'impact sur les temps de réponses.

Attention mes données sont du pipo (et pour aller plus vite j'ai copié collé des lignes et elles sont quasiment toutes identiques) ce qui t'as peut être conduit en erreur sur une méthode potentielle de traitement par colonne. Ou bien je n'ai pas compris ton commentaire.

Encore merci.

Je viens de tester (ce dimanche matin), j'ai gagné un rapport 65 sur la rapidité de la boucle. C'est impressionnant. Merci.

Message édité par: coco_lapin, à: 14/01/2006 21:22

Message édité par: coco_lapin, à: 15/01/2006 08:34
 

Discussions similaires

Statistiques des forums

Discussions
312 520
Messages
2 089 276
Membres
104 083
dernier inscrit
hecko