OVH Cloud OVH Cloud

"Mémoire insuffisante" : cherche optimisation

9 réponses
Avatar
Gillou
Bonsoir tout le monde,

Pour essayer de résumer la situation de la manière la plus simple possible :

J'ai un gros fichier, environ 2500 lignes sur une quarantaine de
colonnes, qui est mis à jour de façon quotidienne par un administrateur
et sur lequel je n'ai pas la main. Ce fichier contient, en gros, des
numéros en colonne A et des infos de facturation pour ce numéro pour
chaque mois depuis un an à partir de la colonne B.

Ce fichier :
- bougeant continuellement
- étant gros
- étant protégé,

je l'ai scindé en plusieurs fichiers, comportant chacun une partie du
gros fichier.

Pour que chaque petit fichier comporte à chaque fois les infos mises à
jour du gros fichier, chacune des colonnes à partir de B des petits
fichiers contient :
=RECHERCHEV(numéro,plage de données dans gros fichier, colonne
correspondant au mois, FAUX)
et les mises à jour des petits fichiers se font au lancement après mise
à jour du gros par l'administrateur.

Mon problème :
apparemment cela fait beaucoup de grosses formules RECHERCHEV et le PC
ne suit pas, j'ai le message "Mémoire insuffisante" à chaque MAJ et
Excel n'arrive pas à mettre à jour toutes les lignes. J'ai pourtant un
PC récent et 512 Mo de RAM, je pensais que ce serait suffisant.

Je cherche donc à optimiser mes mises à jour pour diminuer l'utilisation
des ressources.
J'aimerais bien écrire en VBA une macro qui me ferait l'équivalent de
RECHERCHEV pour chacune de mes cellules, puis qui me copierait/collerait
la valeur au lieu de conserver la formule. La macro serait donc à lancer
une fois après chaque mise à jour du gros fichier.

1) est-ce que vous pensez que ça améliorerait la situation, ou il faut
que je cherche ailleurs ?
2) comment puis-je faire une telle macro, je débute en VBA : je ne
connais pas l'équivalent de la fonction RECHERCHEV, ni comment lui
indiquer dans quelles cellules faire les opérations, etc...

Quelqu'un a une idée ? Merci d'avance pour votre aide, j'ai été long :-)

A+
Gillou

9 réponses

Avatar
michdenis
Bonjour Gillou,

Je ne sais pas comment sont organisées tes données du fichier "Maître" et les plus petits fichiers, mais si tu utilisais ADO pour
activex data object, ce serait sûrement plus rapide et plus facile.

Voici un exemple de code que je fournissais il y a quelques temps à un demandeur ... le code n'est pas adapté à ta réalité ... il
manque beaucoup d'informations dans ta question sur la disposition des données, l'emplacement des fichiers ... mais ce pourrait être
un début.

Ce type de code demande d'ajouter une référence à ton projet .

Tu ouvres VBE (visual basic editor) et à partir de la barre de menu / outils / référence / tu coches :

Microsoft Activex Data object 2.8 librairy (coche la version la plus récente sur ton ordi.)


'-----------------------------------------
Private Sub CommandButton1_Click()

Dim Rst As New ADODB.Recordset
Dim Con As ADODB.Connection
Dim A As Integer
Dim Fld As ADODB.Field
Dim NomFichier As String

'à définir le chemin et le nom de ton modèle
NomFichier = ThisWorkbook.Path & "données.xls"

Set Con = New ADODB.Connection
Con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & NomFichier & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""

'modifie le nom de la feuille et l'adresse où se retrouve
'tes données dans ton modèle
Requete = "SELECT * From [Feuil1$]"
'Exécution de la requête
Rst.Open Requete, Con, adOpenStatic, adLockOptimistic
'Si le recordset n'est pas vide...
If Rst.EOF = False Then
Application.EnableEvents = False
For Each Fld In Rst.Fields
A = A + 1
Cells(, A) = Fld.Name
Next
Range("A2").CopyFromRecordset Rst
Application.EnableEvents = True
Else
MsgBox "Aucune donnée disponible. Mise à jour impossible."
End If
'Ferme le recordset
Rst.Close: Con.Close
Set Rst = Nothing: Set Con = Nothing: Set fld = Nothing

End Sub
'-------------------------------------


Salutations!




"Gillou" a écrit dans le message de news: 42f90d3a$0$2521$
Bonsoir tout le monde,

Pour essayer de résumer la situation de la manière la plus simple possible :

