Utilisation de variables tableau
Bonjour,
Je cherche à utiliser des variables tableau pour accélérer l'exécution des macros.
Ce fichier est un exemple pas forcément représentatif, mais dans l'idée, c'est surtout pour progresser.
Je ne parviens pas à récupérer le tableau après traitement pour le réinsérer sur une feuille Excel.
Je joins le fichier.
Les macros concernées sont courtes (3 fois la même que je fais évoluer) :
For_Next_Plage : sans passer par des variables tableau (beaucoup moins rapide)
For_Next_Plage2 : fonctionne bien, le traitement se passe par une var tableau, mais pas le transfert sur la feuille arrivée ne passe pas par une varialbe tableau
For_Next_Plage3 : c'est la version que j'essaie de faire évoluer, mais sans réussite.
Merci d'avance pour les conseils que vous pourrez m'apporter
Dan
Ci-dessous la macro fonctionnelle
Sub For_Next_Plage2()
Dim FL1, FL2 As Worksheet, Cell As Range, NoCol As Integer, NoLig As Long
Dim DerLig, NL, NC As Long, DerCol As Integer, Var As Variant
Dim Plg As Variant
Dim Cpt As Long
Application.ScreenUpdating = False
Start = Timer
Set FL1 = Worksheets("Donnees")
Set FL2 = Worksheets("Resultat")
FL2.Cells.ClearContents
NL = 1
NC = 1
FL1.Select
'Détermine la dernière ligne renseignée de la feuille de calculs
DerLig = Split(FL1.UsedRange.Address, "$")(4)
'Détermine la dernière colonne renseignée de la feuille de calculs
DerCol = Columns(Split(FL1.UsedRange.Address, "$")(3)).Column
Plg = Range("B4", ColLettre(DerCol) & DerLig).Value
DerLig = UBound(Plg, 1)
DerCol = UBound(Plg, 2)
For NoLig = 1 To DerLig
For NoCol = 1 To DerCol
Var = Plg(NoLig, NoCol)
CompileLigne = CompileLigne & Var
Next
FL2.Cells(NL, NC) = CompileLigne
NL = NL + 1
FL2.Cells(NL, NC) = SEPARLIG
NL = NL + 1
CompileLigne = ""
Next
FL2.Cells(NL, NC) = FERMTAB
FL2.Select
Application.ScreenUpdating = True
MsgBox "Durée du traitement : " & Timer - Start & " secondes"
End Sub
Bonjour Dan et bienvenue sur ce forum ...
Utilise la balise code pour améliorer la lisibilité de ton post ...
Bonjour,
Je cherche à utiliser des variables tableau pour accélérer l'exécution des macros.
Ce fichier est un exemple pas forcément représentatif, mais dans l'idée, c'est surtout pour progresser.
Je ne parviens pas à récupérer le tableau après traitement pour le réinsérer sur une feuille Excel.
Ton fichier ressemble bigrement à du html et un extrait (ou un input) d'une page web.
Du coup je me pose la question de ton besoin !
Si (c'est une supposition) tu cherchais à récupérer un tableau (j'ai d'abord cru que tu souhaitais manipuler des tableaux au sens excel du terme), alors excel le fait très bien au moyen d'une copie dans le presse-papier qui peut s'automatiser en VBA avec un extrait direct et automatique de la page web.
Bonjour et merci pour ta réponse.
En fait dans ce cas précis, j'utilise Excel pour mettre ne forme des tableaux que j'insérerai dans un Wiki.
Excel va me faire gagner beaucoup de temps dans la mise en forme des données qu'il me suffira ensuite de copier/coller dans mon Wiki.
C'est donc bien du code HTML que je manipule, mais dans l'idée, ça pourrait être n'importe quoi. Je cherche juste à comprendre comment utiliser les variables tableau pour obtenir un code plus rapide et mieux réalisé.
bonsoir,
une proposition de correction de ton code Sub For_Next_Plage3
Sub For_Next_Plage3()
Dim FL1, FL2 As Worksheet, Cell As Range, NoCol As Integer, NoLig As Long
Dim DerLig, NL, NC As Long, DerCol As Integer, Var As Variant
Dim Plg As Variant
Dim Cpt As Long
Dim Ligne As String
Dim Plg2()
Application.ScreenUpdating = False
Start = Timer
Set FL1 = Worksheets("Donnees")
Set FL2 = Worksheets("Resultat")
FL2.Cells.ClearContents
FL1.Select
'Détermine la dernière ligne renseignée de la feuille de calculs
DerLig = Split(FL1.UsedRange.Address, "$")(4)
'Détermine la dernière colonne renseignée de la feuille de calculs
DerCol = Columns(Split(FL1.UsedRange.Address, "$")(3)).Column
Plg = Range("B4", ColLettre(DerCol) & DerLig).Value
ReDim Plg2(1 To DerLig, 1 To 1)
DerLig = UBound(Plg, 1)
DerCol = UBound(Plg, 2)
For NoLig = 1 To DerLig
For NoCol = 1 To DerCol
Var = Plg(NoLig, NoCol)
compileligne = compileligne & Var
Next
Plg2(NoLig, 1) = compileligne
compileligne = ""
Next
'Transfère les éléments du tableau dans la feuille de calcul
FL2.Select
Range("A1").Resize(UBound(Plg2, 1) + 1, 1).Value = Plg2
Application.ScreenUpdating = True
MsgBox "Durée du traitement : " & Timer - Start & " secondes"
End Subquelques subtilités
redim plg2(1 to derlig,1) : cette définition du tableau permet d'eviter de devoir utiliser application.transpose lors de la copie du tableau dans la feuille "resultat". (application.transpose se plante si le tableau contient des strings >255 caractères)
il faudra adapter l'instruction
Range("A1").Resize(UBound(Plg2, 1) + 1, 1).Value = Plg2si le nombre de lignes du tableau est > 32765
en
Range("A1:A" & UBound(Plg2, 1)) = Plg2En fait dans ce cas précis, j'utilise Excel pour mettre ne forme des tableaux que j'insérerai dans un Wiki.
Excel va me faire gagner beaucoup de temps dans la mise en forme des données qu'il me suffira ensuite de copier/coller dans mon Wiki.
C'est donc bien du code HTML que je manipule, mais dans l'idée, ça pourrait être n'importe quoi. Je cherche juste à comprendre comment utiliser les variables tableau pour obtenir un code plus rapide et mieux réalisé.
Ok, je te laisse avec "Acide" alors.
Cela m'arrive aussi souvent, mais je n'emploie que des formules excel dans ce cas, jamais de macro ...
Super !
Merci beaucoup h2so4 pour cette proposition qui accélère mon code d'une façon conséquente et pour les explications jointes.
Il y a juste un petit truc qui ne fonctionne pas et que je n'ai pas réussi à régler (pour l'instant, mais j'ai juste fait quelques tests) : toutes les 2 lignes doit se trouver une séparation de ligne représentée par
|-et pour l'instant je n'ai pas réussi à le remettre en place.
J'ai essayé de cette manière :
NoLig = NoLig + 1
Plg2(NoLig, 1) = SEPARLIGSEPARLIG correspondant à "|-"
ce qui affiche bien la séparation de ligne, mais ça supprime une ligne de données sur 2 !
Sûrement une évidence pour toi....
Encore merci pour ton aide
Bonne journée
Dan
bonjour,
une adaptation du code
Sub For_Next_Plage3()
Dim FL1, FL2 As Worksheet, Cell As Range, NoCol As Integer, NoLig As Long
Dim DerLig, NL, NC As Long, DerCol As Integer, Var As Variant
Dim Plg As Variant
Dim Cpt As Long
Dim Ligne As String
Dim Plg2()
Application.ScreenUpdating = False
Start = Timer
Set FL1 = Worksheets("Donnees")
Set FL2 = Worksheets("Resultat")
FL2.Cells.ClearContents
FL1.Select
'Détermine la dernière ligne renseignée de la feuille de calculs
DerLig = Split(FL1.UsedRange.Address, "$")(4)
'Détermine la dernière colonne renseignée de la feuille de calculs
DerCol = Columns(Split(FL1.UsedRange.Address, "$")(3)).Column
Plg = Range("B4", ColLettre(DerCol) & DerLig).Value
ReDim Plg2(1 To DerLig * 2 + 10, 1 To 1)
DerLig = UBound(Plg, 1)
DerCol = UBound(Plg, 2)
For NoLig = 1 To DerLig
For NoCol = 1 To DerCol
Var = Plg(NoLig, NoCol)
compileligne = compileligne & Var
Next
i = i + 1
Plg2(i, 1) = compileligne
i = i + 1
Plg2(i, 1) = SEPARLIG
compileligne = ""
Next
i = i + 1
Plg2(i, 1) = FERMTAB
'Transfère les éléments du tableau dans la feuille de calcul
FL2.Select
Range("A1:A" & i) = Plg2
Application.ScreenUpdating = True
MsgBox "Durée du traitement : " & Timer - Start & " secondes"
End SubMerci beaucoup pour l'aide et les explications apportées.
Tout fonctionne nickel !
Bonne journée
Dan