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 Sub

quelques 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 = Plg2

si le nombre de lignes du tableau est > 32765

en

Range("A1:A" & UBound(Plg2, 1)) = Plg2

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

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) = SEPARLIG

SEPARLIG 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 Sub

Merci beaucoup pour l'aide et les explications apportées.

Tout fonctionne nickel !

Bonne journée

Dan

Rechercher des sujets similaires à "utilisation variables tableau"