realisation d'une macro avec plusieurs variables

lao31

XLDnaute Occasionnel
Bonjour le forum et bonnes fetes de fin d'années a tous et toutes.

Pour profiter du temps de libre en ces fetes de fin d'année, je me casse la tete sur un fichier ou avec des formules multiples j'arrive tant bien que mal a faire ce que je desire.
Mon fichier initial est tellement long que je suis intimement convaincu qu'avec une macro, je pourrai faire tourner les calculs beaucoup plus facilment, mon soucis est que je vois kidée des variables, mais je suis incapable d'ecrire cette macro.
cela pourrait etre du style Do while un objectif a atteindre .
la ou cela se complique c'est que j'ai plusieurs objectifs et pire qui peuvent etre chercher en meme temps.
c'est la qu'il me faudrait plusieurs variables sorte de boucle.
Mais comme d'habitude mes explications sont franchement pas tres claires, pourtant j'essai.
Difficile de formuler simplement quand on sais ce que l'on veux mais qu'on ne sait pas comment faire.
Je vous join donc un fichier.
Et d'avance je vous remerçie
Cordialement
lao31
 

Pièces jointes

  • cumul.xlsm
    23.2 KB · Affichages: 58
  • cumul.xlsm
    23.2 KB · Affichages: 56

lao31

XLDnaute Occasionnel
Re : realisation d'une macro avec plusieurs variables

Bonjour le forum, Dranbed,

Voila c'est corrigé enfin je l'espère, j'ai changé le nom de la feuille, j'ai pas l'impression quue cela est changé quoique ce soit.
ssi premiere erreur il y a je pense donc et c'est evidnt qu'il y en a d'autre. cela devint pathetique.
Merçi tout de même pour le temps consacré.
Cordialement
Lao31
 

Dranreb

XLDnaute Barbatruc
Re : realisation d'une macro avec plusieurs variables

En gros ça devrait être quelque chose comme ça :
VB:
Sub For_X_to_Next_Colonne()
Dim Limite As Double, TE(), CE&, TS(), L&, CS&, CSMax&, LDéb&(1 To 500), TypeCalcul(1 To 500) As String
Limite = Feuil1.[I1].Value
TE = Intersect(Feuil1.[A3:G1048576], Feuil1.UsedRange).Value
ReDim TS(1 To UBound(TE, 1), 1 To 500)
For L = 1 To UBound(TE, 1)
   If Not IsEmpty(TE(L, 5)) Then
      CSMax = CSMax + 1
      LDéb(CSMax) = L
      TypeCalcul(CSMax) = TE(L, 5)
      End If
   For CS = 1 To CSMax
      Select Case TypeCalcul(CS)
         Case "ask": TS(L, CS) = TE(LDéb(CS), ???) + (TE(L, ???) - TE(LDéb(CS), ???)) * 1000
         Case "bid": TS(L, CS) = TE(L???, ???) + (TE(L???, ???) - TE(L???, ???)) * 1000
         End Select
      If TS(L, CS) > Limite Then TypeCalcul(CS) = ""
      Next CS, L
Intersect(Feuil1.[H3:FDX1048576], Feuil1.UsedRange).ClearContents
Feuil1.[H3].Resize(UBound(TS, 1), CSMax).Value = TS
End Sub
 
Dernière édition:

lao31

XLDnaute Occasionnel
Re : realisation d'une macro avec plusieurs variables

Re Le forum, Dranreb

Excusez moi, mais au risque d'être ridicule, mais ces ??? ci dessous:
Case "ask": TS(L, CS) = TE(LDéb(CS), ???) + (TE(L, ???) - TE(LDéb(CS), ???)) * 1000
Case "bid": TS(L, CS) = TE(L???, ???) + (TE(L???, ???) - TE(L???, ???)) * 1000

est ce intentionnel ou est ce des valeurs que je dois mettre ?
. j'ai fais un copier coller betement cela ne fonctionne pas
cordialement
 

Dranreb

XLDnaute Barbatruc
Re : realisation d'une macro avec plusieurs variables

