Opération sur une partie d'une variable tableau VBA

Bonjour,

Je cherche à optimiser une macro qui fonctionne sur une base de données de taille conséquente et je m'intéresse dans la cas présent à l'utilisation de variables tableau plutôt que de travailler (comme actuellement) en direct sur la plage de données.

Est-il possible de faire des opérations sur une partie d'un tableau et pas la totalité, du type Application.Sum(MaTab(5:25)) ? Sinon, comment s'en sortir pour faire ça ? Il faut créer un sous tableau ?

Bonjour Pedro,

Pour faire une Somme tu peux faire une boucle parcourant ton tableau de type :

Somme = 0

For i = 5 to 25

Somme = Somme + Tableau(i)

Next i

Après ça peut devenir pénible si tu dois faire des choses plus compliquées qu'une Somme par exemple.

Sinon je ne connais pas de fonction pour n'utiliser qu'une partie de tableau, je pense en effet qu'il faut passer par un autre tableau si nécessaire, avec une fonction qui renvoie une partie de tableau ça doit pouvoir se faire je pense, j'espère t'avoir Aidé...

Le prototype serait quelque chose comme ça d'après moi :

Function SousTab(Byval Tableau as Variant, borneinf1 as single, bornesup1 as single, borneinf2 as single, bornesup2 as single, borneinf3 as single, bornesup3 as single) as Variant

avec les bornes en optionnelles, si elles ne sont pas renseignées, prendre lbound et ubound pour la dimensión concernée.

Salut @Ausecour,

Oui, mais ce serait trop simple si je n'avais qu'une somme à faire ! En réalité je fais des NB.SI.ENS(), MOYENNE.SI.ENS(), SOMME.SI.ENS() et bien d'autres... Mais sur 500 000 lignes ça commence à prendre un peu de temps.

Je vais essayer de me débrouiller pour créer des sous-tableaux en fonction de mes besoins, merci de tes suggestions, j'en prends note.

Bonjour,

Tu mets ta base en tableau, type :

    aa = ActiveSheet.Range("A1").CurrentRegion

à adapter selon ta disposition...

Tu veux par exemple opérer sur une colonne de ce tableau, tu peux extraire la colonne de ce tableau (sous forme de tableau toujours...) :

    ColX = WorksheetFunction.Index(aa, 0, x)

La fonction Index te permet d'en renvoyer une colonne (ou une ligne) sous forme de matrice...

Et tu utilises alors ColX dans les calculs que tu veux opérer sur la colonne...

NB- Index te permet de faire des extractions sélectives. par exemple tu veux récupérer les colonne 3, 5 et 8 de ton tableau de base :

    ExtracLgnY = WorksheetFunction.Index(aa, y, Array(3, 5, 8))

Cordialement.

Très intéressant !

Peut-on imbriquer ce type de fonction pour d'abord sélectionner une (ou plusieurs) colonnes puis procéder ensuite de la même manière pour créer un sous-tableau avec certaines lignes de la/les colonnes précédemment isolée(s) ?

Bonjour,

Ferrand :

Les fonctions de Base de donnée permettent de faire ces opérations de manière beaucoup plus rapide que les fonctions que tu cites sans avoir à se référer à des tableaux réduits.

Après il faut aussi voir la permanence de ces calculs :

Faut-il les renouveler souvent avec des plages variables.

D'autres paramètres peuvent peut-être aussi être pris en compte... Si tu explicites un peu plus la problématique !

Pour résumer, il faut essayer de ne pas exposer le problème avec la seule et pas forcément bonne solution que tu imagines mais en laissant la porte ouverte à toutes les possibilités.

A+

La fonction te permet d'extraire des sous-tableaux. Ensuite je n'ai pas tout essayé... l'utilisation habituelle consiste lorsque tu veux extraire les lignes d'une base répondant à des critères données pour les rassembler ailleurs :

tu extrais ainsi les lignes entières répondant aux conditions, que tu places dans un tableau unidimensionnel.

Au lieu d'avoir en résultat un tableau à 2 dimensions, tu as un tableau à une dimension dont chaque élément contient un tableau. Un tableau de ce type se réaffecte sur une plage par double-transposition.

Par contre, je n'ai pas idée si en tant que tel il offre des possibilités de calcul, chaque élément, lui-même tableau les offrira, mais l'ensemble je ne sais, il faut faire quelques tests.

incise : Salut Galopin !

C'est vrai que je m'étais noté cette idée, au vu d'un de tes posts sur le sujet... Ces fonctions sont méconnues et pourraient certainement rendre pas mal de services.

Ok, la problématique de sous tableaux m'intéresse de façon générale, mais en l’occurrence je cherche à mettre ça en pratique pour ma principale base de données. J'actualise celle-ci quasi quotidiennement à partir de différents fichiers CSV importés par une macro et ajoutés à la suite des données présentes. Ensuite, ces données me servent de support pour un travail de prédiction et de modélisation de variables biologiques.

