Création tableau dynamique

Bonjour à tous,

Je me permets de poster sur ce forum car mes (très légères) connaissances en VBA ne me permettent pas de trouver réponse à ma question.

J'essaie actuellement de créer un tableau dynamique à partir de données stockées dans un fichier Excel (8 colonnes, et un nombre variables de lignes). Pour l'instant, je créé mon tableau de la manière suivante :

Dim tab_impulsion()
Dim nmbr_ligne, last_line As Long

Sub CréationTableau()

    nmbr_ligne = Range("A1").End(xlDown).Row - 1

    last_line = nmbr_ligne - 1

    ReDim tab_impulsion(last_line, 7)

    For i = 0 To last_line

        tab_impulsion(i, 0) = Range("A" & i + 2)
        tab_impulsion(i, 1) = Range("B" & i + 2)
        tab_impulsion(i, 2) = Range("C" & i + 2)
        tab_impulsion(i, 3) = Range("D" & i + 2)
        tab_impulsion(i, 4) = Range("E" & i + 2)
        tab_impulsion(i, 5) = Range("F" & i + 2)
        tab_impulsion(i, 6) = Range("G" & i + 2)
        tab_impulsion(i, 7) = Range("H" & i + 2)

    Next i

End Sub

Ce code fonctionne, mais on m'a demandé de ne pas déclaré le tableau colonne par colonne, mais plutôt dans son ensemble pour que cela soit plus rapide (sur une plage entière). Malheureusement, je n'arrive pas à l'écrire d'une autre manière. J'aimerais donc savoir si quelqu'un pouvait m'aider !

Merci d'avance à ceux qui prendront le temps de se pencher sur mon problème !

Bonjour et bienvenu(e),

Si tu veux une aide adaptée, il faut joindre un fichier Excel et nous pourrons alors intervenir.

Cdlt.

Hello LAZARUS,

Une solution ultra simple qui pourrait te convenir:

Cas où tu sais la première et dernière colonne mais pas le nombre de lignes

Public Sub LAZARUS()
Dim nbLigne As Long
nbLigne = Sheets("Feuil1").Cells(Rows.Count, "A").End(xlUp).Row
Dim monTableau() As Variant
monTableau = Range("A1:C" & nbLigne)
End Sub

Cas où tu sais la plage à utiliser:

Public Sub LAZARUS()
Dim monTableau() As Variant
monTableau = Range("A1:C25")
End Sub

Merci pour votre réponse rapide.

d3d9x, ta solution semble marcher. Personnellement, j'avais essayé avec :

tab_impulsion = Range(Cells(2, 1), Cells(last_line, 8))

Malheureusement, aussi bien avec ta proposition qu'avec la mienne, le reste de mon code ne marche pas, et je n'arrive pas à trouver où ça coince...

J'ai mis en pièce jointe le fichier Excel qui contient la macro, ça sera peut être plus parlant.

Quand je ne déclare pas le tableau colonne par colonne, le code coince à ce niveau :

    For i = 0 To last_line

        tab_impulsion(i, 1) = Int((tab_impulsion(i, 0) * 24 * 3600) / 15) * 15

    Next i
20test-macro.xlsm (169.97 Ko)