Ce sont les numéros d'ordre de colonnes des données à prendre que vous devez mettre à la place. Tâchez de retenir désormais, puisque vous ne l'aviez apparemment pas encore compris que pour accéder à un élément d'un tableau en mémoire à 2 dimensions le 1er indice représente le numéro de ligne et le second le numéro de colonne.
 
Dernière édition:

lao31

XLDnaute Occasionnel
Re : realisation d'une macro avec plusieurs variables

Re le forum, Dranreb

J'avais compris cela, mais mon soucis est que je savais pas qu'elle colonne mettre.
j'ai fais une tentative avec le N descolonne correspondant a mes souhait et en corrigeant les formules suis je sur le bon chemin
voir ci dessous:

Sub For_X_to_Next_Colonne1()
Dim Limite As Double, TE(), CE&, TS(), L&, CS&, CSMax&, LDéb&(1 To 500), TypeCalcul(1 To 500) As String
Limite = Feuil1.[I1].Value
TE = Intersect(Feuil1.[A3:G1048576], Feuil1.UsedRange).Value
ReDim TS(1 To UBound(TE, 1), 1 To 500)
For L = 1 To UBound(TE, 1)
If Not IsEmpty(TE(L, 5)) Then
CSMax = CSMax + 1
LDéb(CSMax) = L ' j'obtien a ce niveau l'indice n'appartient pas a la selection.
TypeCalcul(CSMax) = TE(L, 5)
End If
For CS = 1 To CSMax
Select Case TypeCalcul(CS)
Case "ask": TS(L, CS) = TE(LDéb(CS), 6) * (TE(L, 2) - TE(LDéb(CS), 6)) * 1000
Case "bid": TS(L, CS) = TE(L, 6) * (TE(L, 6) - TE(L, 3)) * 1000
End Select
If TS(L, CS) > Limite Then TypeCalcul(CS) = ""
Next CS, L
Intersect(Feuil1.[H3:FDX1048576], Feuil1.UsedRange).ClearContents
Feuil1.[H3].Resize(UBound(TS, 1), CSMax).Value = TS
End Sub

Quel peut etre le soucis ?
cordialement
lao31
 

Dranreb

XLDnaute Barbatruc
Re : realisation d'une macro avec plusieurs variables

Oui, je m'en suis aperçu après coup. Il veut incrémenter CSMax à chaque ligne, donc plus de 500, parce que TE(L, 5) ne peut pas être Empty, du fait que c'est une formule qui y laisse un texte vide en guise de valeur. Il faut donc If TE(L, 5) <> "" Then
 

lao31

XLDnaute Occasionnel
Re : realisation d'une macro avec plusieurs variables

Re le forum, Dranreb

Super cela fonctionne, c'est stupefiant la rapidité. 'ai fais juste une petite modification et j'en suis fier ( rires)
Case "bid": TS(L, CS) = TE(LDéb(CS), 7) * (TE(LDéb(CS), 6) - TE(L, 3)) * 10000
merçi Dranreb pour ta patience, tes compétences. Je te garanti que je vais potasser pour comprendre maintenant les tableaux car c'est tres rapide et je n'ai pas le risque de faire d'erreur de manip.
vais essayer de l'adapté a mon fichier qui est énorme mais je pense que cela sera bon.
Merçi une nouvelle fois.
Cordialement
Lao31
 

lao31

XLDnaute Occasionnel
Re : realisation d'une macro avec plusieurs variables

Bonjour le forum, Dranred,

