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 SubCe 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 SubCas où tu sais la plage à utiliser:
Public Sub LAZARUS()
Dim monTableau() As Variant
monTableau = Range("A1:C25")
End SubMerci 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
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 iPar
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 iDans 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).
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 SubMerci 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