Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

booster exel pour réduire les temps de calculs

11 réponses
Avatar
Elicend_News
Salut

j'ai quasiment fini une appli sous exel avec de tres nombreux calculs
dedans, et suites aux premiers essais, j'estime les temps de calculs à
plusieurs heures (17...)
savez vous s'il y a des moyens pour mettre un turbo quelques part dans exel
et augmenter sa vitesse de calcul ?

je ne peux pas rentrer trop dans les détails de l'applis se serait trop long
mais pour vous aiguiller par rapport à ce quelle fait, en gros, elle scanne,
ligne par ligne et colonne par colonne des valeurs, pour attribuer sur des
onglet différents différent resultats... la matrice de base est de l'ordre
de 30000lignes x 200colonnes

merci d'avance :)

--
Encore merci / Thanks a lot !

@ plus
Elicend
________________________

Attention adresse e-mail :
inconicoAfreePOINTfr
A = @
POINT = .

Be Careful e-mail :
inconicoAfreePOINTfr
A = @
POINT = .
________________________

10 réponses

1 2
Avatar
Rai
Salut,

Je vois plusieurs pistes pour "booster" ton appli :
- changer de PC avec méga-cpu, plein de ram, belle carte mère ...

Et sans blaguer, je pense plutôt à une optimisation du code (si elle est
possible).

Ne connaissant ni ton niveau de programmation, ni ton appli, je me
permets quelques conseils (non-exhaustifs). n'en prends pas ombrage
s'ils sont trop 'enfantins' ;o))

1. Quand tu scannes tes plages : ne pas utiliser la méthode select (le
moins possible)
2. Figer l'écran, son rafraichissement 'bouffe' pas mal de temps
processeur : Application.ScreenUpdating = False (le repasser à True au
moment voulu)
3. Optimiser le scan de tes plages : existe-t-il des règles qui
permettent de réduire l'étendue de la recherche, en fonction de valeurs
atteintes (genre : si val(max) atteinte alors ligne suivante...)

Pour sortir de ce genre de généralités, il serait opportun de publier
ton code, ou aumoins certains extraits, et/ou l'algorythme.

A bientôt

Rai

Salut

j'ai quasiment fini une appli sous exel avec de tres nombreux calculs
dedans, et suites aux premiers essais, j'estime les temps de calculs à
plusieurs heures (17...)
savez vous s'il y a des moyens pour mettre un turbo quelques part dans exel
et augmenter sa vitesse de calcul ?

je ne peux pas rentrer trop dans les détails de l'applis se serait trop long
mais pour vous aiguiller par rapport à ce quelle fait, en gros, elle scanne,
ligne par ligne et colonne par colonne des valeurs, pour attribuer sur des
onglet différents différent resultats... la matrice de base est de l'ordre
de 30000lignes x 200colonnes

merci d'avance :)



Avatar
Rai
Salut,

Je vois plusieurs pistes pour "booster" ton appli :
- changer de PC avec méga-cpu, plein de ram, belle carte mère ...

Et sans blaguer, je pense plutôt à une optimisation du code (si elle est
possible).

Ne connaissant ni ton niveau de programmation, ni ton appli, je me
permets quelques conseils (non-exhaustifs). n'en prends pas ombrage
s'ils sont trop 'enfantins' ;o))

1. Quand tu scannes tes plages : ne pas utiliser la méthode select (le
moins possible)
2. Figer l'écran, son rafraichissement 'bouffe' pas mal de temps
processeur : Application.ScreenUpdating = False (le repasser à True au
moment voulu)
3. Optimiser le scan de tes plages : existe-t-il des règles qui
permettent de réduire l'étendue de la recherche, en fonction de valeurs
atteintes (genre : si val(max) atteinte alors ligne suivante...)

Pour sortir de ce genre de généralités, il serait opportun de publier
ton code, ou aumoins certains extraits, et/ou l'algorythme.

A bientôt

Rai

Salut

j'ai quasiment fini une appli sous exel avec de tres nombreux calculs
dedans, et suites aux premiers essais, j'estime les temps de calculs à
plusieurs heures (17...)
savez vous s'il y a des moyens pour mettre un turbo quelques part dans exel
et augmenter sa vitesse de calcul ?

je ne peux pas rentrer trop dans les détails de l'applis se serait trop long
mais pour vous aiguiller par rapport à ce quelle fait, en gros, elle scanne,
ligne par ligne et colonne par colonne des valeurs, pour attribuer sur des
onglet différents différent resultats... la matrice de base est de l'ordre
de 30000lignes x 200colonnes

merci d'avance :)



Avatar
Rai
Salut,

Je vois plusieurs pistes pour "booster" ton appli :
- changer de PC avec méga-cpu, plein de ram, belle carte mère ...

Et sans blaguer, je pense plutôt à une optimisation du code (si elle est
possible).

Ne connaissant ni ton niveau de programmation, ni ton appli, je me
permets quelques conseils (non-exhaustifs). n'en prends pas ombrage
s'ils sont trop 'enfantins' ;o))

1. Quand tu scannes tes plages : ne pas utiliser la méthode select (le
moins possible)
2. Figer l'écran, son rafraichissement 'bouffe' pas mal de temps
processeur : Application.ScreenUpdating = False (le repasser à True au
moment voulu)
3. Optimiser le scan de tes plages : existe-t-il des règles qui
permettent de réduire l'étendue de la recherche, en fonction de valeurs
atteintes (genre : si val(max) atteinte alors ligne suivante...)

Pour sortir de ce genre de généralités, il serait opportun de publier
ton code, ou aumoins certains extraits, et/ou l'algorythme.

A bientôt

Rai

Salut

j'ai quasiment fini une appli sous exel avec de tres nombreux calculs
dedans, et suites aux premiers essais, j'estime les temps de calculs à
plusieurs heures (17...)
savez vous s'il y a des moyens pour mettre un turbo quelques part dans exel
et augmenter sa vitesse de calcul ?

je ne peux pas rentrer trop dans les détails de l'applis se serait trop long
mais pour vous aiguiller par rapport à ce quelle fait, en gros, elle scanne,
ligne par ligne et colonne par colonne des valeurs, pour attribuer sur des
onglet différents différent resultats... la matrice de base est de l'ordre
de 30000lignes x 200colonnes

merci d'avance :)



Avatar
Rai
Salut,

Je vois plusieurs pistes pour "booster" ton appli :
- changer de PC avec méga-cpu, plein de ram, belle carte mère ...

Et sans blaguer, je pense plutôt à une optimisation du code (si elle est possible).

Ne connaissant ni ton niveau de programmation, ni ton appli, je me permets quelques conseils (non-exhaustifs). n'en prends pas ombrage s'ils sont trop 'enfantins' ;o))

1. Quand tu scannes tes plages : ne pas utiliser la méthode select (le moins possible)
2. Figer l'écran, son rafraichissement 'bouffe' pas mal de temps processeur : Application.ScreenUpdating = False (le repasser à True au moment voulu)
3. Optimiser le scan de tes plages : existe-t-il des règles qui permettent de réduire l'étendue de la recherche, en fonction de valeurs atteintes (genre : si val(max) atteinte alors ligne suivante...)

Pour sortir de ce genre de généralités, il serait opportun de publier ton code, ou aumoins certains extraits, et/ou l'algorythme.

A bientôt

Rai


"Elicend_News" <inconicoAfreePOINTfr> a écrit dans le message de news: 4200d387$0$540$
Salut

j'ai quasiment fini une appli sous exel avec de tres nombreux calculs
dedans, et suites aux premiers essais, j'estime les temps de calculs à
plusieurs heures (17...)
savez vous s'il y a des moyens pour mettre un turbo quelques part dans exel
et augmenter sa vitesse de calcul ?