Coucou me revoilou, maintenant j'ai un autre probleme, je vais essayer d'être le plus clair possible:
Quand j'adapte la derniere macro (qui fonctionne parfaitement sur le fichier qui était joint) j'ai un plantage a ce niveau:
ReDim TS(1 To UBound(TE, 1), 1 To 500), j'en deduis que le nombre 500 n'est pas bon et donc je l'augmente a 1000 ou 10000
et la j'obtien le message memoire insuffisante.
Mon fichier contient 390 000 ligne et je dois avoir environ 1000 ask bid.
cela veux dire que j'aurai besoin pour avoir les resultats d'environ 1000 colonnes.
ma question est: est e que mon fichier est trop volumineux ? dans un post precedent tu avais changé une ligne
If Not IsEmpty(TE(L, 5)) Then par if <> "" et cela fonctionnais parfatement. ?
peut etre que la macro passe par toute les lignes avant de trouver bid ou ask et donc cela fais trop d'operation et donc pas assez de memoire ?
n'y a t'il pas moyen d'aller directement au suivant bid ou ask ?
j'ai 4 G de ram cela est il suffisant ? vola j'essai de comprendre une nouvelle fois.
J'ai teste avec mon de ligne et cela fonctionne parfaitement dois je y aller a tatons pour savoir a combien de lignes j'ai droit ?
voila Dranreb tu vois j'essai de comprendre et j'espere que tu as compris mon probleme.
cordialement
lao31
 

Dranreb

XLDnaute Barbatruc
Re : realisation d'une macro avec plusieurs variables

Bonjour.
Oui c'est sûr, ça change tout si vos donnée sont si volumineuses, ça ne peut pas tenir intégralement en mémoire !
On peut déclarer de très gros tableaux mais quand même pas gros à ce point !
Mais à quoi ça peut donc bien servir tout ça ??
Est il nécessaire de produire le détail de ces calculs dans des colonnes séparées ? Apparemment vous semblez seulement chercher à savoir à quel moment les calculs des ask et bid dépassent une certaine limite, et ça on pourrait l'indiquer toujours dans les mêmes colonnes.
Mais il y a plus simple : restez à 500 colonnes maxi, voire moins, mais si CMax à atteint le maxi ne l'incrémentez plus mais cherchez un Cs ou TypeCalcul(CS) = "" et réutilisez le pour cet autre ask ou bid.
 

lao31

XLDnaute Occasionnel
Re : realisation d'une macro avec plusieurs variables

Bonjour le forum, Dranreb

Est il nécessaire de produire le détail de ces calculs dans des colonnes séparées ? NON, mais je faisais cela parceque parfois et meme souvent il y a un nouveau ask ou bid qui se presente avant que la limite du ou des precedents soit atteintes, d'ou mon idée de changer de colonnes a chaque fois. mais effectivement, nous pourrions utilises la meme colonne si limite atteinte plutot que de partir sur une colonne de plus. mais idem la je ne vois pas comment l'ecrire en VBA.

Mais il y a plus simple : restez à 500 colonnes maxi, voire moins, mais si CMax à atteint le maxi ne l'incrémentez plus mais cherchez un Cs ou TypeCalcul(CS) = "" et réutilisez le pour cet autre ask ou bid.

j'avoue que je ne sais pas comment faire egalement car comment savoir le maxi de CMAX ? et comment chercher le CS ou Type=""
On pourrait aussi mettre les Bid que dans certaines colonnes et les asks dans d'autres determinées a l'avance ? quand un colonne de Bid ou ask serait disponible, on l'utiliserai cela ferait economiser ou reduire le nombre de colonne considerablement, mais les calculs restent les même, mais avecmoins de colonne alors je vois pas si c'est mieux ??
je peux reduire les lignes par 10 a savoir envriron 40000 lignes, mais cela me demanderait encore beaucoup de travail.et surtout cela serait moins precis. mais si j'ai pas le choix.
merçi en tout cas d'etre aussi assidu et de m'eclairer
Cordialement
Lao31
 

lao31

XLDnaute Occasionnel
Re : realisation d'une macro avec plusieurs variables