J'ai un gros fichier, environ 2500 lignes sur une quarantaine de
colonnes, qui est mis à jour de façon quotidienne par un administrateur
et sur lequel je n'ai pas la main. Ce fichier contient, en gros, des
numéros en colonne A et des infos de facturation pour ce numéro pour
chaque mois depuis un an à partir de la colonne B.

Ce fichier :
- bougeant continuellement
- étant gros
- étant protégé,

je l'ai scindé en plusieurs fichiers, comportant chacun une partie du
gros fichier.

Pour que chaque petit fichier comporte à chaque fois les infos mises à
jour du gros fichier, chacune des colonnes à partir de B des petits
fichiers contient :
=RECHERCHEV(numéro,plage de données dans gros fichier, colonne
correspondant au mois, FAUX)
et les mises à jour des petits fichiers se font au lancement après mise
à jour du gros par l'administrateur.

Mon problème :
apparemment cela fait beaucoup de grosses formules RECHERCHEV et le PC
ne suit pas, j'ai le message "Mémoire insuffisante" à chaque MAJ et
Excel n'arrive pas à mettre à jour toutes les lignes. J'ai pourtant un
PC récent et 512 Mo de RAM, je pensais que ce serait suffisant.

Je cherche donc à optimiser mes mises à jour pour diminuer l'utilisation
des ressources.
J'aimerais bien écrire en VBA une macro qui me ferait l'équivalent de
RECHERCHEV pour chacune de mes cellules, puis qui me copierait/collerait
la valeur au lieu de conserver la formule. La macro serait donc à lancer
une fois après chaque mise à jour du gros fichier.

1) est-ce que vous pensez que ça améliorerait la situation, ou il faut
que je cherche ailleurs ?
2) comment puis-je faire une telle macro, je débute en VBA : je ne
connais pas l'équivalent de la fonction RECHERCHEV, ni comment lui
indiquer dans quelles cellules faire les opérations, etc...

Quelqu'un a une idée ? Merci d'avance pour votre aide, j'ai été long :-)

A+
Gillou
Avatar
LSteph
Bonsoir Gillou,
?
Des fichiers bien plus gros peuvent pourtant être lus avec bien moins de
mémoire!

Tu pourrais plutôt que recherchev utiliser index et equiv...
toutefois cette suggestion concerne la méthode de recherche.

Selon ce que tu évoques , là où cela met du temps vient certainement de la
lecture via réseau du fichier source
si au lieu de mettre des formules de recherche tu le récupèrais entier en
liaison cela irait sûrement plus vite

en a1, ='g:chemin[fichier]feuil1'!a1

et idem dansles autres cellules.

Amicalement.

lSteph



"Gillou" a écrit dans le message de news:
42f90d3a$0$2521$
Bonsoir tout le monde,

Pour essayer de résumer la situation de la manière la plus simple possible
:

J'ai un gros fichier, environ 2500 lignes sur une quarantaine de colonnes,
qui est mis à jour de façon quotidienne par un administrateur et sur
lequel je n'ai pas la main. Ce fichier contient, en gros, des numéros en
colonne A et des infos de facturation pour ce numéro pour chaque mois
depuis un an à partir de la colonne B.

Ce fichier :
- bougeant continuellement
- étant gros
- étant protégé,

je l'ai scindé en plusieurs fichiers, comportant chacun une partie du gros
fichier.

Pour que chaque petit fichier comporte à chaque fois les infos mises à
jour du gros fichier, chacune des colonnes à partir de B des petits
fichiers contient :
=RECHERCHEV(numéro,plage de données dans gros fichier, colonne
correspondant au mois, FAUX)
et les mises à jour des petits fichiers se font au lancement après mise à
jour du gros par l'administrateur.

Mon problème :
apparemment cela fait beaucoup de grosses formules RECHERCHEV et le PC ne
suit pas, j'ai le message "Mémoire insuffisante" à chaque MAJ et Excel
n'arrive pas à mettre à jour toutes les lignes. J'ai pourtant un PC récent
et 512 Mo de RAM, je pensais que ce serait suffisant.

Je cherche donc à optimiser mes mises à jour pour diminuer l'utilisation
des ressources.
J'aimerais bien écrire en VBA une macro qui me ferait l'équivalent de
RECHERCHEV pour chacune de mes cellules, puis qui me copierait/collerait
la valeur au lieu de conserver la formule. La macro serait donc à lancer
une fois après chaque mise à jour du gros fichier.

1) est-ce que vous pensez que ça améliorerait la situation, ou il faut que
je cherche ailleurs ?
2) comment puis-je faire une telle macro, je débute en VBA : je ne connais
pas l'équivalent de la fonction RECHERCHEV, ni comment lui indiquer dans
quelles cellules faire les opérations, etc...