je ne peux pas rentrer trop dans les détails de l'applis se serait trop long
mais pour vous aiguiller par rapport à ce quelle fait, en gros, elle scanne,
ligne par ligne et colonne par colonne des valeurs, pour attribuer sur des
onglet différents différent resultats... la matrice de base est de l'ordre
de 30000lignes x 200colonnes

merci d'avance :)

--
Encore merci / Thanks a lot !

@ plus
Elicend
________________________

Attention adresse e-mail :
inconicoAfreePOINTfr
A = @
POINT = .

Be Careful e-mail :
inconicoAfreePOINTfr
A = @
POINT = .
________________________




Avatar
anomymousA
bonjour,

Quelques idées en vrac:

d'abord passer les ranges sous forme de tableaux et faire les calculs sur
les tableaux ce qui améliore nettement voire très nettement (de l'ordre de 1
à 5 voir plus le temps de calcul).
Je ne me rappelle plus trop la limite des tableaux mais ca doit pouvoir
passer.
Economiser la mémoire en déclarant précisement tes variables selon le
minimum requis ( integer au lieu de variant si tu ne déclarais rien).

Ensuite s'il s'agit de formules et que tu n'utilises pas les tableaux,
empêcher le calcul automatique car à chque fois que tu vas écrire une
formule, Excel va recalculer l'ensemble et lancer le calcul à la fin (
possible que ca ne fasse pas gagener beaucoupe de temps, à voir !!).
Désactiver le gestionnaire d'evenements (applcation.enableventsúlse) si ce
n'est pas handaicapant dans les clalculs et desactiver le raffraichissement
de l'écran (Application.screenupdatingúlse).
Eviter les formules matricielles.

Utiliser les macros Excel4 ou les XLL. Il parait que c'est + rapide.

Enfin, si tout ça est trop long, passer à ACCESS.

Intéressant de savoir comment tu t'en es sorti et ce qui marche le mieux.

Bon courage, A+


Salut

j'ai quasiment fini une appli sous exel avec de tres nombreux calculs
dedans, et suites aux premiers essais, j'estime les temps de calculs à
plusieurs heures (17...)
savez vous s'il y a des moyens pour mettre un turbo quelques part dans exel
et augmenter sa vitesse de calcul ?

je ne peux pas rentrer trop dans les détails de l'applis se serait trop long
mais pour vous aiguiller par rapport à ce quelle fait, en gros, elle scanne,
ligne par ligne et colonne par colonne des valeurs, pour attribuer sur des
onglet différents différent resultats... la matrice de base est de l'ordre
de 30000lignes x 200colonnes

merci d'avance :)

--
Encore merci / Thanks a lot !

@ plus
Elicend
________________________

Attention adresse e-mail :
inconicoAfreePOINTfr
A = @
POINT = .

Be Careful e-mail :
inconicoAfreePOINTfr
A = @
POINT = .
________________________





Avatar
Elicend_News
Salut
merci à tous les deux pour vos pistes ;)

sans rentrer dans le détails je simule un magasin virtuel et son stock pour
le faire vivre et voir les fluctuations... les lignes sont les articles, les
colonnes les jours...d'ou ma matrice de fou.
je pense qu'en array, ca irait plus vite, du moins c'est ce que j'ai pu lire
sur le net, mais je ne sais absolument pas comment travailler avec array, de
plus... je dirais que rien n'est développé avec cette méthode, donc il
faudrait mieux trouver autre chose que de repenser tout le systeme.
Application screenupdating est à false au maximum, les scans sont
difficilement optimisables... malheureusement :(
quel est le generateur d'évenement, et à quoi sert il ? de meme comment le
regle t on à false, suivant ce que c'est c'est une manip que je peux tester
! Dans l'ensemble toutes mes variables sont déclarées en integer et en
string, il n'y a que trés peu d'exeption...

sur le fond, mon algo n'est pas secret, les valeurs qu'il y a dedans, ouais,
mais c'est tres simple d'en generer des fausses par exemple, mais surtout,
ce qui est contraignant c'est que toute la mécanique est énorme (6 ou 7
modules différents) et tiens dant un fichier de 40Mo... difficile de vous
donner tout ca ici !
schematiquement, le fonctionnement est le suivant : je regarde ce qu'on me
commande, j'impute mon stock, je verifie ce qui me reste, et je commande si
necessaire, au jour suivant, je regarde ce qui arrive (précedement commandé)
et je refais toutes les op précedents...sur 30000 ref... pendant 6 mois...

si vous avez d'autres idée..

je pense qu'une piste qui pourrait me faire gagner du temps c'est lors de la
réapprovisionnement ! la j'ai une pile de commande qui s'allonge, avec la
ref et la date à laquelle la commande est livre, je scanne une premiere fois
pour compter ce que je recois le jour, et en mme temps ce que je vais
recevoir les jours suivant (il me faut cette info)... ensuite je rescanne
pour avoir la premiere case vide, et inscrire une commande de réappro si
besoin est... peut etre que je ne pourrai scanner qu'une fois et me souvenir
de la premiere ligne libre. mais sinon je ne voie pas d'autre piste.



"anomymousA" a écrit dans le message
de news:
bonjour,

Quelques idées en vrac:

d'abord passer les ranges sous forme de tableaux et faire les calculs sur
les tableaux ce qui améliore nettement voire très nettement (de l'ordre de
1

à 5 voir plus le temps de calcul).
Je ne me rappelle plus trop la limite des tableaux mais ca doit pouvoir
passer.
Economiser la mémoire en déclarant précisement tes variables selon le
minimum requis ( integer au lieu de variant si tu ne déclarais rien).

Ensuite s'il s'agit de formules et que tu n'utilises pas les tableaux,
empêcher le calcul automatique car à chque fois que tu vas écrire une
formule, Excel va recalculer l'ensemble et lancer le calcul à la fin (
possible que ca ne fasse pas gagener beaucoupe de temps, à voir !!).
Désactiver le gestionnaire d'evenements (applcation.enableventsúlse) si
ce

n'est pas handaicapant dans les clalculs et desactiver le
raffraichissement

de l'écran (Application.screenupdatingúlse).
Eviter les formules matricielles.

Utiliser les macros Excel4 ou les XLL. Il parait que c'est + rapide.

Enfin, si tout ça est trop long, passer à ACCESS.

Intéressant de savoir comment tu t'en es sorti et ce qui marche le mieux.

Bon courage, A+


Salut

j'ai quasiment fini une appli sous exel avec de tres nombreux calculs
dedans, et suites aux premiers essais, j'estime les temps de calculs à
plusieurs heures (17...)
savez vous s'il y a des moyens pour mettre un turbo quelques part dans
exel


et augmenter sa vitesse de calcul ?

je ne peux pas rentrer trop dans les détails de l'applis se serait trop
long


mais pour vous aiguiller par rapport à ce quelle fait, en gros, elle
scanne,


ligne par ligne et colonne par colonne des valeurs, pour attribuer sur
des


onglet différents différent resultats... la matrice de base est de
l'ordre


de 30000lignes x 200colonnes

merci d'avance :)

--
Encore merci / Thanks a lot !

@ plus
Elicend
________________________

Attention adresse e-mail :
inconicoAfreePOINTfr
A = @
POINT = .

Be Careful e-mail :
inconicoAfreePOINTfr
A = @
POINT = .
________________________







Avatar
Daniel.M
Bonjour,


je pense qu'en array, ca irait plus vite, du moins c'est ce que j'ai pu lire
sur le net, mais je ne sais absolument pas comment travailler avec array, de
plus... je dirais que rien n'est développé avec cette méthode, donc il
faudrait mieux trouver autre chose que de repenser tout le systeme.


