En travaillant sur les cellules du champ le temps est multiplié par
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémoire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur les cellules
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JBOk....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JBC'est pour ca que les contenus de mes cellules sont déjà en m émoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de la somme
dans ref.
'Si cette somme des élément de 120 à 142 alors r doit être egale a
120, et si cette somme est aussi supérieur à 0 pour les élé ments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à des cellules , or
c'est justement ce que je veux éviter, puisque mes cellules sont
déjà en mémoire
Merci pour ton aide.Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Integer) As D ouble
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JBMerci JB, mais mon tableau se remplit avec le contenu de cellul es, puis
deviens ensuite indépendante de ces dernières. Je travaille avec une
matrice pour faire le moins possible référence à la feuil le (ca me
fait gagné pas mal de temps), donc je préfere au maximum éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de ma matrice ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter du temps de
traitement à cette macro (qui peut déjà durer plusieurs d izaines de
minutes en fonction du volume de données).Bonjour,
Function MaSomme(champ As Range, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JBBonjour,
dans une macro, je créer une matrice qui correspond à l a valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je voudrais p ouvoir faire
une somme avec différents élément de cette matrice, p ar exemple :
Je voudrais sommer toutes les valeurs entre l'index 120 et l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour écrire cette chose
toute simple.
Merci pour votre aide.
En travaillant sur les cellules du champ le temps est multiplié par
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémoire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur les cellules
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Ok....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....
J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JB
C'est pour ca que les contenus de mes cellules sont déjà en m émoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de la somme
dans ref.
'Si cette somme des élément de 120 à 142 alors r doit être egale a
120, et si cette somme est aussi supérieur à 0 pour les élé ments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à des cellules , or
c'est justement ce que je veux éviter, puisque mes cellules sont
déjà en mémoire
Merci pour ton aide.
Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Integer) As D ouble
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JB
Merci JB, mais mon tableau se remplit avec le contenu de cellul es, puis
deviens ensuite indépendante de ces dernières. Je travaille avec une
matrice pour faire le moins possible référence à la feuil le (ca me
fait gagné pas mal de temps), donc je préfere au maximum éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de ma matrice ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter du temps de
traitement à cette macro (qui peut déjà durer plusieurs d izaines de
minutes en fonction du volume de données).
Bonjour,
Function MaSomme(champ As Range, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JB
Bonjour,
dans une macro, je créer une matrice qui correspond à l a valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je voudrais p ouvoir faire
une somme avec différents élément de cette matrice, p ar exemple :
Je voudrais sommer toutes les valeurs entre l'index 120 et l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour écrire cette chose
toute simple.
Merci pour votre aide.
En travaillant sur les cellules du champ le temps est multiplié par
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémoire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur les cellules
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JBOk....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JBC'est pour ca que les contenus de mes cellules sont déjà en m émoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de la somme
dans ref.
'Si cette somme des élément de 120 à 142 alors r doit être egale a
120, et si cette somme est aussi supérieur à 0 pour les élé ments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à des cellules , or
c'est justement ce que je veux éviter, puisque mes cellules sont
déjà en mémoire
Merci pour ton aide.Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Integer) As D ouble
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JBMerci JB, mais mon tableau se remplit avec le contenu de cellul es, puis
deviens ensuite indépendante de ces dernières. Je travaille avec une
matrice pour faire le moins possible référence à la feuil le (ca me
fait gagné pas mal de temps), donc je préfere au maximum éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de ma matrice ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter du temps de
traitement à cette macro (qui peut déjà durer plusieurs d izaines de
minutes en fonction du volume de données).Bonjour,
Function MaSomme(champ As Range, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JBBonjour,
dans une macro, je créer une matrice qui correspond à l a valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je voudrais p ouvoir faire
une somme avec différents élément de cette matrice, p ar exemple :
Je voudrais sommer toutes les valeurs entre l'index 120 et l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour écrire cette chose
toute simple.
Merci pour votre aide.
Merci JB,
Je croyais que le set = Feuil5....
mettait tout en mémoire, et non l'objet cellule comme l'indique Ange
Ounis.
Merci pour vos conseils.En travaillant sur les cellules du champ le temps est multiplié par
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémoire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur les cellul es
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JBOk....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JBC'est pour ca que les contenus de mes cellules sont déjà en m émoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de la so mme
dans ref.
'Si cette somme des élément de 120 à 142 alors r doit êtr e egale a
120, et si cette somme est aussi supérieur à 0 pour les él éments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à des cellul es, or
c'est justement ce que je veux éviter, puisque mes cellules sont
déjà en mémoire
Merci pour ton aide.Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Integer) As Double
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JBMerci JB, mais mon tableau se remplit avec le contenu de cell ules, puis
deviens ensuite indépendante de ces dernières. Je travail le avec une
matrice pour faire le moins possible référence à la feu ille (ca me
fait gagné pas mal de temps), donc je préfere au maximum éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de ma matric e ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter du temps de
traitement à cette macro (qui peut déjà durer plusieurs dizaines de
minutes en fonction du volume de données).Bonjour,
Function MaSomme(champ As Range, d As Integer, f As Integer ) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JBBonjour,
dans une macro, je créer une matrice qui correspond à la valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je voudrais pouvoir faire
une somme avec différents élément de cette matrice, par exemple :
Je voudrais sommer toutes les valeurs entre l'index 120 e t l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour écrir e cette chose
toute simple.
Merci pour votre aide.
Merci JB,
Je croyais que le set = Feuil5....
mettait tout en mémoire, et non l'objet cellule comme l'indique Ange
Ounis.
Merci pour vos conseils.
En travaillant sur les cellules du champ le temps est multiplié par
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémoire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur les cellul es
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Ok....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....
J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JB
C'est pour ca que les contenus de mes cellules sont déjà en m émoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de la so mme
dans ref.
'Si cette somme des élément de 120 à 142 alors r doit êtr e egale a
120, et si cette somme est aussi supérieur à 0 pour les él éments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à des cellul es, or
c'est justement ce que je veux éviter, puisque mes cellules sont
déjà en mémoire
Merci pour ton aide.
Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Integer) As Double
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JB
Merci JB, mais mon tableau se remplit avec le contenu de cell ules, puis
deviens ensuite indépendante de ces dernières. Je travail le avec une
matrice pour faire le moins possible référence à la feu ille (ca me
fait gagné pas mal de temps), donc je préfere au maximum éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de ma matric e ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter du temps de
traitement à cette macro (qui peut déjà durer plusieurs dizaines de
minutes en fonction du volume de données).
Bonjour,
Function MaSomme(champ As Range, d As Integer, f As Integer ) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JB
Bonjour,
dans une macro, je créer une matrice qui correspond à la valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je voudrais pouvoir faire
une somme avec différents élément de cette matrice, par exemple :
Je voudrais sommer toutes les valeurs entre l'index 120 e t l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour écrir e cette chose
toute simple.
Merci pour votre aide.
Merci JB,
Je croyais que le set = Feuil5....
mettait tout en mémoire, et non l'objet cellule comme l'indique Ange
Ounis.
Merci pour vos conseils.En travaillant sur les cellules du champ le temps est multiplié par
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémoire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur les cellul es
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JBOk....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JBC'est pour ca que les contenus de mes cellules sont déjà en m émoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de la so mme
dans ref.
'Si cette somme des élément de 120 à 142 alors r doit êtr e egale a
120, et si cette somme est aussi supérieur à 0 pour les él éments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à des cellul es, or
c'est justement ce que je veux éviter, puisque mes cellules sont
déjà en mémoire
Merci pour ton aide.Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Integer) As Double
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JBMerci JB, mais mon tableau se remplit avec le contenu de cell ules, puis
deviens ensuite indépendante de ces dernières. Je travail le avec une
matrice pour faire le moins possible référence à la feu ille (ca me
fait gagné pas mal de temps), donc je préfere au maximum éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de ma matric e ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter du temps de
traitement à cette macro (qui peut déjà durer plusieurs dizaines de
minutes en fonction du volume de données).Bonjour,
Function MaSomme(champ As Range, d As Integer, f As Integer ) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JBBonjour,
dans une macro, je créer une matrice qui correspond à la valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je voudrais pouvoir faire
une somme avec différents élément de cette matrice, par exemple :
Je voudrais sommer toutes les valeurs entre l'index 120 e t l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour écrir e cette chose
toute simple.
Merci pour votre aide.
En travailler sur les cellules avec Application.Sum(), les temps de
calcul sont également très bon:
Sub essaiAvecFonction2()
t = Timer()
temp = MaSomme2([B1:B20000], 1, 20000)
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Function MaSomme2(champ, d As Integer, f As Integer) As Double
MaSomme2 = Application.Sum(Range(champ(d), champ(f)))
End FunctionMerci JB,
Je croyais que le set = Feuil5....
mettait tout en mémoire, et non l'objet cellule comme l'indique Ange
Ounis.
Merci pour vos conseils.En travaillant sur les cellules du champ le temps est multiplié par
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémoire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur les cell ules
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JBOk....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JBC'est pour ca que les contenus de mes cellules sont déjà en mémoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de la somme
dans ref.
'Si cette somme des élément de 120 à 142 alors r doit ê tre egale a
120, et si cette somme est aussi supérieur à 0 pour les é léments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à des cell ules, or
c'est justement ce que je veux éviter, puisque mes cellules s ont
déjà en mémoire
Merci pour ton aide.Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Integer) As Double
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JBMerci JB, mais mon tableau se remplit avec le contenu de ce llules, puis
deviens ensuite indépendante de ces dernières. Je trava ille avec une
matrice pour faire le moins possible référence à la f euille (ca me
fait gagné pas mal de temps), donc je préfere au maximu m éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de ma matr ice ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter du temp s de
traitement à cette macro (qui peut déjà durer plusieu rs dizaines de
minutes en fonction du volume de données).Bonjour,
Function MaSomme(champ As Range, d As Integer, f As Integ er) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JBBonjour,
dans une macro, je créer une matrice qui correspond à la valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je voudra is pouvoir faire
une somme avec différents élément de cette matric e, par exemple :
Je voudrais sommer toutes les valeurs entre l'index 120 et l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour écr ire cette chose
toute simple.
Merci pour votre aide.
En travailler sur les cellules avec Application.Sum(), les temps de
calcul sont également très bon:
Sub essaiAvecFonction2()
t = Timer()
temp = MaSomme2([B1:B20000], 1, 20000)
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Function MaSomme2(champ, d As Integer, f As Integer) As Double
MaSomme2 = Application.Sum(Range(champ(d), champ(f)))
End Function
Merci JB,
Je croyais que le set = Feuil5....
mettait tout en mémoire, et non l'objet cellule comme l'indique Ange
Ounis.
Merci pour vos conseils.
En travaillant sur les cellules du champ le temps est multiplié par
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémoire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur les cell ules
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Ok....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....
J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JB
C'est pour ca que les contenus de mes cellules sont déjà en mémoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de la somme
dans ref.
'Si cette somme des élément de 120 à 142 alors r doit ê tre egale a
120, et si cette somme est aussi supérieur à 0 pour les é léments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à des cell ules, or
c'est justement ce que je veux éviter, puisque mes cellules s ont
déjà en mémoire
Merci pour ton aide.
Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Integer) As Double
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JB
Merci JB, mais mon tableau se remplit avec le contenu de ce llules, puis
deviens ensuite indépendante de ces dernières. Je trava ille avec une
matrice pour faire le moins possible référence à la f euille (ca me
fait gagné pas mal de temps), donc je préfere au maximu m éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de ma matr ice ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter du temp s de
traitement à cette macro (qui peut déjà durer plusieu rs dizaines de
minutes en fonction du volume de données).
Bonjour,
Function MaSomme(champ As Range, d As Integer, f As Integ er) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JB
Bonjour,
dans une macro, je créer une matrice qui correspond à la valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je voudra is pouvoir faire
une somme avec différents élément de cette matric e, par exemple :
Je voudrais sommer toutes les valeurs entre l'index 120 et l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour écr ire cette chose
toute simple.
Merci pour votre aide.
En travailler sur les cellules avec Application.Sum(), les temps de
calcul sont également très bon:
Sub essaiAvecFonction2()
t = Timer()
temp = MaSomme2([B1:B20000], 1, 20000)
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Function MaSomme2(champ, d As Integer, f As Integer) As Double
MaSomme2 = Application.Sum(Range(champ(d), champ(f)))
End FunctionMerci JB,
Je croyais que le set = Feuil5....
mettait tout en mémoire, et non l'objet cellule comme l'indique Ange
Ounis.
Merci pour vos conseils.En travaillant sur les cellules du champ le temps est multiplié par
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémoire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur les cell ules
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JBOk....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JBC'est pour ca que les contenus de mes cellules sont déjà en mémoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de la somme
dans ref.
'Si cette somme des élément de 120 à 142 alors r doit ê tre egale a
120, et si cette somme est aussi supérieur à 0 pour les é léments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à des cell ules, or
c'est justement ce que je veux éviter, puisque mes cellules s ont
déjà en mémoire
Merci pour ton aide.Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Integer) As Double
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JBMerci JB, mais mon tableau se remplit avec le contenu de ce llules, puis
deviens ensuite indépendante de ces dernières. Je trava ille avec une
matrice pour faire le moins possible référence à la f euille (ca me
fait gagné pas mal de temps), donc je préfere au maximu m éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de ma matr ice ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter du temp s de
traitement à cette macro (qui peut déjà durer plusieu rs dizaines de
minutes en fonction du volume de données).Bonjour,
Function MaSomme(champ As Range, d As Integer, f As Integ er) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JBBonjour,
dans une macro, je créer une matrice qui correspond à la valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je voudra is pouvoir faire
une somme avec différents élément de cette matric e, par exemple :
Je voudrais sommer toutes les valeurs entre l'index 120 et l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour écr ire cette chose
toute simple.
Merci pour votre aide.
Malheureusement, je ne peux pas mettre le tableau en mémoire, il est
très vite trop gros, et il n'y a donc plus assez de mémoire
disponible.
Je vais devoir rester avec le set table = Feuil.....En travailler sur les cellules avec Application.Sum(), les temps de
calcul sont également très bon:
Sub essaiAvecFonction2()
t = Timer()
temp = MaSomme2([B1:B20000], 1, 20000)
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Function MaSomme2(champ, d As Integer, f As Integer) As Double
MaSomme2 = Application.Sum(Range(champ(d), champ(f)))
End FunctionMerci JB,
Je croyais que le set = Feuil5....
mettait tout en mémoire, et non l'objet cellule comme l'indique Ange
Ounis.
Merci pour vos conseils.En travaillant sur les cellules du champ le temps est multiplié p ar
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémoire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur les ce llules
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JBOk....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JBC'est pour ca que les contenus de mes cellules sont déjà en mémoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de l a somme
dans ref.
'Si cette somme des élément de 120 à 142 alors r doit être egale a
120, et si cette somme est aussi supérieur à 0 pour les éléments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à des ce llules, or
c'est justement ce que je veux éviter, puisque mes cellules sont
déjà en mémoire
Merci pour ton aide.Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Integer ) As Double
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JBMerci JB, mais mon tableau se remplit avec le contenu de cellules, puis
deviens ensuite indépendante de ces dernières. Je tra vaille avec une
matrice pour faire le moins possible référence à la feuille (ca me
fait gagné pas mal de temps), donc je préfere au maxi mum éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de ma ma trice ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter du te mps de
traitement à cette macro (qui peut déjà durer plusi eurs dizaines de
minutes en fonction du volume de données).Bonjour,
Function MaSomme(champ As Range, d As Integer, f As Int eger) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JBBonjour,
dans une macro, je créer une matrice qui correspond à la valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je voud rais pouvoir faire
une somme avec différents élément de cette matr ice, par exemple :
Je voudrais sommer toutes les valeurs entre l'index 1 20 et l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour é crire cette chose
toute simple.
Merci pour votre aide.
Malheureusement, je ne peux pas mettre le tableau en mémoire, il est
très vite trop gros, et il n'y a donc plus assez de mémoire
disponible.
Je vais devoir rester avec le set table = Feuil.....
En travailler sur les cellules avec Application.Sum(), les temps de
calcul sont également très bon:
Sub essaiAvecFonction2()
t = Timer()
temp = MaSomme2([B1:B20000], 1, 20000)
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Function MaSomme2(champ, d As Integer, f As Integer) As Double
MaSomme2 = Application.Sum(Range(champ(d), champ(f)))
End Function
Merci JB,
Je croyais que le set = Feuil5....
mettait tout en mémoire, et non l'objet cellule comme l'indique Ange
Ounis.
Merci pour vos conseils.
En travaillant sur les cellules du champ le temps est multiplié p ar
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémoire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur les ce llules
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Ok....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....
J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JB
C'est pour ca que les contenus de mes cellules sont déjà en mémoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de l a somme
dans ref.
'Si cette somme des élément de 120 à 142 alors r doit être egale a
120, et si cette somme est aussi supérieur à 0 pour les éléments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à des ce llules, or
c'est justement ce que je veux éviter, puisque mes cellules sont
déjà en mémoire
Merci pour ton aide.
Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Integer ) As Double
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JB
Merci JB, mais mon tableau se remplit avec le contenu de cellules, puis
deviens ensuite indépendante de ces dernières. Je tra vaille avec une
matrice pour faire le moins possible référence à la feuille (ca me
fait gagné pas mal de temps), donc je préfere au maxi mum éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de ma ma trice ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter du te mps de
traitement à cette macro (qui peut déjà durer plusi eurs dizaines de
minutes en fonction du volume de données).
Bonjour,
Function MaSomme(champ As Range, d As Integer, f As Int eger) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JB
Bonjour,
dans une macro, je créer une matrice qui correspond à la valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je voud rais pouvoir faire
une somme avec différents élément de cette matr ice, par exemple :
Je voudrais sommer toutes les valeurs entre l'index 1 20 et l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour é crire cette chose
toute simple.
Merci pour votre aide.
Malheureusement, je ne peux pas mettre le tableau en mémoire, il est
très vite trop gros, et il n'y a donc plus assez de mémoire
disponible.
Je vais devoir rester avec le set table = Feuil.....En travailler sur les cellules avec Application.Sum(), les temps de
calcul sont également très bon:
Sub essaiAvecFonction2()
t = Timer()
temp = MaSomme2([B1:B20000], 1, 20000)
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Function MaSomme2(champ, d As Integer, f As Integer) As Double
MaSomme2 = Application.Sum(Range(champ(d), champ(f)))
End FunctionMerci JB,
Je croyais que le set = Feuil5....
mettait tout en mémoire, et non l'objet cellule comme l'indique Ange
Ounis.
Merci pour vos conseils.En travaillant sur les cellules du champ le temps est multiplié p ar
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémoire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur les ce llules
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JBOk....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JBC'est pour ca que les contenus de mes cellules sont déjà en mémoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de l a somme
dans ref.
'Si cette somme des élément de 120 à 142 alors r doit être egale a
120, et si cette somme est aussi supérieur à 0 pour les éléments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à des ce llules, or
c'est justement ce que je veux éviter, puisque mes cellules sont
déjà en mémoire
Merci pour ton aide.Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Integer ) As Double
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JBMerci JB, mais mon tableau se remplit avec le contenu de cellules, puis
deviens ensuite indépendante de ces dernières. Je tra vaille avec une
matrice pour faire le moins possible référence à la feuille (ca me
fait gagné pas mal de temps), donc je préfere au maxi mum éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de ma ma trice ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter du te mps de
traitement à cette macro (qui peut déjà durer plusi eurs dizaines de
minutes en fonction du volume de données).Bonjour,
Function MaSomme(champ As Range, d As Integer, f As Int eger) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JBBonjour,
dans une macro, je créer une matrice qui correspond à la valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je voud rais pouvoir faire
une somme avec différents élément de cette matr ice, par exemple :
Je voudrais sommer toutes les valeurs entre l'index 1 20 et l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour é crire cette chose
toute simple.
Merci pour votre aide.
Ouah, la différence entre mettre set ou non est de 1 à 10 dans le
traitement de ma macro.
Pour un tableau completement remplis (de 65535 ligne et de 150 colonnes
environ, ca met 4 minutes 32 sans le set, a plus de 35 minutes avec le
set.
Par contre ca explose la mémoire. Faudrait que je trouve une solution
pour boucler et mettre en mémoire un millier de ligne à chaque fois.Malheureusement, je ne peux pas mettre le tableau en mémoire, il est
très vite trop gros, et il n'y a donc plus assez de mémoire
disponible.
Je vais devoir rester avec le set table = Feuil.....En travailler sur les cellules avec Application.Sum(), les temps de
calcul sont également très bon:
Sub essaiAvecFonction2()
t = Timer()
temp = MaSomme2([B1:B20000], 1, 20000)
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Function MaSomme2(champ, d As Integer, f As Integer) As Double
MaSomme2 = Application.Sum(Range(champ(d), champ(f)))
End FunctionMerci JB,
Je croyais que le set = Feuil5....
mettait tout en mémoire, et non l'objet cellule comme l'indique A nge
Ounis.
Merci pour vos conseils.En travaillant sur les cellules du champ le temps est multiplié par
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémoire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur les cellules
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JBOk....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JBC'est pour ca que les contenus de mes cellules sont déj à en mémoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de la somme
dans ref.
'Si cette somme des élément de 120 à 142 alors r doit être egale a
120, et si cette somme est aussi supérieur à 0 pour les éléments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à des cellules, or
c'est justement ce que je veux éviter, puisque mes cellul es sont
déjà en mémoire
Merci pour ton aide.Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Integ er) As Double
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JBMerci JB, mais mon tableau se remplit avec le contenu d e cellules, puis
deviens ensuite indépendante de ces dernières. Je t ravaille avec une
matrice pour faire le moins possible référence à la feuille (ca me
fait gagné pas mal de temps), donc je préfere au ma ximum éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de ma matrice ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter du temps de
traitement à cette macro (qui peut déjà durer plu sieurs dizaines de
minutes en fonction du volume de données).Bonjour,
Function MaSomme(champ As Range, d As Integer, f As I nteger) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JBBonjour,
dans une macro, je créer une matrice qui correspo nd à la valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je vo udrais pouvoir faire
une somme avec différents élément de cette ma trice, par exemple :
Je voudrais sommer toutes les valeurs entre l'index 120 et l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour écrire cette chose
toute simple.
Merci pour votre aide.
Ouah, la différence entre mettre set ou non est de 1 à 10 dans le
traitement de ma macro.
Pour un tableau completement remplis (de 65535 ligne et de 150 colonnes
environ, ca met 4 minutes 32 sans le set, a plus de 35 minutes avec le
set.
Par contre ca explose la mémoire. Faudrait que je trouve une solution
pour boucler et mettre en mémoire un millier de ligne à chaque fois.
Malheureusement, je ne peux pas mettre le tableau en mémoire, il est
très vite trop gros, et il n'y a donc plus assez de mémoire
disponible.
Je vais devoir rester avec le set table = Feuil.....
En travailler sur les cellules avec Application.Sum(), les temps de
calcul sont également très bon:
Sub essaiAvecFonction2()
t = Timer()
temp = MaSomme2([B1:B20000], 1, 20000)
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Function MaSomme2(champ, d As Integer, f As Integer) As Double
MaSomme2 = Application.Sum(Range(champ(d), champ(f)))
End Function
Merci JB,
Je croyais que le set = Feuil5....
mettait tout en mémoire, et non l'objet cellule comme l'indique A nge
Ounis.
Merci pour vos conseils.
En travaillant sur les cellules du champ le temps est multiplié par
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémoire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur les cellules
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Ok....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....
J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JB
C'est pour ca que les contenus de mes cellules sont déj à en mémoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de la somme
dans ref.
'Si cette somme des élément de 120 à 142 alors r doit être egale a
120, et si cette somme est aussi supérieur à 0 pour les éléments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à des cellules, or
c'est justement ce que je veux éviter, puisque mes cellul es sont
déjà en mémoire
Merci pour ton aide.
Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Integ er) As Double
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JB
Merci JB, mais mon tableau se remplit avec le contenu d e cellules, puis
deviens ensuite indépendante de ces dernières. Je t ravaille avec une
matrice pour faire le moins possible référence à la feuille (ca me
fait gagné pas mal de temps), donc je préfere au ma ximum éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de ma matrice ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter du temps de
traitement à cette macro (qui peut déjà durer plu sieurs dizaines de
minutes en fonction du volume de données).
Bonjour,
Function MaSomme(champ As Range, d As Integer, f As I nteger) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JB
Bonjour,
dans une macro, je créer une matrice qui correspo nd à la valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je vo udrais pouvoir faire
une somme avec différents élément de cette ma trice, par exemple :
Je voudrais sommer toutes les valeurs entre l'index 120 et l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour écrire cette chose
toute simple.
Merci pour votre aide.
Ouah, la différence entre mettre set ou non est de 1 à 10 dans le
traitement de ma macro.
Pour un tableau completement remplis (de 65535 ligne et de 150 colonnes
environ, ca met 4 minutes 32 sans le set, a plus de 35 minutes avec le
set.
Par contre ca explose la mémoire. Faudrait que je trouve une solution
pour boucler et mettre en mémoire un millier de ligne à chaque fois.Malheureusement, je ne peux pas mettre le tableau en mémoire, il est
très vite trop gros, et il n'y a donc plus assez de mémoire
disponible.
Je vais devoir rester avec le set table = Feuil.....En travailler sur les cellules avec Application.Sum(), les temps de
calcul sont également très bon:
Sub essaiAvecFonction2()
t = Timer()
temp = MaSomme2([B1:B20000], 1, 20000)
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Function MaSomme2(champ, d As Integer, f As Integer) As Double
MaSomme2 = Application.Sum(Range(champ(d), champ(f)))
End FunctionMerci JB,
Je croyais que le set = Feuil5....
mettait tout en mémoire, et non l'objet cellule comme l'indique A nge
Ounis.
Merci pour vos conseils.En travaillant sur les cellules du champ le temps est multiplié par
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémoire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur les cellules
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JBOk....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JBC'est pour ca que les contenus de mes cellules sont déj à en mémoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de la somme
dans ref.
'Si cette somme des élément de 120 à 142 alors r doit être egale a
120, et si cette somme est aussi supérieur à 0 pour les éléments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à des cellules, or
c'est justement ce que je veux éviter, puisque mes cellul es sont
déjà en mémoire
Merci pour ton aide.Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Integ er) As Double
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JBMerci JB, mais mon tableau se remplit avec le contenu d e cellules, puis
deviens ensuite indépendante de ces dernières. Je t ravaille avec une
matrice pour faire le moins possible référence à la feuille (ca me
fait gagné pas mal de temps), donc je préfere au ma ximum éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de ma matrice ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter du temps de
traitement à cette macro (qui peut déjà durer plu sieurs dizaines de
minutes en fonction du volume de données).Bonjour,
Function MaSomme(champ As Range, d As Integer, f As I nteger) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JBBonjour,
dans une macro, je créer une matrice qui correspo nd à la valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je vo udrais pouvoir faire
une somme avec différents élément de cette ma trice, par exemple :
Je voudrais sommer toutes les valeurs entre l'index 120 et l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour écrire cette chose
toute simple.
Merci pour votre aide.
Avec cette solution, on n'utilise pas la mémoire centrale (très
rapide):
Sub essaiAvecFonction2()
t = Timer()
Set Monchamp = [B1:B20000]
temp = MaSomme2(Monchamp, 1, 20000)
MsgBox Timer() - t
MsgBox temp
End Sub
Function MaSomme2(champ, d As Integer, f As Integer) As Double
MaSomme2 = Application.Sum(Range(champ(d), champ(f)))
End Function
JBOuah, la différence entre mettre set ou non est de 1 à 10 dans le
traitement de ma macro.
Pour un tableau completement remplis (de 65535 ligne et de 150 colonnes
environ, ca met 4 minutes 32 sans le set, a plus de 35 minutes avec le
set.
Par contre ca explose la mémoire. Faudrait que je trouve une solution
pour boucler et mettre en mémoire un millier de ligne à chaque fois.Malheureusement, je ne peux pas mettre le tableau en mémoire, il est
très vite trop gros, et il n'y a donc plus assez de mémoire
disponible.
Je vais devoir rester avec le set table = Feuil.....En travailler sur les cellules avec Application.Sum(), les temps de
calcul sont également très bon:
Sub essaiAvecFonction2()
t = Timer()
temp = MaSomme2([B1:B20000], 1, 20000)
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Function MaSomme2(champ, d As Integer, f As Integer) As Double
MaSomme2 = Application.Sum(Range(champ(d), champ(f)))
End FunctionMerci JB,
Je croyais que le set = Feuil5....
mettait tout en mémoire, et non l'objet cellule comme l'indique Ange
Ounis.
Merci pour vos conseils.En travaillant sur les cellules du champ le temps est multipli é par
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémo ire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur le s cellules
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JBOk....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JBC'est pour ca que les contenus de mes cellules sont déj à en mémoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step 1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step 1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de la somme
dans ref.
'Si cette somme des élément de 120 à 142 alors r do it être egale a
120, et si cette somme est aussi supérieur à 0 pour l es éléments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à de s cellules, or
c'est justement ce que je veux éviter, puisque mes cell ules sont
déjà en mémoire
Merci pour ton aide.Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Int eger) As Double
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JBMerci JB, mais mon tableau se remplit avec le contenu de cellules, puis
deviens ensuite indépendante de ces dernières. Je travaille avec une
matrice pour faire le moins possible référence à la feuille (ca me
fait gagné pas mal de temps), donc je préfere au maximum éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de m a matrice ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter d u temps de
traitement à cette macro (qui peut déjà durer p lusieurs dizaines de
minutes en fonction du volume de données).Bonjour,
Function MaSomme(champ As Range, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JBBonjour,
dans une macro, je créer une matrice qui corres pond à la valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je voudrais pouvoir faire
une somme avec différents élément de cette matrice, par exemple :
Je voudrais sommer toutes les valeurs entre l'ind ex 120 et l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour écrire cette chose
toute simple.
Merci pour votre aide.
Avec cette solution, on n'utilise pas la mémoire centrale (très
rapide):
Sub essaiAvecFonction2()
t = Timer()
Set Monchamp = [B1:B20000]
temp = MaSomme2(Monchamp, 1, 20000)
MsgBox Timer() - t
MsgBox temp
End Sub
Function MaSomme2(champ, d As Integer, f As Integer) As Double
MaSomme2 = Application.Sum(Range(champ(d), champ(f)))
End Function
JB
Ouah, la différence entre mettre set ou non est de 1 à 10 dans le
traitement de ma macro.
Pour un tableau completement remplis (de 65535 ligne et de 150 colonnes
environ, ca met 4 minutes 32 sans le set, a plus de 35 minutes avec le
set.
Par contre ca explose la mémoire. Faudrait que je trouve une solution
pour boucler et mettre en mémoire un millier de ligne à chaque fois.
Malheureusement, je ne peux pas mettre le tableau en mémoire, il est
très vite trop gros, et il n'y a donc plus assez de mémoire
disponible.
Je vais devoir rester avec le set table = Feuil.....
En travailler sur les cellules avec Application.Sum(), les temps de
calcul sont également très bon:
Sub essaiAvecFonction2()
t = Timer()
temp = MaSomme2([B1:B20000], 1, 20000)
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Function MaSomme2(champ, d As Integer, f As Integer) As Double
MaSomme2 = Application.Sum(Range(champ(d), champ(f)))
End Function
Merci JB,
Je croyais que le set = Feuil5....
mettait tout en mémoire, et non l'objet cellule comme l'indique Ange
Ounis.
Merci pour vos conseils.
En travaillant sur les cellules du champ le temps est multipli é par
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémo ire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur le s cellules
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Ok....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....
J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JB
C'est pour ca que les contenus de mes cellules sont déj à en mémoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step 1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step 1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de la somme
dans ref.
'Si cette somme des élément de 120 à 142 alors r do it être egale a
120, et si cette somme est aussi supérieur à 0 pour l es éléments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à de s cellules, or
c'est justement ce que je veux éviter, puisque mes cell ules sont
déjà en mémoire
Merci pour ton aide.
Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Int eger) As Double
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JB
Merci JB, mais mon tableau se remplit avec le contenu de cellules, puis
deviens ensuite indépendante de ces dernières. Je travaille avec une
matrice pour faire le moins possible référence à la feuille (ca me
fait gagné pas mal de temps), donc je préfere au maximum éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de m a matrice ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter d u temps de
traitement à cette macro (qui peut déjà durer p lusieurs dizaines de
minutes en fonction du volume de données).
Bonjour,
Function MaSomme(champ As Range, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JB
Bonjour,
dans une macro, je créer une matrice qui corres pond à la valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je voudrais pouvoir faire
une somme avec différents élément de cette matrice, par exemple :
Je voudrais sommer toutes les valeurs entre l'ind ex 120 et l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour écrire cette chose
toute simple.
Merci pour votre aide.
Avec cette solution, on n'utilise pas la mémoire centrale (très
rapide):
Sub essaiAvecFonction2()
t = Timer()
Set Monchamp = [B1:B20000]
temp = MaSomme2(Monchamp, 1, 20000)
MsgBox Timer() - t
MsgBox temp
End Sub
Function MaSomme2(champ, d As Integer, f As Integer) As Double
MaSomme2 = Application.Sum(Range(champ(d), champ(f)))
End Function
JBOuah, la différence entre mettre set ou non est de 1 à 10 dans le
traitement de ma macro.
Pour un tableau completement remplis (de 65535 ligne et de 150 colonnes
environ, ca met 4 minutes 32 sans le set, a plus de 35 minutes avec le
set.
Par contre ca explose la mémoire. Faudrait que je trouve une solution
pour boucler et mettre en mémoire un millier de ligne à chaque fois.Malheureusement, je ne peux pas mettre le tableau en mémoire, il est
très vite trop gros, et il n'y a donc plus assez de mémoire
disponible.
Je vais devoir rester avec le set table = Feuil.....En travailler sur les cellules avec Application.Sum(), les temps de
calcul sont également très bon:
Sub essaiAvecFonction2()
t = Timer()
temp = MaSomme2([B1:B20000], 1, 20000)
MsgBox Timer() - t
MsgBox temp
End Sub
JB
Function MaSomme2(champ, d As Integer, f As Integer) As Double
MaSomme2 = Application.Sum(Range(champ(d), champ(f)))
End FunctionMerci JB,
Je croyais que le set = Feuil5....
mettait tout en mémoire, et non l'objet cellule comme l'indique Ange
Ounis.
Merci pour vos conseils.En travaillant sur les cellules du champ le temps est multipli é par
15:
Sub essaiSansFonction()
t = Timer()
Matable = [B1:B20000] ' 0,015 s (tableau en mémo ire
centrale)
'Set Matable = [B1:B20000] ' 0,23 s (on travaille sur le s cellules
du champ)
d = 1: f = 20000
temp = 0
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox Timer() - t
MsgBox temp
End Sub
JBOk....
je viens de comprendre le concept (fatigué !!!!!)
Merci pour ton aide.....J'ai changé Table en Matable :
Sub essaiSansFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
d = 3: f = 7
For i = d To f
temp = temp + Matable(i, 1)
Next i
MsgBox temp
End Sub
Sub essaiAvecFonction()
Matable = [B2:B10] ' transfert Array (ton tableau)
MsgBox MaSomme(Matable, 3, 7)
End Sub
Function MaSomme(a, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
JBC'est pour ca que les contenus de mes cellules sont déj à en mémoire,
et que je ne veux pas avoir à le refaire.
Extrait de ma macro :
'Mise en mémoire des parametres
Set ref = Feuil5.Range("G11:G587")
ligne_fichier = 0
ouverture_fichier "data"
ouverture_fichier "log"
mouvement 5, entete
LGN = Sheets("Data").Cells(65536, 1).End(xlUp).Row
'<<<Mise en mémoire de l'ensemble de la table>>>
Set table = Nothing
Set table = Feuil2.Range("A1:IV" & LGN)
For i = 2 To LGN
ligne_fichier = ligne_fichier + 1
If SOMMEDESELEMENTDEREFDE120A142 > 0 then r = 120: step 1 =
mouvement_adr(i): mouvement 5, step1 'ref 120->142
If SOMMEDESELEMENTDEREFDE143A165 > 0 then r = 143: step 1 =
mouvement_adr(i): mouvement 5, step1 'ref 143->165
'La valeur du r doit pouvoir être modifier en fonction de la somme
dans ref.
'Si cette somme des élément de 120 à 142 alors r do it être egale a
120, et si cette somme est aussi supérieur à 0 pour l es éléments de
143 à 165, elle doit ensuite prendre la valeur 143.
Dans ton exemple, tu fait de nouveau référence à de s cellules, or
c'est justement ce que je veux éviter, puisque mes cell ules sont
déjà en mémoire
Merci pour ton aide.Les calculs en mémoire centrale sont très rapides.
Function MaSomme(champ As Range, d As Integer, f As Int eger) As Double
a = champ ' copie dans un Array pour performances
temp = 0
For i = d To f
temp = temp + a(i, 1)
Next i
MaSomme = temp
End Function
Sub essai()
x = MaSomme([B2:B5], 2, 3)
MsgBox x
End Sub
JBMerci JB, mais mon tableau se remplit avec le contenu de cellules, puis
deviens ensuite indépendante de ces dernières. Je travaille avec une
matrice pour faire le moins possible référence à la feuille (ca me
fait gagné pas mal de temps), donc je préfere au maximum éviter d'y
retourner.
Donc faire la somme des éléments 120 à 142 de m a matrice ref.
Un truc genre :
Application.WorkSheetFunction.Sum(ref(120):ref(142))
Et le plus optimisé possible pour ne pas rajouter d u temps de
traitement à cette macro (qui peut déjà durer p lusieurs dizaines de
minutes en fonction du volume de données).Bonjour,
Function MaSomme(champ As Range, d As Integer, f As Integer) As Double
temp = 0
For i = d To f
temp = temp + champ(i)
Next i
MaSomme = temp
End Function
Sub essai()
MsgBox MaSomme([B2:B5], 2, 3)
End Sub
Cordialement JBBonjour,
dans une macro, je créer une matrice qui corres pond à la valeur de
plusieurs cellule :
Set ref = Feuil5.Range("G11:G587")
Pour valider un certain nombre d'opération, je voudrais pouvoir faire
une somme avec différents élément de cette matrice, par exemple :
Je voudrais sommer toutes les valeurs entre l'ind ex 120 et l'index 142.
Je n'arrive aps à trouver la bonne syntaxe pour écrire cette chose
toute simple.
Merci pour votre aide.