Je manipule donc les données pour :

  • -> Les mettre en forme
  • -> Filtrer les valeurs aberrantes
  • -> Corriger et ajuster les valeurs non-aberrantes selon certains paramètres
  • -> Calculer puis exporter dans différents onglets des valeurs moyennes, sommes ou médianes pour chaque individu statistique et pour chaque jour
  • -> Prédire les valeurs du lendemain à partir de l'historique de chaque individu
  • -> Utiliser ces prédictions comme données d'entrée de mon modèle et afficher les résultats dans un onglet

En espérant que ce soit plus clair ! Les macros que j'utilise actuellement fonctionnent (et il y a plus d'un millier de lignes de code), mais comme ma base de données devient imposante, j'aimerais optimiser leur fonctionnement pour gagner en rapidité d'exécution.

Je n'ai jamais utilisé les fonctions de base de données, je vais essayer de me former un peu là-dessus, ça m'intéresse !

PS: je passe le sujet en résolu, puisque la proposition de @MFerrand permet de créer un sous-tableau. Pour mon histoire plus spécifique d'optimisation de macro, je travaille ça de mon côté et je reviendrais vous embêter au besoin !

Pour cette problématique :

Calculer puis exporter dans différents onglets des valeurs moyennes, sommes ou médianes pour chaque individu statistique et pour chaque jour.

Exposé comme ça moi je ne vois que 3 calculs (multiplié par le nombre d'individus)

Il faudra expliciter un peu le nombre d'individus ET le chaque jour. (Les calculs doivent-ils être faits chaque jour, ou autre problématique, doivent-il être faits sur une nombre de jours variables selon les individus)

Moi je pense que les Fonctions de base de données couplées à des macros ont des chances d'être plus efficaces que des tableaux que tu vas être obligé de redimensionner et reparcourir en rafale.

Ces fonctions sont moins souples et un peu astreignante à construire. Après une fois construite même si, tu as 2000 individus à évaluer, ça ne prendra pas plus de temps que s'il n'y en a que 5...

Compte tenu de la complexité de la mise au point un échantillon d'un millier de ligne avec une feuille type est indispensable pour illustrer mon propos et un panel de requêtes type avec les résultats pour vérifier ma mise au point.

A+

Pour cette problématique :

Calculer puis exporter dans différents onglets des valeurs moyennes, sommes ou médianes pour chaque individu statistique et pour chaque jour.

Exposé comme ça moi je ne vois que 3 calculs (multiplié par le nombre d'individus)

Il faudra expliciter un peu le nombre d'individus ET le chaque jour. (Les calculs doivent-ils être faits chaque jour, ou autre problématique, doivent-il être faits sur une nombre de jours variables selon les individus)

Moi je pense que les Fonctions de base de données couplées à des macros ont des chances d'être plus efficaces que des tableaux que tu vas être obligé de redimensionner et reparcourir en rafale.

Ces fonctions sont moins souples et un peu astreignante à construire. Après une fois construite même si, tu as 2000 individus à évaluer, ça ne prendra pas plus de temps que s'il n'y en a que 5...

Compte tenu de la complexité de la mise au point un échantillon d'un millier de ligne avec une feuille type est indispensable pour illustrer mon propos et un panel de requêtes type avec les résultats pour vérifier ma mise au point.

A+

Les calculs sont faits chaque jour, sur un nombre de jours variable selon les individus. Je vais faire quelques essais pour tester les fonctions de base de données couplées à des macros, puisque effectivement je risque de devoir manipuler beaucoup de tableaux et sous-tableaux si j'expérimente la solution avec tableaux.

Ce travail étant confidentiel, je vais m'abstenir de poster un échantillon ici pour l'instant, d'autant plus qu'il sera difficile de le garder cohérent et représentatif vidé d'une bonne partie de son contenu.

Merci encore de votre aide @Ausecour, @MFerrand et @galopin01

Pour le fun je te donne un exemple d'un cas solutionné avec les BD**

Il s'agissait d'un comptable d'une grande entreprise qui devait synthétiser un vingtaine de comptes pour les ventiler chaque année entre tous les comptes analytiques et produire un bilan comptable...

A l'origine, il faisiait ça avec des SOMMEPROD et une vingtaine de feuilles de comptes par cas (individus)

Il à vite compris qu'une seule feuilles de compte de plusieurs dizaines voire centaines de milliers de lignes était préférable.

La feuille CALC est la feuille des calculs.

La feuille Décompte une ébauche de bilan annuel

La feuille Var est une feuille de paramètres

Bon... Vu comme ça, ça fait un peu peur !

Mais une fois qu'on a compris le truc et adossé ça à VBA, YAPA photo !

Avant il avait le temps de prendre une pause pendant que la bécane moulinait. Maintenant même plus le temps de s'en griller une...

A+

53exfbd.xlsm (828.97 Ko)
Rechercher des sujets similaires à "operation partie variable tableau vba"