Dim V as Variant
V = Range("A1").CurrentRegion
et ta variable contient tes infos.

Application screenupdating est à false


OK
N'oublie pas
Application.Calculation=xlCalculationManual

les scans sont difficilement optimisables... malheureusement :(


Combien fais-tu des comparaisons au total? As-tu calculer?
Pour un calcul de 17 heures (ton estimé), c'est 17 heures * 3600 secondes/heure
* 500000 comparaisons/seconde.
C'est un total astronomique de comparaisons : es-tu certain que ce n'est pas
cela qu'il faut analyser de plus près? ;-)
Identifie ta section critique de code (celle qui ralentit tout) et optimise-la.
Quitte à demander des conseils spécifiques pour celle-ci.

quel est le generateur d'évenement, et à quoi sert il ? de meme comment le
regle t on à false,


On le met à false ainsi:
Application.EnableEvents = False

Si tu n'as pas de routines d'événements (Worksheet_Change, etc.), ce n'est pas
essentiel de le mettre à false.


! Dans l'ensemble toutes mes variables sont déclarées en integer et en
string, il n'y a que trés peu d'exeption...

sur le fond, mon algo n'est pas secret, les valeurs qu'il y a dedans, ouais,
mais c'est tres simple d'en generer des fausses par exemple, mais surtout,
ce qui est contraignant c'est que toute la mécanique est énorme (6 ou 7
modules différents) et tiens dant un fichier de 40Mo... difficile de vous
donner tout ca ici !
schematiquement, le fonctionnement est le suivant : je regarde ce qu'on me
commande, j'impute mon stock, je verifie ce qui me reste, et je commande si
necessaire, au jour suivant, je regarde ce qui arrive (précedement commandé)
et je refais toutes les op précedents...sur 30000 ref... pendant 6 mois...



30000 articles * 180 jours ==> 5.4 millions comparaisons. Ça devrait tourner
sous la minute (et probablement sous les 10 secondes avec une machine
performante)!


ensuite je rescanne
pour avoir la premiere case vide, et inscrire une commande de réappro si
besoin est... peut etre que je ne pourrai scanner qu'une fois et me souvenir
de la premiere ligne libre. mais sinon je ne voie pas d'autre piste.


Tu n'as pas besoin de scanner pour connaître la première ligne vide
Quelquechose du genre devrait faire l'affaire:

Set PremVide = Range("A65536").End(xlUp)(2)

PremVide représente la plage qu'il faut alors renseigner. Tu viens de t'épargner
30000 scans à chaque boucle. C'est juste un exemple mais ça montre bien qu'il y
a moyen d'optimiser grandement.

Salutations,

Daniel M.

Avatar
Elicend_News
salut

j'ai bien peur que ton exemple de array, bien qu'interessant soit trop juste
pour que je le comprenne parfaitement, et surtout que je m'impregne de son
fonctionnement et des calculs à l'intérieur :(