kakafokon certes mais voila toujour le probleme de memoire insuffisante
est ce que les ouvelles instructions post pecedent sont bien placé ?
Sub Colonne1()
Dim Limite As Double, TE(), CE&, TS(), L&, CS&, CSMax&, LDéb&(1 To 500), TypeCalcul(1 To 500) As String
Limite = Feuil1.[I1].Value
TE = Intersect(Feuil1.[A3:G1048576], Feuil1.UsedRange).Value
ReDim TS(1 To UBound(TE, 1), 1 To 500)
For L = 1 To UBound(TE, 1)
' If Not IsEmpty(TE(L, 5)) Then
If (TE(L, 5)) <> "" Then
CSMax = CSMax + 1
LDéb(CSMax) = L
TypeCalcul(CSMax) = TE(L, 5)
End If
'For CS = 1 To CSMax
For CS = 1 To UBound(TypeCalcul)
Select Case TypeCalcul(CS)
Case "ask": TS(L, CS) = TE(LDéb(CS), 7) * (TE(L, 2) - TE(LDéb(CS), 6)) * 10000
Case "bid": TS(L, CS) = TE(LDéb(CS), 7) * (TE(LDéb(CS), 6) - TE(L, 3)) * 10000
End Select
If TS(L, CS) > Limite Then TypeCalcul(CS) = ""
Next CS
If TypeCalcul(CS) = "" Then Exit For
Next L
Intersect(Feuil1.[H3:FDX1048576], Feuil1.UsedRange).ClearContents
Feuil1.[H3].Resize(UBound(TS, 1), CSMax).Value = TS
End Sub

cordialement
lao31
 

Dranreb

XLDnaute Barbatruc
Re : realisation d'une macro avec plusieurs variables

Non. Pas du tout. C'est derrière le If TE(L, 5) <> "" Then qu'il faut le mettre.
Ne plus utiliser CSMax mais CS après en avoir cherché un où TypeCalcul(CS) = ""
CSMax doit être calculé quand même pour savoir à la fin le nombre de colonnes qu'il faut décharger. Et même le nombre de calculs en cours possibles.
Mais seulement juste avant le End If faire If CS > CSMax then CSMax = CS
 
Dernière édition:

lao31

XLDnaute Occasionnel
Re : realisation d'une macro avec plusieurs variables

Ne plus utiliser CSMax mais CS après en avoir cherché un où TypeCalcul(CS) = ""
ok je supprime donc:CSMax =CSmax +1
CSMax doit être calculé quand même pour savoir à la fin le nombre de colonnes qu'il faut décharger. Et même le nombre de calculs en cours possibles.
comme je l'ai supprimé je ne comprends plus .
voila ou j'en suis avec maintenant un soucis au niveaudes IF .

Sub Colonne1()
Dim Limite As Double, TE(), CE&, TS(), L&, CS&, CSMax&, LDéb&(1 To 500), TypeCalcul(1 To 500) As String
Limite = Feuil1.[I1].Value
TE = Intersect(Feuil1.[A3:G1048576], Feuil1.UsedRange).Value
ReDim TS(1 To UBound(TE, 1), 1 To 500)
For L = 1 To UBound(TE, 1)
' If Not IsEmpty(TE(L, 5)) Then
If (TE(L, 5)) <> "" Then
For CS = 1 To UBound(TypeCalcul)
CSMax = CSMax + 1
LDéb(CSMax) = L
' TypeCalcul(CSMax) = TE(L, 5)
TypeCalcul(CS) = ""
If CS > CSMax Then CSMax = CS
End If ' End if sans bloc if ???
'For CS = 1 To CSMax

Select Case TypeCalcul(CS)
Case "ask": TS(L, CS) = TE(LDéb(CS), 7) * (TE(L, 2) - TE(LDéb(CS), 6)) * 10000
Case "bid": TS(L, CS) = TE(LDéb(CS), 7) * (TE(LDéb(CS), 6) - TE(L, 3)) * 10000
End Select

If TS(L, CS) > Limite Then TypeCalcul(CS) = ""
Next CS
If TypeCalcul(CS) = "" Then Exit For
Next L
Intersect(Feuil1.[H3:FDX1048576], Feuil1.UsedRange).ClearContents
Feuil1.[H3].Resize(UBound(TS, 1), CSMax).Value = TS
End Sub

ou est l'erreur ???
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 489
Messages
2 088 854
Membres
103 975
dernier inscrit
denry