Peux-tu:

  • me joindre le second fichier utilisé (Juste quelques lignes à l'intérieur seront suffisantes)
  • décrire très brièvement ce que le programme est censé faire.

à ce que j'ai pu comprendre, il ouvre un fichier, extrait des données qui sont placées dans les colonnes A,B,C, et ces données sont ensuite post-traitées. Le nombre de colonnes est toujours le même (A->H) et le post-traitement envoyé dans la fueille "Verif". Correcte?

EDIT: ce que tu peux déjà essayer, c'est remplacer

For i = 0 To last_line

        tab_impulsion(i, 1) = Int((tab_impulsion(i, 0) * 24 * 3600) / 15) * 15

Next i

Par

For i = LBound(tab_impulsion,1) To UBound(tab_impulsion,1)

        tab_impulsion(i, 1) = Int((tab_impulsion(i, 0) * 24 * 3600) / 15) * 15

    Next i

Dans l'idée c'est ça !

Je cherche à récupérer les données contenu dans un fichier au format .txt et à les traiter.

Pour ça, comme il s'agit de fichier qui seront très volumineux, je veux les récupérer sous la forme d'un tableau dynamique.

Pour y arriver, je pars de mon fichier Excel. Avec ma macro, j'ouvre le fichier texte dans une nouvelle feuille que je créé spécialement pour ça dans mon Excel de traitement. Une fois les données collées dans cette feuille, je créé le tableau (qui fait toujours 7 colonnes, mais dont le nombre de ligne est variable), puis je supprime la feuille créée.

Ensuite, je traite mes données. Pour finir, je les colle dans la feuille "Verif" qui me sert donc à vérifier les résultats que j'obtiens (cette partie sera supprimée quand le code sera totalement finit).

Pour ce que tu me proposes d3d9x, ça bug toujours au même endroit; il m'indique que "l'indice n'appartient pas à la sélection".

Du coup, j'ai rajouté en PJ un exemple de fichier .txt (très light).

1503032016.zip (6.17 Ko)

J'ai quelques soucis d'importation de données (les données ne s'importent pas correctement) mais voilà du code pour lequel les tableaux fonctionnent. ATTENTION, comme je ne peux pas me fier aux données importées ni à ta macro, il faut très certainement revoir les indices dans les tableaux !!!! par exemple If tab_impulsion(0,0) = X pourrait devenir tab_impulsion(1,0)

Fonctions ajoutées à ton fichier:

UBound et Lbound

tableau(1 to 2, 3 to 4)

'L comme Lower -> limite inférieure

Lbound(tableau,1) = 1

Lbound(tableau,2) = 3

'U comme Upper -> limite supérieure

UBound(tableau,1) = 2

UBound(tableau,2) = 4

'Dim tab_impulsion()
Dim tab_resultats()
Dim Fichier_data_txt
Dim nmbr_ligne, last_line As Long
'Dim nmbr_ligne_2, last_line_2 As Long
Dim nom_resultat As String

Sub Test()

    nom_resultat = ActiveWorkbook.Name

'--------------------------------------------------------------------------------------------------------------------------------------------
' Copier/Coller les données du fichier .txt (compteurs) dans une nouvelle feuille Excel à partir de la cellule "A1" de la feuille "Feuil1"
'--------------------------------------------------------------------------------------------------------------------------------------------

    If MsgBox("Continuer ?", vbYesNo, "Demande de confirmation") = vbYes Then

    ' Sélection du fichier data en format .txt

    MsgBox ("Veuillez sélectionner le fichier contenant les données de consommation d'eau et d'électricité.")

    Fichier_data_txt = Application.GetOpenFilename("Text Files (*.txt), *.txt")

        If Fichier_data_txt <> False Then

            ' Créer une nouvelle feuille dans le classeur actif

            ActiveWorkbook.Worksheets.Add

            ' Créer une requête sur le fichier texte et insérer les champs dans la feuille "Feuil1" en partant de "A1"

            ActiveSheet.QueryTables.Add("TEXT;" & Fichier_data_txt, [A1]).Refresh

        Else

            MsgBox "La procédure a été annulée car aucun fichier n’a été sélectionné."
            Exit Sub
        End If
    Else
        Exit Sub
    End If

'--------------------------------------------------------------------------------------------------------------------------------------------
' Récupérer les données compteurs dans un tableau et fermer la nouvelle feuille Excel créée
'--------------------------------------------------------------------------------------------------------------------------------------------

    ' Détermination du nombre de ligne de tab_impulsion

    nmbr_ligne = Range("A1").End(xlDown).Row - 1

    last_line = nmbr_ligne - 1

    Dim tab_impulsion() As Variant
    tab_impulsion = Range("A2:H" & last_line)

    ' Suppression de la nouvelle feuille (sans message)

    Application.DisplayAlerts = False

    ActiveSheet.Delete

    Application.DisplayAlerts = True

'--------------------------------------------------------------------------------------------------------------------------------------------
' Traitement des données temporelles
'--------------------------------------------------------------------------------------------------------------------------------------------

    ReDim tab_resultats(LBound(tab_impulsion, 1) To UBound(tab_impulsion, 1), 7)

    ' Conversion du format date en temps secondes

    For i = LBound(tab_impulsion, 1) To UBound(tab_impulsion, 1)

        tab_impulsion(i, 2) = Int((tab_impulsion(i, 1) * 24 * 3600) / 15) * 15

    Next i

    'Conversion du pas de temps de 0,125 sec au pas de temps de 15 sec

    tab_resultats(1, 0) = tab_impulsion(1, 1)

    ' + 15 sec par rapport à B1 (départ), jusqu'à ce que la Valeur de la colonne B = Valeur de la dernière ligne de la colonne A

    For i = LBound(tab_impulsion, 1) + 1 To UBound(tab_impulsion, 1)

        If tab_resultats(i - 1, 0) < tab_impulsion(UBound(tab_impulsion, 1), 2) Then

            tab_resultats(i, 0) = tab_resultats(i - 1, 0) + 15

        Else

            tab_resultats(i, 0) = ""
            tab_resultats(i - 1, 0) = ""

        End If

    Next i

'--------------------------------------------------------------------------------------------------------------------------------------------
' Récupération des données traitées dans la feuille "Données" du fichier Excel
'--------------------------------------------------------------------------------------------------------------------------------------------

    ' Collage des valeurs du tableau dans le fichier data à partir de la cellule A1 de la feuille "Verif"

    Worksheets("Verif").Select

    Workbooks(nom_resultat).Worksheets("Verif").Range("I1", Cells(last_line, 15)) = tab_resultats
    Workbooks(nom_resultat).Worksheets("Verif").Range("A1", Cells(last_line, 8)) = tab_impulsion

    MsgBox ("Terminé")

End Sub

Merci beaucoup d3d9x, effectivement avec quelques adaptations ton code marche à merveille ! Mille fois merci

J'ai néanmoins une dernière petit question : j'ai remarqué que, du coups, cela avait changé la façon dont les tableaux sont déclarés. Par exemple, pour le tableau tab_impulsion, la valeur inférieur est 1, tandis que pour le tableau tab_resultats la valeur inférieure est 0. J'ai essayé de rajouter un "Option base 0" en tout début de macro mais cela ne semble pas fonctionner... Cela m'arrangerait beaucoup que les deux tableaux commencent à 0.

Ce n'est pas possible pour la première dimension:

ReDim tab_resultats(LBound(tab_impulsion, 1) To UBound(tab_impulsion, 1), 7)

tab_resultats aura exactement les mêmes dimensions que tab_impulsion en terme de lignes. L'indice de la première ligne et de la dernière ligne sera le même dans les deux cas.

Donc si on a tab_impulsion(1 to 10, ....) on aura également tabl_resultats(1 to 10,...)

Maintenant si tu veux également que la seconde dimension soit la même, il suffit de remplacer

, 7) par ,LBound(tab_impulsion, 2) To UBound(tab_impulsion, 2))

Ce qui donne

ReDim tab_resultats(LBound(tab_impulsion, 1) To UBound(tab_impulsion, 1),LBound(tab_impulsion, 2) To UBound(tab_impulsion, 2))

Attention, les tableaux ne commenceront pas par 0. Pourquoi? Peut-etre car les données sont issues d'un range, et qu'un numéro de ligne/colonne ne peut pas valoir 0. Comment le changer facilement? Je ne sais pas...

Pour ma part je trouve ça plus parlant d'être en base 1.

Encore une fois merci.

Commencer par 0 m'aurait facilité la tache pour la suite du code que j'avais commencé à écrire, mais tant qu'à faire si j'ai (grâce à toi) un code qui marche comme il est et que mes tableaux commencent tous les deux à 1 je vais laisser comme ça

Rechercher des sujets similaires à "creation tableau dynamique"