pour l'algo : sur chaque ligne (ref) je scanne une pile (matrice à une
colonne) dans laquelle je somme la deuxieme colonne dont les valeur de la
premiere son identique sous 2 conditions : date correspond, date correspond
pas, ce qui me donne deux valeurs de réapprovisionnement (en cours, et pour
aujourd'hui)... c'est à ce niveau que depuis mon message précédent j'ai
virer le second scan pour avoir la premiere case vide puis que le premier
m'amenait déjà au bout de ma pile...
---> voies tu une méthode pour avoir mes 2 valeurs de réappros sans scanner
? auquel cas, je gagnerai 30000 scans x hauteur de la pile qui varie X 180
jours

ensuite, je regarde mes commandes, j'en ai sur 3 onglet différents, que je
dois traiter séparément (client différents, et il me faut une tracabilité
des trois), la en fonction de mes valeurs de réappro et de stock, je déduit
par comparaison si je dois commander ou non, quels sont mes reliquat, mon
état de stock, et ce que j'ai vendu sur mes trois clients...
---> je voies peu d'amélioration possible, c'est essentiellement des
opérations basiques de somme et soustraction, et du stockage d'info

je passe ensuite a la ligne suivante.


ensuite j'ai une deuxieme grosse partie, qui elle calcule des taux de
service par type de réapprovisionnement, et la c'est une succession de
scan... je suis en train de me pencher dessus en ce moment, mais ca ne
rentre pas encore dans mes 17h !!!!!! :(

j'avoue etre un peu désemparé si t'a d'autre grosse indication je prends :)
(l'appli zippé fait dans les 5 mo)

"Daniel.M" a écrit dans le message de
news:

Bonjour,


je pense qu'en array, ca irait plus vite, du moins c'est ce que j'ai pu
lire


sur le net, mais je ne sais absolument pas comment travailler avec
array, de


plus... je dirais que rien n'est développé avec cette méthode, donc il
faudrait mieux trouver autre chose que de repenser tout le systeme.


Dim V as Variant
V = Range("A1").CurrentRegion
et ta variable contient tes infos.

Application screenupdating est à false


OK
N'oublie pas
Application.Calculation=xlCalculationManual

les scans sont difficilement optimisables... malheureusement :(


Combien fais-tu des comparaisons au total? As-tu calculer?
Pour un calcul de 17 heures (ton estimé), c'est 17 heures * 3600
secondes/heure

* 500000 comparaisons/seconde.
C'est un total astronomique de comparaisons : es-tu certain que ce n'est
pas

cela qu'il faut analyser de plus près? ;-)
Identifie ta section critique de code (celle qui ralentit tout) et
optimise-la.

Quitte à demander des conseils spécifiques pour celle-ci.

quel est le generateur d'évenement, et à quoi sert il ? de meme comment
le


regle t on à false,


On le met à false ainsi:
Application.EnableEvents = False

Si tu n'as pas de routines d'événements (Worksheet_Change, etc.), ce n'est
pas

essentiel de le mettre à false.


! Dans l'ensemble toutes mes variables sont déclarées en integer et en
string, il n'y a que trés peu d'exeption...

sur le fond, mon algo n'est pas secret, les valeurs qu'il y a dedans,
ouais,


mais c'est tres simple d'en generer des fausses par exemple, mais
surtout,


ce qui est contraignant c'est que toute la mécanique est énorme (6 ou 7
modules différents) et tiens dant un fichier de 40Mo... difficile de
vous


donner tout ca ici !
schematiquement, le fonctionnement est le suivant : je regarde ce qu'on
me


commande, j'impute mon stock, je verifie ce qui me reste, et je commande
si


necessaire, au jour suivant, je regarde ce qui arrive (précedement
commandé)


et je refais toutes les op précedents...sur 30000 ref... pendant 6
mois...





30000 articles * 180 jours ==> 5.4 millions comparaisons. Ça devrait
tourner

sous la minute (et probablement sous les 10 secondes avec une machine
performante)!


ensuite je rescanne
pour avoir la premiere case vide, et inscrire une commande de réappro si
besoin est... peut etre que je ne pourrai scanner qu'une fois et me
souvenir


de la premiere ligne libre. mais sinon je ne voie pas d'autre piste.


Tu n'as pas besoin de scanner pour connaître la première ligne vide
Quelquechose du genre devrait faire l'affaire:

Set PremVide = Range("A65536").End(xlUp)(2)

PremVide représente la plage qu'il faut alors renseigner. Tu viens de
t'épargner

30000 scans à chaque boucle. C'est juste un exemple mais ça montre bien
qu'il y

a moyen d'optimiser grandement.

Salutations,

Daniel M.





Avatar
anomymousA
re,

effectivement, c'est difficile sans voir ton code de savoir ce qui peut être
optimisable et de comprendre finement ta demande.

Cependant, quand tu dis que tu ne sais pas te servir d'un array, je te donne
un exemple.
Dim Tabentree ' en l'occurence ce sera de type variant
Tabentree = Range("A1:J58597").Value
MsgBox Tabentree(58597, 10) te renvoie la cellule cells(58597,10) ou J58597.
Ce qui est un peu long, c'est le chargement en mémoire du tableau et j'ai
vérifié la limitation du nombre de données n'est lié qu'à la taille mémoire
dispo .
Ensuite tu fais toutes les opérations que tu veux sur ton tableau et tu
renvoies à la plage de cellules le tableau par
Range("A1:J58597").Value=tabentree.

Si donc dans ton code les références à tes cellules sont de la forme
cells(I,J), il est possible de transformer le code en faisant un
Rechercher/Remplacer cells (I,J) par tabentree(I,J) puisque c'est
formellement la même chose.
Sinon, pas de sortie possible.

Toutefois, 30000 lignes avec 200 colonnes, c'est plutot du domaine d'ACCESS.

A+



Salut
merci à tous les deux pour vos pistes ;)

sans rentrer dans le détails je simule un magasin virtuel et son stock pour
le faire vivre et voir les fluctuations... les lignes sont les articles, les
colonnes les jours...d'ou ma matrice de fou.
je pense qu'en array, ca irait plus vite, du moins c'est ce que j'ai pu lire
sur le net, mais je ne sais absolument pas comment travailler avec array, de
plus... je dirais que rien n'est développé avec cette méthode, donc il
faudrait mieux trouver autre chose que de repenser tout le systeme.
Application screenupdating est à false au maximum, les scans sont
difficilement optimisables... malheureusement :(
quel est le generateur d'évenement, et à quoi sert il ? de meme comment le
regle t on à false, suivant ce que c'est c'est une manip que je peux tester
! Dans l'ensemble toutes mes variables sont déclarées en integer et en
string, il n'y a que trés peu d'exeption...

sur le fond, mon algo n'est pas secret, les valeurs qu'il y a dedans, ouais,
mais c'est tres simple d'en generer des fausses par exemple, mais surtout,
ce qui est contraignant c'est que toute la mécanique est énorme (6 ou 7
modules différents) et tiens dant un fichier de 40Mo... difficile de vous
donner tout ca ici !
schematiquement, le fonctionnement est le suivant : je regarde ce qu'on me
commande, j'impute mon stock, je verifie ce qui me reste, et je commande si
necessaire, au jour suivant, je regarde ce qui arrive (précedement commandé)
et je refais toutes les op précedents...sur 30000 ref... pendant 6 mois...

si vous avez d'autres idée..

je pense qu'une piste qui pourrait me faire gagner du temps c'est lors de la
réapprovisionnement ! la j'ai une pile de commande qui s'allonge, avec la
ref et la date à laquelle la commande est livre, je scanne une premiere fois
pour compter ce que je recois le jour, et en mme temps ce que je vais
recevoir les jours suivant (il me faut cette info)... ensuite je rescanne
pour avoir la premiere case vide, et inscrire une commande de réappro si
besoin est... peut etre que je ne pourrai scanner qu'une fois et me souvenir
de la premiere ligne libre. mais sinon je ne voie pas d'autre piste.



"anomymousA" a écrit dans le message
de news:
bonjour,

Quelques idées en vrac:

d'abord passer les ranges sous forme de tableaux et faire les calculs sur
les tableaux ce qui améliore nettement voire très nettement (de l'ordre de
1

à 5 voir plus le temps de calcul).
Je ne me rappelle plus trop la limite des tableaux mais ca doit pouvoir
passer.
Economiser la mémoire en déclarant précisement tes variables selon le
minimum requis ( integer au lieu de variant si tu ne déclarais rien).

Ensuite s'il s'agit de formules et que tu n'utilises pas les tableaux,
empêcher le calcul automatique car à chque fois que tu vas écrire une
formule, Excel va recalculer l'ensemble et lancer le calcul à la fin (
possible que ca ne fasse pas gagener beaucoupe de temps, à voir !!).
Désactiver le gestionnaire d'evenements (applcation.enableventsúlse) si
ce

n'est pas handaicapant dans les clalculs et desactiver le
raffraichissement

de l'écran (Application.screenupdatingúlse).
Eviter les formules matricielles.

Utiliser les macros Excel4 ou les XLL. Il parait que c'est + rapide.

Enfin, si tout ça est trop long, passer à ACCESS.

Intéressant de savoir comment tu t'en es sorti et ce qui marche le mieux.

Bon courage, A+


Salut

j'ai quasiment fini une appli sous exel avec de tres nombreux calculs
dedans, et suites aux premiers essais, j'estime les temps de calculs à
plusieurs heures (17...)
savez vous s'il y a des moyens pour mettre un turbo quelques part dans
exel


et augmenter sa vitesse de calcul ?

je ne peux pas rentrer trop dans les détails de l'applis se serait trop
long


mais pour vous aiguiller par rapport à ce quelle fait, en gros, elle
scanne,


ligne par ligne et colonne par colonne des valeurs, pour attribuer sur
des


onglet différents différent resultats... la matrice de base est de
l'ordre


de 30000lignes x 200colonnes

merci d'avance :)

--
Encore merci / Thanks a lot !

@ plus
Elicend
________________________

Attention adresse e-mail :
inconicoAfreePOINTfr
A = @
POINT = .

Be Careful e-mail :
inconicoAfreePOINTfr
A = @
POINT = .
________________________












Avatar
Elicend_News
salut

le choix c'est porté sur exel pour 2 raisons : je maitrise tres mal acces,
et exel a de plus grande possibilité pour les graphiques etc... sachant
qu'il va jusqu'a 65000lignes et quelques...

voici le module de "vie courante" en bas de ce message (attention c'est
long)
visiblement, l'appli ralentie fortement avec l'allongement de la pile de
réapprovisionnement, mais meme sans, c'est dejà tres long... je vais etudier
la solution de passer tout ca en array mais je reste inquiet sur tous les
calculs à faire sur les zone dans les array... je suis un peu perdu.

merci de votre aide


Sub chemin_complet()

Application.ScreenUpdating = False

Dim var01, var02 As Integer

var01 = 9 'ligne sur laquelle se trouve les noms des onglets "catégories"
var02 = 1 'colonne traitée

var_Premiere_ref_01 = 11 'ligne de la premiere ref
var_Premiere_ref_02 = 1 'colonne de la premiere ref

var_Premiere_dat_01 = 10 'ligne de la premiere date
var_Premiere_dat_02 = 3 'colonne de la premiere date

nom_Hist = Sheets("variables").Cells(var01, var02).Value
nom_Vend = Replace(nom_Hist, "Hist", "Vend")
nom_Reli = Replace(nom_Hist, "Hist", "Reli")



'
'Boucle sur les dates
'
Do While Sheets(nom_Hist).Cells(var_Premiere_dat_01,
var_Premiere_dat_02).Value <> ""

'
'Boucle sur les refs
'
Do While Sheets(nom_Hist).Cells(var_Premiere_ref_01,
var_Premiere_ref_02).Value <> ""
'initialisation des variables qui seront communes aux Trois pays
Reappro_en_Cours = 0
Reappro_ref = 0

'
'Boucle sur les pays
'
Do While Sheets("variables").Cells(var01, var02).Value <> ""

nom_Hist = Sheets("variables").Cells(var01, var02).Value
nom_Vend = Replace(nom_Hist, "Hist", "Vend")
nom_Reli = Replace(nom_Hist, "Hist", "Reli")

'inscription d'informations de lecture
Sheets(nom_Vend).Cells(var_Premiere_ref_01, 1).Value Sheets(nom_Hist).Cells(var_Premiere_ref_01, 1).Value 'indique la
référence
Sheets(nom_Vend).Cells(10, var_Premiere_dat_02).Value Sheets(nom_Hist).Cells(10, var_Premiere_dat_02).Value 'indique la date
Sheets(nom_Reli).Cells(var_Premiere_ref_01, 1).Value Sheets(nom_Hist).Cells(var_Premiere_ref_01, 1).Value 'indique la
référence
Sheets(nom_Reli).Cells(10, var_Premiere_dat_02).Value Sheets(nom_Hist).Cells(10, var_Premiere_dat_02).Value 'indique la date
Sheets(nom_Reli).Cells(var_Premiere_ref_01, 2).Value = 0
'Premier reliquat à 0 (hypothèse!)

Call appli_table(var_Premiere_ref_01, var_Premiere_dat_02,
nom_Hist, nom_Vend, nom_Reli)

var02 = var02 + 1 'passage au pays / catégorie suivant

'progressBAR
Call increment_Progress_3
Loop
'
'Fin de boucle sur les pays
'
var_Premiere_ref_01 = var_Premiere_ref_01 + 1 'passage à la ref
suivante

'progressBAR
'Call increment_Progress_3

'réinitialisation pour les pays
var01 = 9
var02 = 1
Loop
'
'Fin de boucle sur les refs
'

'Passage à la date suivante
var_Premiere_dat_02 = var_Premiere_dat_02 + 1

'progressBAR
'Call increment_Progress_3

'réinitialisation pour les références
var_Premiere_ref_01 = 11 'ligne de la premiere ref
var_Premiere_ref_02 = 1
Loop
'
'Fin de boucle sur les dates
'

'retour à une page définie
Call choix_page_fin

Application.ScreenUpdating = True

End Sub

Sub appli_table(var_Premiere_ref_01, var_Premiere_dat_02, nom_Hist,
nom_Vend, nom_Reli)
'macro d'application de la table d'appro
Dim Var07, Var08 As Integer

'Application.ScreenUpdating = False

Temps_appro = Sheets("variables").Cells(13, 1).Value
nom_Reappro = Sheets("variables").Cells(12, 1).Value
nom_Stock = Sheets("variables").Cells(11, 1).Value
nom_Refer = Sheets("variables").Cells(14, 1).Value

Var07 = 1 'premiere ligne sur la page de réappro

'recopie l'etat du stock précédent si le stock est nul (pas d'information!)
If Sheets(nom_Stock).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value "" Then Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 - 1).Value

'recopie l'état du reliquat de la veille s'il est vide
If Sheets(nom_Reli).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value "" Then Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 - 1).Value

