Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Alléger calcul matriciel

  • Initiateur de la discussion Initiateur de la discussion dieu08
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

dieu08

XLDnaute Occasionnel
[SOMMEPROD] - alléger calcul matriciel

Bonjour,

Grâce à ce forum, j'ai pu mettre en place différentes formules de calculs matriciels sur un tableau de synthèse. Je me suis vite aperçu que ces calculs étaient longs et monopolisaient de la ressource.

Je faisais avec jusque là mais je suis sur un fichier dont la formule de base est :
{=SOMMEPROD((Brutes!$M$2:$M$61007=$AL14)*(Brutes!$E$2:$E$61007=E$1)*(Brutes!$A$2:$A$61007=$A$2)*(Brutes!$K$2:$K$61007))}

Je n'arrive pas au bout, c'est trop long (40 minutes pour 10 cellules).

L'onglet source (62000 lignes) est dans le même fichier. Je ne peux malheureusement pas mettre un fichier exemple car il y a des données nominatives.

La question arrive enfin :

- comment alléger mon système de calcul ? Par un cube OLAP ? Par des requêtes SQL à la place des calculs matriciels ?

(sachant que je n'y connais rien à la création d'un cube via excel)

Je vous remercie déjà de l'aide que vous pourrez m'apporter. 😉

Dieu08
 
Dernière édition:
Re : Alléger calcul matriciel

Re,

Malheureusement, j'ai effectivement 61830 lignes dans mon fichier. Mais il est toujours possible que je le scinde en plusieurs fichiers.

Et oui malheureusement (encore), il arrive assez souvent qu'il y ait des "index bénéficiaire" en double dans mes données.

Dieu08
 
Re : Alléger calcul matriciel

Re,

Ci-joint une nouvelle version.

J'ai créé une requête de comptage (feuille RQT, en H1:H2).

Pour toutes les valeurs positives des montants, la macro va modifier puis exécuter la requête de comptage.

En début de macro, la requête principale est mise à jour.

Les requêtes sont lancées avec le chemin et le nom du fichier, donc rien à modifier dans les macros.

A priori, ça marche, reste à voir les temps de réponse sur un gros fichier et à vérifier si le comptage est correct.

@+

Gael
 

Pièces jointes

Re : Alléger calcul matriciel

C'est un super boulot que tu as fais là Gael ! C'est bien au-delà de ce que j'aurais pu faire seul.

Au lancement de la macro3, j'ai un blocage sur le "With Selection.QueryTable"


Une anomalie de commande ?

Dieu08
 
Re : Alléger calcul matriciel

Bonjour Dieu08, bonjour à tous,

Le module 2 m'a uniquement servi à faire des enregistrements de macros pour récupérer la syntaxe, il ne sert plus à rien, tu peux le supprimer.

Utilise seulement la macro cumul du module 1.

@+

Gael
 
Re : Alléger calcul matriciel

Bonsoir Gaël,

Me revoilà dans le jeu si j'ose dire.

J'ai tenté d'aménager ta requête pour le nombre de valeurs en VB; ce qui donne :


Néanmoins dès que je veux ajouter une condition de type en avant dernière ligne:

& "AND (`Brutes$`.`Mois Traitement Dep#`='1') " & Chr(13) & "" & Chr(10) _

J'ai un message d'erreur "Incompatibilité de type". J'ai un peu cherché sur le net évidemment, et je pensais que c'était une histoire de format de colonne, mais je n'arrive pas à trouver comment passer cette obstacle.

Peux-tu à nouveau m'apporter ton aide ?

Merci.

Dieu08
 
Re : Alléger calcul matriciel

Bonsoir Dieu08, bonsoir à tous,

Essaye en rajoutant une "," comme ci-dessous. Je ne sais pas pourquoi, mais à partir d'une certaine taille de texte, il faut couper avec une ",".

Mets aussi 1 au lieu de `1`.

et supprime les & Chr(13) & "" & Chr(10) inutiles

ça doit donner:

Code:
Sub Macro2()
'
' Macro2 Macro
' Macro enregistrée le 22/12/2008
'
 
'
Worksheets("Feuil1").Select
Range("H1").Select
With ActiveSheet.QueryTables.Add(Connection:=Array(Arra y( _
"ODBC;DSN=Fichiers Excel;DBQ=C:\GD\excel\forum\Dieu08_V3.xls;DefaultD ir=C:\GD\excel\forum;DriverId=790;MaxBufferSize=20 48;PageTimeout" _
), Array("=5;")), Destination:=Range("H1"))
.CommandText = Array( _
"Select DISTINCT count(`Brutes$`.`Index Beneficiaire`)" & Chr(13) & "" & Chr(10) _
& "FROM `" & ThisWorkbook.FullName & "`.`Brutes$` `Brutes$`" & Chr(13) & "" & Chr(10) _
& "WHERE (`Brutes$`.`Unite Territoriale/AGIR`='A')"  _
& "AND (`Brutes$`.Concat1='Accueil familial" , "personne handicapée')" _
& "AND (`Brutes$`.`Mois Traitement Dep#`=1)" 
)
.Name = "RQ2"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
End Sub

@+

Gael
 
Re : Alléger calcul matriciel

Bonjour,

Gaël, j'ai utilisé tes conseils pour faire fonctionner la macro ci-dessous. Mais je peux dire que la syntaxe SQL via VB est d'une rare complexité; je trouve que c'est vraiment très aléatoire en fonction du type de données.

J'ai rarement galéré autant pour faire fonctionner une macro :


Dès que le tout sera finalisé, je t'enverrai le résultat final pour que tu me dises ce que tu en penses (si tu es d'accord évidemment).

Dieu08
 
Re : Alléger calcul matriciel

Bonjour Dieu08,

Je suis tout à fait d'accord avec toi, c'est extrêmement sensible et les messagse d'erreur ne sont d'aucune aide.

Généralement j'exécute ou je modifie la requête en auto enregistrement et je réorganise progressivement les données en faisant régulièrement des essais avec F8 pour revenir facilement en arrière si message d'erreur.

Pour le fichier finalisé, pas de soucis, je regarderai.

@+

Gael
 
Re : Alléger calcul matriciel


En fait dans le programme, il y a :

With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
"ODBC;DSN=Fichiers Excel;DBQ=" & ThisWorkbook.FullName & ";DefaultDir=" & ThisWorkbook.Path & ";DriverId=790;MaxBufferSize=2048;PageTimeout" _

Et sur le PC sur lequel je travaille il fallait mettre :

With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
"ODBC;DSN=Excel Files;DBQ=" & ThisWorkbook.FullName & ";DefaultDir=" & ThisWorkbook.Path & ";DriverId=790;MaxBufferSize=2048;PageTimeout" _

C'est du délire total ! Je continue mes tests (sur les 60.000 lignes) !

Dieu08
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
20
Affichages
1 K
N
Réponses
17
Affichages
2 K
A
Réponses
2
Affichages
631
alcabin26
A
B
  • Question Question
Réponses
3
Affichages
1 K
M
Réponses
1
Affichages
870
Réponses
6
Affichages
1 K
Réponses
1
Affichages
1 K
R
  • Question Question
Réponses
10
Affichages
949
T
Réponses
0
Affichages
1 K
titoun007
T
K
  • Question Question
Microsoft 365 Problème de calcul
Réponses
11
Affichages
3 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…