Quelqu'un a une idée ? Merci d'avance pour votre aide, j'ai été long :-)

A+
Gillou


Avatar
Gillou
Bonjour Gillou,

Je ne sais pas comment sont organisées tes données du fichier "Maître" et les plus petits fichiers, mais si tu utilisais ADO pour
activex data object, ce serait sûrement plus rapide et plus facile.

Voici un exemple de code que je fournissais il y a quelques temps à un demandeur ... le code n'est pas adapté à ta réalité ... il
manque beaucoup d'informations dans ta question sur la disposition des données, l'emplacement des fichiers ... mais ce pourrait être
un début.
[...]


Ouh la la, c'est du chinois pour moi tout ça... :-S Je vais voir si je
peux en tirer quelque chose mais c'est peut-être au-dessus de mon niveau
et du temps que je peux y consacrer.

Merci en tout cas !

A+
Gillou

Avatar
Gillou
Bonsoir Gillou,
?
Des fichiers bien plus gros peuvent pourtant être lus avec bien moins de
mémoire!


D'où mon étonnement la 1ère fois que j'ai eu le message d'erreur !

Tu pourrais plutôt que recherchev utiliser index et equiv...
toutefois cette suggestion concerne la méthode de recherche.


Je ne connais pas ces fonctions, je vais y jeter un coup d'oeil voir ce
qu'elles font...

Selon ce que tu évoques , là où cela met du temps vient certainement de la
lecture via réseau du fichier source
si au lieu de mettre des formules de recherche tu le récupèrais entier en
liaison cela irait sûrement plus vite

en a1, ='g:chemin[fichier]feuil1'!a1


Ben malheureusement, les numéros de référence ne sont pas aux mêmes
lignes dans les différents fichiers, d'où la nécessité de faire une
recherche et une correspondance par numéro et non par ligne.

Avatar
MPi
Salut,

qui est mis à jour de façon quotidienne par un administrateur et sur lequel
je n'ai pas la main

Lorsque tu dis que tu n'as pas la main, est-ce que ça veut dire que tu ne
peux pas l'ouvrir, même en lecture seule ?

Ce fichier :
- bougeant continuellement
Est-ce qu'il change de lecteur ? de répertoire ?


En gros, lorsque tu reçois ces messages d'erreur, est-ce que le fichier
maître est ouvert ?
Sinon, il faudrait peut-être trouver le moyen de l'ouvrir, même en lecture
seule.
Ensuite, on pourrait voir si le message réapparaît.

Michel

"Gillou" a écrit dans le message de
news:42f925b9$0$2516$
Bonsoir Gillou,
?
Des fichiers bien plus gros peuvent pourtant être lus avec bien moins de
mémoire!


D'où mon étonnement la 1ère fois que j'ai eu le message d'erreur !

Tu pourrais plutôt que recherchev utiliser index et equiv...
toutefois cette suggestion concerne la méthode de recherche.


Je ne connais pas ces fonctions, je vais y jeter un coup d'oeil voir ce
qu'elles font...

Selon ce que tu évoques , là où cela met du temps vient certainement de
la


lecture via réseau du fichier source
si au lieu de mettre des formules de recherche tu le récupèrais entier
en


liaison cela irait sûrement plus vite

en a1, ='g:chemin[fichier]feuil1'!a1


Ben malheureusement, les numéros de référence ne sont pas aux mêmes
lignes dans les différents fichiers, d'où la nécessité de faire une
recherche et une correspondance par numéro et non par ligne.



Avatar
Gillou
Lorsque tu dis que tu n'as pas la main, est-ce que ça veut dire que tu ne
peux pas l'ouvrir, même en lecture seule ?


Je me suis mal exprimé, je m'en aperçois en lisant ton interrogation. Quand
je dis que je n'ai pas la main je veux dire que le fichier me descend
directement de mon entité nationale, sans que je participe à sa création. Par
contre, une fois mis à disposition je peux l'ouvrir (même en écriture).

Ce fichier :
- bougeant continuellement
Est-ce qu'il change de lecteur ? de répertoire ?



Argh, encore mal exprimé, décidemment... :-S
Il bouge tout le temps, ça veut dire que de nouvelles lignes sont ajoutée
dans chaque version, et que les colonnes donnant l'état de la facturation
pour les lignes existantes évoluent justement en fonction des corrections que
l'on effectue en région.

Je n'ai sans doute pas suffisamment décrit la structure du fichier pour être
clair. Très schématiquement, c'est :

N° Juill Août Sept ... Juillet Août
123 facturé facturé bloqué bloqué pas facturé