'si la boucle a déja été faite, reappro_ref n'est pas nul
'(s'il est nul, il n'y a de toute facon rien à modifier)
If Reappro_ref > 0 Then
If Reappro_ref < Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value Then
'Reliquat suppérieur à la réappro

'la baisse du reliquat n'intervient que le lendemain !
Sheets(nom_Reli).Cells(var_Premiere_ref_01, var_Premiere_dat_02 +
1).Value = Sheets(nom_Reli).Cells(var_Premiere_ref_01, var_Premiere_dat_02 +
1).Value - Reappro_ref

'convertir le reliquat fourni en vente
Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Reappro_ref

'toute la réappro à été consomée
Reappro_ref = 0
'MsgBox (Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value)
Else
'reliquat inférieur ou égal à la réappro

'convertir le reliquat fourni en vente
Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value

'nouveau niveau de réapprovisionnement
Reappro_ref = Reappro_ref -
Sheets(nom_Reli).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value

'reliquat du lendemain nul
Sheets(nom_Reli).Cells(var_Premiere_ref_01, var_Premiere_dat_02 +
1).Value = 0
'MsgBox (Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value)
End If
End If

'test pour définir état du stock, réapprovisionnement si necessaire
If Sheets(nom_Refer).Cells(var_Premiere_ref_01, 23).Value > 0 Then

'boucle sur la page réappro
Do While Sheets(nom_Reappro).Cells(Var07, 1).Value <> ""
If Sheets(nom_Stock).Cells(var_Premiere_ref_01, 1).Value Sheets(nom_Reappro).Cells(Var07, 1).Value Then 'ref identiques trouvées
If Sheets(nom_Hist).Cells(10, var_Premiere_dat_02).Value Sheets(nom_Reappro).Cells(Var07, 3).Value Then 'dates identiques trouvées

'réapprovisionnement
Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Sheets(nom_Reappro).Cells(Var07, 2).Value
Sheets(nom_Refer).Cells(var_Premiere_ref_01, 23).Value Sheets(nom_Refer).Cells(var_Premiere_ref_01, 23).Value - 1 'baisse de
l'indice de réapprovisionnement

Reappro_ref = Sheets(nom_Reappro).Cells(Var07, 2).Value

'
'Choix entre suppression et marquage "OK" sur les réappro
effectuées
'

If UserForm1.CheckBox1.Value = True Then

Sheets(nom_Reappro).Select
Range("A" & Var07 & ":C" & Var07).Select
Selection.Delete Shift:=xlUp
'ne pas oublier de décaler aussi var07 d'un cran vers le
haut !
Var07 = Var07 - 1
Else
Sheets(nom_Reappro).Cells(Var07, 1).Value = "OK - " &
Sheets(nom_Reappro).Cells(Var07, 1).Value 'ref de réappro
End If

'--------------------
'traitement reliquat
'--------------------



If Reappro_ref > 0 Then
'réapprovisionnement à effectuer sur cette ref
'(idem au cas précédent lorsque le scan était déjà fait)

If Reappro_ref < Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value Then
'Reliquat suppérieur à la réappro

'la baisse du reliquat n'intervient que le lendemain !
'Attention si le reliquat du lendemain est vide ou non
If Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value <> "" Then
'si le reliquat suivant n'est pas vide, on travaille
dessus
Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value = Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value - Reappro_ref
Else
'sinon, on part du reliquat du jour
Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value = Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value - Reappro_ref
End If

'convertir le reliquat fourni en vente
Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Reappro_ref

'toute la réappro à été consomée
Reappro_ref = 0
'MsgBox (Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value)
Else
'reliquat inférieur ou égal à la réappro

'convertir le reliquat fourni en vente
Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value

'nouveau niveau de réapprovisionnement
Reappro_ref = Reappro_ref -
Sheets(nom_Reli).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value

'reliquat du lendemain nul
Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value = 0
'MsgBox (Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value)
End If
End If
Else
'La date ne correspond pas, mais la commande est en cours
Reappro_en_Cours = Reappro_en_Cours +
Sheets(nom_Reappro).Cells(Var07, 2).Value
End If
End If

'Passage à la réappro suivante
Var07 = Var07 + 1
Loop
End If

'fourniture lorsqu'il y a une commande
If Sheets(nom_Hist).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value <>
"" Then
'Si une commande de la ref pour ce pays est détectée

'informations de vendu pour taux de service
If Sheets(nom_Hist).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value <= Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value Then
'commande inférieure ou egale au stock
'vendu = vendu + commande
Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Sheets(nom_Hist).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value
Else
'commande supérieure au stock
If Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value > 0 Then
'commande supérieure au stock et stock positif

'vendu = vendu + stock
Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value

