VBA - Appliquer une WorksheetFunction à une partie d'un tableau dynamique
Bonjour,
Je cherche à appliquer une WorksheetFunction à une partie d'un tableau dynamique.
Je récupère une plage de cellule dans un tableau dynamique.
'=================== Récupère données brutes dans tableau ===========================================================
Derniere_Ligne = Sheets("Données brutes").Cells(Rows.Count, 1).End(xlUp).Row 'détermine la dernière ligne des données brutes
Derniere_Colonne = Sheets("Données brutes").Cells(1, Columns.Count).End(xlToLeft).Column 'détermine la dernière données des données brutes
Dim tableauDonnéesBrutes() 'Créer un tableau de données brutes
ReDim tableauDonnéesBrutes(Derniere_Ligne - 1, Derniere_Colonne - 1) 'dimensionne le tableau selon la taille des données brutes
'Rempli le tableau
For i = 1 To Derniere_Ligne
For y = 1 To Derniere_Colonne
tableauDonnéesBrutes(i - 1, y - 1) = Sheets("Données brutes").Cells(i, y).Value
Next
Next
Puis, je souhaite réaliser des calculs mathématique sur une partie des données récupérées. Par exemple :
Max = WorksheetFunction.Max(WorksheetFunction.Index(tableauDonnéesCorrigées, 10 à 50, 2 à 8))
J'arrive actuellement à réaliser ces calculs en utilisant des boucles, mais cela est très long, ou en passant par d'autre tableau, mais cela alourdi le code.
Savez vous s'il est possible de définir une plage d'un tableau afin de l'exploiter ?
Merci d'avance.
Cordialement.
Bonjour,
Voici un essai en utilisant un tableau structuré :
sub avecuntableaustructure()
with range("montableaustructuré") '<<< ADAPTER NOM !
valmax = WorksheetFunction.Max(.offset(9, 1).resize(41, 7))
end with
end subSachant que ce qui bloquait dans votre essai était l'utilisation de INDEX...
Cdlt,
Bonjour,
Merci beaucoup pour votre retour.
Je n'arrive pas à adapter votre solution. J'ai un message d'erreur sur l'objet "Range". En effet, le tableau que j'utilise est une variable et non pas un tableau structuré.
Voici ce que j'ai essaye.
Sub tableau()
'=================== Récupère données brutes dans tableau ===========================================================
Derniere_Ligne = Sheets("Données brutes").Cells(Rows.Count, 1).End(xlUp).Row 'détermine la dernière ligne des données brutes
Derniere_Colonne = Sheets("Données brutes").Cells(1, Columns.Count).End(xlToLeft).Column 'détermine la première données des données brutes
Dim tableauDonnéesBrutes() 'Créer un tableau de données brutes
ReDim tableauDonnéesBrutes(Derniere_Ligne - 1, Derniere_Colonne - 1) 'dimensionne le tableau selon la taille des données brutes
'Rempli le tableau
For i = 1 To Derniere_Ligne
For y = 1 To Derniere_Colonne
tableauDonnéesBrutes(i - 1, y - 1) = Sheets("Données brutes").Cells(i, y).Value
Next
Next
Dim valmax As Double
With Range(tableauDonnéesBrutes) '<<< ADAPTER NOM !
valmax = WorksheetFunction.Max(.Offset(2, 2).Resize(1, 1))
End With
MsgBox (valmax)
End SubCordialement.
Re Kerb,
Oui, j'ai bien compris que vous utilisiez des variables. Mais justement, ce que je propose, c'est d'utiliser les fonctionnalités utiles (et fondamentales !?!) d'Excel.
Au lieu de rechercher la dernière ligne, la dernière colonne, de boucler pour récupérer les valeurs, on met les données sous forme de tableau structuré et on s'en sort avec une petite ligne de code (enfin presque^^).
Sinon, si je me base sur votre essai premier, il est possible d'alimenter le tableau directement (sans boucle). Ensuite, on peut créer un autre tableau pour ne prendre que les items qui nous intéressent (lignes 10 à 50, colonnes 2 à 8). Et on calcule le max dessus (j'ai un petit doute, n'ayant jamais essayé, mais je crois que max fonctionne sur un tableau à 2 dimensions).
Index ne fonctionnera pas ici (et sur feuille non plus)...
Mais selon moi, l'utilisation du tableau structuré est la meilleure façon car ça servira à améliorer/simplifier le code et les opérations sur la feuille...
Cdlt,
Bonjour,
Merci pour votre retour.
Le tableau structuré ne répond pas à mon besoin par sa présentation et sa lourdeur dans le traitement des calculs. Le bout de code présenté ne prend pas en compte les multiples traitement sur les données.
J'utilise actuellement des sous tableau à deux dimensions et la fonctionnalité WorksheetFunction. Mais pour alléger la présentation et la vitesse d'exécution de la macro, je cherche un moyen de sélectionner directement une plage dans le tableau de base.
Cordialement.
Bonjour Kerb,
Sa lourdeur ? Non, ce n'est pas plus lourd...
Voici un essai sans tableau structuré (j'ai mis les lignes de détermination des dernières ligne et colonne en commentaires car elles ne servent à rient dans le code) :
Sub tableau()
with Sheets("Données brutes")
'dl = .Cells(.Rows.Count, 1).End(xlUp).Row 'détermine la dernière ligne des données brutes
'dc = .Cells(1, Columns.Count).End(xlToLeft).Column 'détermine la première données des données brutes
with .cells(1, 1)
valmax = WorksheetFunction.Max(.Offset(9, 1).Resize(41, 7))
End With
end with
MsgBox (valmax)
End SubCdlt,