et ce sur environ 2500 lignes.

En gros, lorsque tu reçois ces messages d'erreur, est-ce que le fichier
maître est ouvert ?


Quand il est fermé j'ai à chaque fois le message et la MAJ se fait mal.
Quand il est ouvert avant ouverture des petits fichiers, les petits fichiers
se mettent à jour correctement mais après ça je n'ai plus assez de mémoire
pour les enregistrer... Voilà donc comment je procède mais c'est très lourd
car il y a 12 petits fichiers (1 par mois d'effet des contrats en gros) :

1) j'ouvre le maitre
2) j'ouvre l'esclave n°1, la MAJ se fait
3) je ferme le maître, j'ai le message d'erreur "Mémoire insuffisante", je
clique sur OK et ça ferme le maître sans l'enregistrer (c'est pas grave je ne
le modifie jamais)
4) j'enregistre le petit fichier, ça marche
5) je ferme le petit fichier

et je recommence pour chacun des petits fichiers !!! Sachant que le maître
est mis à jour quotidiennement, c'est très très lourd si je ne trouve pas une
solution plus efficace...

Sinon, il faudrait peut-être trouver le moyen de l'ouvrir, même en lecture
seule.
Ensuite, on pourrait voir si le message réapparaît.


Ben, comme expliqué au-dessus, pas à la MAJ mais à l'enregistrement si je ne
ferme pas le maître entre temps.


Avatar
LSteph
Bonjour,
Ben malheureusement, les numéros de référence ne sont pas aux mêmes lignes
dans les différents fichiers, d'où la nécessité de faire une recherche et
une correspondance par numéro et non par ligne.


Raison de plus pour ramener toutes les cellules sans avoir à se soucier des
localisations
qui pourront être faite ensuite dans les données ainsi récupèrées.

lSteph

"Gillou" a écrit dans le message de news:
42f925b9$0$2516$
Bonsoir Gillou,
?
Des fichiers bien plus gros peuvent pourtant être lus avec bien moins de
mémoire!


D'où mon étonnement la 1ère fois que j'ai eu le message d'erreur !

Tu pourrais plutôt que recherchev utiliser index et equiv...
toutefois cette suggestion concerne la méthode de recherche.


Je ne connais pas ces fonctions, je vais y jeter un coup d'oeil voir ce
qu'elles font...

Selon ce que tu évoques , là où cela met du temps vient certainement de
la lecture via réseau du fichier source
si au lieu de mettre des formules de recherche tu le récupèrais entier en
liaison cela irait sûrement plus vite

en a1, ='g:chemin[fichier]feuil1'!a1


Ben malheureusement, les numéros de référence ne sont pas aux mêmes lignes
dans les différents fichiers, d'où la nécessité de faire une recherche et
une correspondance par numéro et non par ligne.



Avatar
Gillou

Bonjour,
Ben malheureusement, les numéros de référence ne sont pas aux mêmes lignes
dans les différents fichiers, d'où la nécessité de faire une recherche et
une correspondance par numéro et non par ligne.


Raison de plus pour ramener toutes les cellules sans avoir à se soucier des
localisations
qui pourront être faite ensuite dans les données ainsi récupèrées.


Salut LSteph
Je ne comprends pas où tu veux en venir : quel est l'intérêt de récupérer le
fichier cellule par cellule puisqu'après je devrais quand même effectuer une
recherche pour faire la correspondance numéro du petit fichier / numéro du
gros fichier ?

Merci


Avatar
LSteph
Bonsoir Gillou,

Simplement, ( mais je peux me tromper)
plutôt que de faire mouliner des formules de recherche qui visiblement via
réseau posent pb,
créer une liaison sur toute la plage impliquera juste lecture du fichier
source pour mise à jour.
Ensuite, tu disposes en local des datas sur lesquels tes formules donneront
un résultat immédiat.


a+

lSteph

"Gillou" a écrit dans le message de news:


Bonjour,
Ben malheureusement, les numéros de référence ne sont pas aux mêmes
lignes
dans les différents fichiers, d'où la nécessité de faire une recherche
et
une correspondance par numéro et non par ligne.


Raison de plus pour ramener toutes les cellules sans avoir à se soucier
des
localisations
qui pourront être faite ensuite dans les données ainsi récupèrées.


Salut LSteph
Je ne comprends pas où tu veux en venir : quel est l'intérêt de récupérer
le
fichier cellule par cellule puisqu'après je devrais quand même effectuer
une
recherche pour faire la correspondance numéro du petit fichier / numéro du
gros fichier ?

Merci