'reliquat lendemain = reliquat lendemain + commande - stock (et
non le vendu qui peut contenir des fournitures de reliquat)
Sheets(nom_Reli).Cells(var_Premiere_ref_01, var_Premiere_dat_02
+ 1).Value = Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Sheets(nom_Hist).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value - Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value
'MsgBox (Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value)
Else
'vente supérieur au stock et stock négatif
'vendu = vendu + 0 (?! le laisse???)
Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + 0
'reliquat lendemain = reliquat lendemain + commande
'Attention si le reliquat du lendemain est vide ou non
If Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value <> "" Then
'si le reliquat suivant n'est pas vide, on travaille dessus
Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value = Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value + Sheets(nom_Hist).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value
Else
'sinon, on part du reliquat du jour
Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value = Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Sheets(nom_Hist).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value
End If

'MsgBox (Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value)
End If
End If

'déduction du stock
Sheets(nom_Stock).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value
= Sheets(nom_Stock).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value -
Sheets(nom_Hist).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value
End If

'test de réappro apres fourniture
'Var07 = 1 'premiere ligne sur la page de réappro
If Sheets(nom_Stock).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value +
Reappro_en_Cours <= Sheets(nom_Refer).Cells(var_Premiere_ref_01, 21).Value
Then 'seuil mini atteint en tenant compte des réappro en cours
'commande de réapprovisionnement
'Do While Sheets(nom_Reappro).Cells(Var07, 1).Value <> "" 'selection de
la premiere ligne vide
'Var07 = Var07 + 1
'Loop
If Sheets(nom_Refer).Cells(var_Premiere_ref_01, 22).Value -
Sheets(nom_Stock).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value -
Reappro_en_Cours > 0 Then 'Sheets(nom_Refer).Cells(var_Premiere_ref_01,
21).Value - Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value - Reappro_en_Cours > 0 Then 'test pour ne pas
approvisionner 0
Sheets(nom_Reappro).Cells(Var07, 1).Value Sheets(nom_Refer).Cells(var_Premiere_ref_01, 1).Value 'ref de réappro
Sheets(nom_Reappro).Cells(Var07, 2).Value Sheets(nom_Refer).Cells(var_Premiere_ref_01, 22).Value -
Sheets(nom_Stock).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value -
Reappro_en_Cours 'quantité de réappro tenant compte du delais de réappro et
de la quantité restant en stock
Sheets(nom_Reappro).Cells(Var07, 3).Value Sheets(nom_Hist).Cells(10, var_Premiere_dat_02).Value + Temps_appro 'date de
réappro tenant compte du delais de réappro

Sheets(nom_Refer).Cells(var_Premiere_ref_01, 23).Value Sheets(nom_Refer).Cells(var_Premiere_ref_01, 23).Value + 1 'monte l'indice
de réapprovisionnement
End If
End If

'Application.ScreenUpdating = True

End Sub

Sub nettoyage_preventif()

Application.ScreenUpdating = False
Dim var01, var02 As Integer

var01 = 9 'ligne sur laquelle se trouve les noms des onglets "catégories"
var02 = 1 'colonne traitée


'page de réappro
Sheets(Sheets("variables").Cells(12, 1).Value).Select
Columns("A:C").Select
Selection.ClearContents

'page niveau de stock
Sheets(Sheets("variables").Cells(11, 1).Value).Select
Range("C11:IV65536").Select
Selection.ClearContents

'page quantités vendues et reliquats
Do While Sheets("variables").Cells(var01, var02).Value <> ""

nom_Hist = Sheets("variables").Cells(var01, var02).Value
nom_Vend = Replace(nom_Hist, "Hist", "Vend")
nom_Reli = Replace(nom_Hist, "Hist", "Reli")

Sheets(nom_Vend).Select
Range("C11:IV65536").Select
Selection.ClearContents

Sheets(nom_Reli).Select ' Reli_com_ TEST2_C Reli_com_ TEST_C
Range("C11:IV65536").Select
Selection.ClearContents

var02 = var02 + 1

Loop

'suppression du nombre de réappro en cours
Sheets(Sheets("variables").Cells(14, 1).Value).Select
Range("W11:W65536").Select
Selection.ClearContents

'retour à une page définie
Call choix_page_fin

Application.ScreenUpdating = True
End Sub


Sub chemin_complet()

Application.ScreenUpdating = False

Dim var01, var02 As Integer

var01 = 9 'ligne sur laquelle se trouve les noms des onglets "catégories"
var02 = 1 'colonne traitée

var_Premiere_ref_01 = 11 'ligne de la premiere ref
var_Premiere_ref_02 = 1 'colonne de la premiere ref

var_Premiere_dat_01 = 10 'ligne de la premiere date
var_Premiere_dat_02 = 3 'colonne de la premiere date

nom_Hist = Sheets("variables").Cells(var01, var02).Value
nom_Vend = Replace(nom_Hist, "Hist", "Vend")
nom_Reli = Replace(nom_Hist, "Hist", "Reli")



'
'Boucle sur les dates
'
Do While Sheets(nom_Hist).Cells(var_Premiere_dat_01,
var_Premiere_dat_02).Value <> ""

'
'Boucle sur les refs
'
Do While Sheets(nom_Hist).Cells(var_Premiere_ref_01,
var_Premiere_ref_02).Value <> ""
'initialisation des variables qui seront communes aux Trois pays
Reappro_en_Cours = 0
Reappro_ref = 0

'
'Boucle sur les pays
'
Do While Sheets("variables").Cells(var01, var02).Value <> ""

nom_Hist = Sheets("variables").Cells(var01, var02).Value
nom_Vend = Replace(nom_Hist, "Hist", "Vend")
nom_Reli = Replace(nom_Hist, "Hist", "Reli")

'inscription d'informations de lecture
Sheets(nom_Vend).Cells(var_Premiere_ref_01, 1).Value Sheets(nom_Hist).Cells(var_Premiere_ref_01, 1).Value 'indique la
référence
Sheets(nom_Vend).Cells(10, var_Premiere_dat_02).Value Sheets(nom_Hist).Cells(10, var_Premiere_dat_02).Value 'indique la date
Sheets(nom_Reli).Cells(var_Premiere_ref_01, 1).Value Sheets(nom_Hist).Cells(var_Premiere_ref_01, 1).Value 'indique la
référence
Sheets(nom_Reli).Cells(10, var_Premiere_dat_02).Value Sheets(nom_Hist).Cells(10, var_Premiere_dat_02).Value 'indique la date
Sheets(nom_Reli).Cells(var_Premiere_ref_01, 2).Value = 0
'Premier reliquat à 0 (hypothèse!)

Call appli_table(var_Premiere_ref_01, var_Premiere_dat_02,
nom_Hist, nom_Vend, nom_Reli)

var02 = var02 + 1 'passage au pays / catégorie suivant

'progressBAR
Call increment_Progress_3
Loop
'
'Fin de boucle sur les pays
'
var_Premiere_ref_01 = var_Premiere_ref_01 + 1 'passage à la ref
suivante

'progressBAR
'Call increment_Progress_3

'réinitialisation pour les pays
var01 = 9
var02 = 1
Loop
'
'Fin de boucle sur les refs
'

'Passage à la date suivante
var_Premiere_dat_02 = var_Premiere_dat_02 + 1

'progressBAR
'Call increment_Progress_3

'réinitialisation pour les références
var_Premiere_ref_01 = 11 'ligne de la premiere ref
var_Premiere_ref_02 = 1
Loop
'
'Fin de boucle sur les dates
'

'retour à une page définie
Call choix_page_fin

Application.ScreenUpdating = True

End Sub

Sub appli_table(var_Premiere_ref_01, var_Premiere_dat_02, nom_Hist,
nom_Vend, nom_Reli)
'macro d'application de la table d'appro
Dim Var07, Var08 As Integer

'Application.ScreenUpdating = False

Temps_appro = Sheets("variables").Cells(13, 1).Value
nom_Reappro = Sheets("variables").Cells(12, 1).Value
nom_Stock = Sheets("variables").Cells(11, 1).Value
nom_Refer = Sheets("variables").Cells(14, 1).Value

Var07 = 1 'premiere ligne sur la page de réappro

'recopie l'etat du stock précédent si le stock est nul (pas d'information!)
If Sheets(nom_Stock).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value "" Then Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 - 1).Value

'recopie l'état du reliquat de la veille s'il est vide
If Sheets(nom_Reli).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value "" Then Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 - 1).Value

'si la boucle a déja été faite, reappro_ref n'est pas nul
'(s'il est nul, il n'y a de toute facon rien à modifier)
If Reappro_ref > 0 Then
If Reappro_ref < Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value Then
'Reliquat suppérieur à la réappro

'la baisse du reliquat n'intervient que le lendemain !
Sheets(nom_Reli).Cells(var_Premiere_ref_01, var_Premiere_dat_02 +
1).Value = Sheets(nom_Reli).Cells(var_Premiere_ref_01, var_Premiere_dat_02 +
1).Value - Reappro_ref

'convertir le reliquat fourni en vente
Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Reappro_ref

'toute la réappro à été consomée
Reappro_ref = 0
'MsgBox (Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value)
Else
'reliquat inférieur ou égal à la réappro

'convertir le reliquat fourni en vente
Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value

'nouveau niveau de réapprovisionnement
Reappro_ref = Reappro_ref -
Sheets(nom_Reli).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value

'reliquat du lendemain nul
Sheets(nom_Reli).Cells(var_Premiere_ref_01, var_Premiere_dat_02 +
1).Value = 0
'MsgBox (Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value)
End If
End If

'test pour définir état du stock, réapprovisionnement si necessaire
If Sheets(nom_Refer).Cells(var_Premiere_ref_01, 23).Value > 0 Then

'boucle sur la page réappro
Do While Sheets(nom_Reappro).Cells(Var07, 1).Value <> ""
If Sheets(nom_Stock).Cells(var_Premiere_ref_01, 1).Value Sheets(nom_Reappro).Cells(Var07, 1).Value Then 'ref identiques trouvées
If Sheets(nom_Hist).Cells(10, var_Premiere_dat_02).Value Sheets(nom_Reappro).Cells(Var07, 3).Value Then 'dates identiques trouvées

'réapprovisionnement
Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Sheets(nom_Reappro).Cells(Var07, 2).Value
Sheets(nom_Refer).Cells(var_Premiere_ref_01, 23).Value Sheets(nom_Refer).Cells(var_Premiere_ref_01, 23).Value - 1 'baisse de
l'indice de réapprovisionnement

Reappro_ref = Sheets(nom_Reappro).Cells(Var07, 2).Value

'
'Choix entre suppression et marquage "OK" sur les réappro
effectuées
'

If UserForm1.CheckBox1.Value = True Then

Sheets(nom_Reappro).Select
Range("A" & Var07 & ":C" & Var07).Select
Selection.Delete Shift:=xlUp
'ne pas oublier de décaler aussi var07 d'un cran vers le
haut !
Var07 = Var07 - 1
Else
Sheets(nom_Reappro).Cells(Var07, 1).Value = "OK - " &
Sheets(nom_Reappro).Cells(Var07, 1).Value 'ref de réappro
End If

'--------------------
'traitement reliquat
'--------------------



If Reappro_ref > 0 Then
'réapprovisionnement à effectuer sur cette ref
'(idem au cas précédent lorsque le scan était déjà fait)

If Reappro_ref < Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value Then
'Reliquat suppérieur à la réappro

'la baisse du reliquat n'intervient que le lendemain !
'Attention si le reliquat du lendemain est vide ou non
If Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value <> "" Then
'si le reliquat suivant n'est pas vide, on travaille
dessus
Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value = Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value - Reappro_ref
Else
'sinon, on part du reliquat du jour
Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value = Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value - Reappro_ref
End If

'convertir le reliquat fourni en vente
Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Reappro_ref

'toute la réappro à été consomée
Reappro_ref = 0
'MsgBox (Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value)
Else
'reliquat inférieur ou égal à la réappro

'convertir le reliquat fourni en vente
Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value

'nouveau niveau de réapprovisionnement
Reappro_ref = Reappro_ref -
Sheets(nom_Reli).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value

'reliquat du lendemain nul
Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value = 0
'MsgBox (Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value)
End If
End If
Else
'La date ne correspond pas, mais la commande est en cours
Reappro_en_Cours = Reappro_en_Cours +
Sheets(nom_Reappro).Cells(Var07, 2).Value
End If
End If

'Passage à la réappro suivante
Var07 = Var07 + 1
Loop
End If

'fourniture lorsqu'il y a une commande
If Sheets(nom_Hist).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value <>
"" Then
'Si une commande de la ref pour ce pays est détectée

'informations de vendu pour taux de service
If Sheets(nom_Hist).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value <= Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value Then
'commande inférieure ou egale au stock
'vendu = vendu + commande
Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Sheets(nom_Hist).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value
Else
'commande supérieure au stock
If Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value > 0 Then
'commande supérieure au stock et stock positif

'vendu = vendu + stock
Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value

'reliquat lendemain = reliquat lendemain + commande - stock (et
non le vendu qui peut contenir des fournitures de reliquat)
Sheets(nom_Reli).Cells(var_Premiere_ref_01, var_Premiere_dat_02
+ 1).Value = Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Sheets(nom_Hist).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value - Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value
'MsgBox (Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value)
Else
'vente supérieur au stock et stock négatif
'vendu = vendu + 0 (?! le laisse???)
Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value = Sheets(nom_Vend).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + 0
'reliquat lendemain = reliquat lendemain + commande
'Attention si le reliquat du lendemain est vide ou non
If Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value <> "" Then
'si le reliquat suivant n'est pas vide, on travaille dessus
Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value = Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value + Sheets(nom_Hist).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value
Else
'sinon, on part du reliquat du jour
Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02 + 1).Value = Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value + Sheets(nom_Hist).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value
End If

'MsgBox (Sheets(nom_Reli).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value)
End If
End If

'déduction du stock
Sheets(nom_Stock).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value
= Sheets(nom_Stock).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value -
Sheets(nom_Hist).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value
End If

'test de réappro apres fourniture
'Var07 = 1 'premiere ligne sur la page de réappro
If Sheets(nom_Stock).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value +
Reappro_en_Cours <= Sheets(nom_Refer).Cells(var_Premiere_ref_01, 21).Value
Then 'seuil mini atteint en tenant compte des réappro en cours
'commande de réapprovisionnement
'Do While Sheets(nom_Reappro).Cells(Var07, 1).Value <> "" 'selection de
la premiere ligne vide
'Var07 = Var07 + 1
'Loop
If Sheets(nom_Refer).Cells(var_Premiere_ref_01, 22).Value -
Sheets(nom_Stock).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value -
Reappro_en_Cours > 0 Then 'Sheets(nom_Refer).Cells(var_Premiere_ref_01,
21).Value - Sheets(nom_Stock).Cells(var_Premiere_ref_01,
var_Premiere_dat_02).Value - Reappro_en_Cours > 0 Then 'test pour ne pas
approvisionner 0
Sheets(nom_Reappro).Cells(Var07, 1).Value Sheets(nom_Refer).Cells(var_Premiere_ref_01, 1).Value 'ref de réappro
Sheets(nom_Reappro).Cells(Var07, 2).Value Sheets(nom_Refer).Cells(var_Premiere_ref_01, 22).Value -
Sheets(nom_Stock).Cells(var_Premiere_ref_01, var_Premiere_dat_02).Value -
Reappro_en_Cours 'quantité de réappro tenant compte du delais de réappro et
de la quantité restant en stock
Sheets(nom_Reappro).Cells(Var07, 3).Value Sheets(nom_Hist).Cells(10, var_Premiere_dat_02).Value + Temps_appro 'date de
réappro tenant compte du delais de réappro

Sheets(nom_Refer).Cells(var_Premiere_ref_01, 23).Value Sheets(nom_Refer).Cells(var_Premiere_ref_01, 23).Value + 1 'monte l'indice
de réapprovisionnement
End If
End If

'Application.ScreenUpdating = True

End Sub

Sub nettoyage_preventif()

Application.ScreenUpdating = False
Dim var01, var02 As Integer

var01 = 9 'ligne sur laquelle se trouve les noms des onglets "catégories"
var02 = 1 'colonne traitée


'page de réappro
Sheets(Sheets("variables").Cells(12, 1).Value).Select
Columns("A:C").Select
Selection.ClearContents

'page niveau de stock
Sheets(Sheets("variables").Cells(11, 1).Value).Select
Range("C11:IV65536").Select
Selection.ClearContents

'page quantités vendues et reliquats
Do While Sheets("variables").Cells(var01, var02).Value <> ""

nom_Hist = Sheets("variables").Cells(var01, var02).Value
nom_Vend = Replace(nom_Hist, "Hist", "Vend")
nom_Reli = Replace(nom_Hist, "Hist", "Reli")

Sheets(nom_Vend).Select
Range("C11:IV65536").Select
Selection.ClearContents

Sheets(nom_Reli).Select ' Reli_com_ TEST2_C Reli_com_ TEST_C
Range("C11:IV65536").Select
Selection.ClearContents

var02 = var02 + 1

Loop

'suppression du nombre de réappro en cours
Sheets(Sheets("variables").Cells(14, 1).Value).Select
Range("W11:W65536").Select
Selection.ClearContents

'retour à une page définie
Call choix_page_fin

Application.ScreenUpdating = True
End Sub








"anomymousA" a écrit dans le message
de news:
re,

effectivement, c'est difficile sans voir ton code de savoir ce qui peut
être

optimisable et de comprendre finement ta demande.

Cependant, quand tu dis que tu ne sais pas te servir d'un array, je te
donne

un exemple.
Dim Tabentree ' en l'occurence ce sera de type variant
Tabentree = Range("A1:J58597").Value
MsgBox Tabentree(58597, 10) te renvoie la cellule cells(58597,10) ou
J58597.

Ce qui est un peu long, c'est le chargement en mémoire du tableau et j'ai
vérifié la limitation du nombre de données n'est lié qu'à la taille
mémoire

dispo .
Ensuite tu fais toutes les opérations que tu veux sur ton tableau et tu
renvoies à la plage de cellules le tableau par
Range("A1:J58597").Value=tabentree.

Si donc dans ton code les références à tes cellules sont de la forme
cells(I,J), il est possible de transformer le code en faisant un
Rechercher/Remplacer cells (I,J) par tabentree(I,J) puisque c'est
formellement la même chose.
Sinon, pas de sortie possible.

Toutefois, 30000 lignes avec 200 colonnes, c'est plutot du domaine
d'ACCESS.


A+



Salut
merci à tous les deux pour vos pistes ;)

sans rentrer dans le détails je simule un magasin virtuel et son stock
pour


le faire vivre et voir les fluctuations... les lignes sont les articles,
les


colonnes les jours...d'ou ma matrice de fou.
je pense qu'en array, ca irait plus vite, du moins c'est ce que j'ai pu
lire


sur le net, mais je ne sais absolument pas comment travailler avec
array, de


plus... je dirais que rien n'est développé avec cette méthode, donc il
faudrait mieux trouver autre chose que de repenser tout le systeme.
Application screenupdating est à false au maximum, les scans sont
difficilement optimisables... malheureusement :(
quel est le generateur d'évenement, et à quoi sert il ? de meme comment
le


regle t on à false, suivant ce que c'est c'est une manip que je peux
tester


! Dans l'ensemble toutes mes variables sont déclarées en integer et en
string, il n'y a que trés peu d'exeption...

sur le fond, mon algo n'est pas secret, les valeurs qu'il y a dedans,
ouais,


mais c'est tres simple d'en generer des fausses par exemple, mais
surtout,


ce qui est contraignant c'est que toute la mécanique est énorme (6 ou 7
modules différents) et tiens dant un fichier de 40Mo... difficile de
vous


donner tout ca ici !
schematiquement, le fonctionnement est le suivant : je regarde ce qu'on
me


commande, j'impute mon stock, je verifie ce qui me reste, et je commande
si


necessaire, au jour suivant, je regarde ce qui arrive (précedement
commandé)


et je refais toutes les op précedents...sur 30000 ref... pendant 6
mois...



si vous avez d'autres idée..

je pense qu'une piste qui pourrait me faire gagner du temps c'est lors
de la


réapprovisionnement ! la j'ai une pile de commande qui s'allonge, avec
la


ref et la date à laquelle la commande est livre, je scanne une premiere
fois


pour compter ce que je recois le jour, et en mme temps ce que je vais
recevoir les jours suivant (il me faut cette info)... ensuite je
rescanne


pour avoir la premiere case vide, et inscrire une commande de réappro si
besoin est... peut etre que je ne pourrai scanner qu'une fois et me
souvenir


de la premiere ligne libre. mais sinon je ne voie pas d'autre piste.



"anomymousA" a écrit dans le
message


de news:
bonjour,

Quelques idées en vrac:

d'abord passer les ranges sous forme de tableaux et faire les calculs
sur



les tableaux ce qui améliore nettement voire très nettement (de
l'ordre de



1
à 5 voir plus le temps de calcul).
Je ne me rappelle plus trop la limite des tableaux mais ca doit
pouvoir



passer.
Economiser la mémoire en déclarant précisement tes variables selon le
minimum requis ( integer au lieu de variant si tu ne déclarais rien).

Ensuite s'il s'agit de formules et que tu n'utilises pas les tableaux,
empêcher le calcul automatique car à chque fois que tu vas écrire une
formule, Excel va recalculer l'ensemble et lancer le calcul à la fin (
possible que ca ne fasse pas gagener beaucoupe de temps, à voir !!).
Désactiver le gestionnaire d'evenements (applcation.enableventsúlse)
si



ce
n'est pas handaicapant dans les clalculs et desactiver le
raffraichissement

de l'écran (Application.screenupdatingúlse).
Eviter les formules matricielles.

Utiliser les macros Excel4 ou les XLL. Il parait que c'est + rapide.

Enfin, si tout ça est trop long, passer à ACCESS.

Intéressant de savoir comment tu t'en es sorti et ce qui marche le
mieux.




Bon courage, A+


Salut

j'ai quasiment fini une appli sous exel avec de tres nombreux
calculs




dedans, et suites aux premiers essais, j'estime les temps de calculs
à




plusieurs heures (17...)
savez vous s'il y a des moyens pour mettre un turbo quelques part
dans




exel
et augmenter sa vitesse de calcul ?

je ne peux pas rentrer trop dans les détails de l'applis se serait
trop




long
mais pour vous aiguiller par rapport à ce quelle fait, en gros, elle
scanne,


ligne par ligne et colonne par colonne des valeurs, pour attribuer
sur




des
onglet différents différent resultats... la matrice de base est de
l'ordre


de 30000lignes x 200colonnes

merci d'avance :)

--
Encore merci / Thanks a lot !

@ plus
Elicend
________________________

Attention adresse e-mail :
inconicoAfreePOINTfr
A = @
POINT = .

Be Careful e-mail :
inconicoAfreePOINTfr
A = @
POINT = .
________________________














1 2