OVH Cloud OVH Cloud

vba tri variable indicée et recherche

3 réponses
Avatar
Schmitt
J'ai un tableau dans une variable indicée: montant(2000)
avec p exemples montant(1)=50, montant(2)=40 ....
1- comment trier ce tableau (je n'ai pas trouvé la fonction VBA
correspondante
2- Comment trouver un algorithme qui recherche tous les éléments dont la
somme est égal à une valeur donnée.
Par exemple quels sont tous les éléments dont la somme est égale 3000

J'en ai trouvé un mais beaucoup trop long pour les grosses valeur et qui
n'élimine pas les redondances
Le sujet est passionnant, mais j'ai peur d'y passer énormément de temps.

3 réponses

Avatar
anonymousA
bonjour,

pour ce qui est des algorithmes de tri, ca fait partie des sujets qu'on pose
toujours en 1ere année d'écoles en informatique ( quelquene soient les
niveaux d'ailleurs). Autant te dire donc que de ce côté, on trouve de tout du
plus simple au plus compliqué en passant par le plus efficace. Donc tu
pourrais en réaliser un toi-même . Par ailleurs, il n'existe pas de fonction
VBA pour trier un tableau mais il existe une méthode VBA pour trier une plage
de cellules. Tu peux utiliser ça si tu veux ( c'est une idée comme une autre)
en transformant ton tableau en une plage de cellules puis en faisant faire le
tri à Excel puis en récupérant les valeurs dans ce même tableau.C'est très
rapide .Jamais essayé par contre de comparer la vitesse entre un algorithme
de tri en mémoire et un alogorithme pasant par une affectation de plages. un
exemple ci-dessous

Dim tableau
Dim rng As Range

tableau = Sheets(1).Range("A1:A3844").Value

Sheets(2).Range("A1:A3844").Value = tableau
Set rng = Sheets(2).Range("A1:A3844")
rng.Sort Key1:=Sheets(2).Range("A1"), Order1:=xlAscending

tableau = rng.Value

si tu ne veux pas passer par une affectation à une plage de cellules mais
utiliser un laorithme de tri classques avec des valurs en mémoire, va voir du
côté du site de Frédéric Sigonneau p.e ou Excelabo. Ce que tu demandes est
déjà tout fait.

Pour ta 2eme question, bien sur que ca existe des programmes comme ca.Ceci
dit, le temps de calcul est d'autant plus long que les valeurs du tableau
sont nombreuses ( ce n'est pas la valeur du chiffre à atteindre qui y fait
quoique ce soit). C'est une pure question de maths.
Combien de combinaisons de K nombres parmi N nombres existe t-il à partir
d'une collection de N nombres.? Je te renvoie aux plaisanteries qu'on étudie
en Terminale et au binome de Newton ( la somme des combinaisons de k nombres
parmi N si on va de 1 à N est égale à 2 puissance N). Autant dire que tu peut
y passer un moment si N est grand.
Bon je t'en communiques un quand même , même si tu en as déja un. Attention,
il a des limitations.



'**************************************************************************
'Dans la procédure qui suit , on cherche à obtenir à partir d'une liste de
'valeurs ,en faire la combinaison pour atteindre une autre valeur située
'dans une cellule. Attention, le nombre de combinaisons possible étant
'très élevé, pour que le code puisse fonctionner, il faut limiter le nombre
'de valeurs dans la liste des valeurs.

'Rentre les valeurs en colonne B en commencant par B1
'Rentrer la valeur à atteindre en A1
'Faire tourner TestBldbin

'Ce programme testera toutes les combinaisons en colonnes en allant vers la
droite
'et evidemment ne peut aller plus loin que 254 colonnes. Si rien n'apparait
, il
'n' y a aucune combinaisons possibles. Plus il y a de nombres en colonne B,
plus le temps
'de calcul sera long.

Option Explicit
Sub bldbin(num As Long, bits As Long, arr() As Long)
Dim lNum As Long, i As Long, cnt As Long
lNum = num
' Dim sStr As String
' sStr = ""
cnt = 0
For i = bits - 1 To 0 Step -1
If lNum And 2 ^ i Then
cnt = cnt + 1
arr(i, 0) = 1
' sStr = sStr & "1"
Else
arr(i, 0) = 0
' sStr = sStr & "0"
End If
Next
' If cnt = 2 Then
' Debug.Print num, sStr
' End If
End Sub

Sub TestBldbin()
Dim i As Long
Dim bits As Long
Dim varr As Variant
Dim varr1() As Long
Dim rng As Range
Dim icol As Long
Dim tot As Long
Dim num As Long 'il peut être utile de passer à double si la liste est un
peu importante
icol = 0
Set rng = Range(Range("B1"), Range("B1").End(xlDown))
num = 2 ^ rng.Count - 1 '(formule du binome (1+1)^n = somme des combinaisons
C(n,k)
bits = rng.Count
varr = rng.Value
ReDim varr1(0 To bits - 1, 0 To 0)
For i = 0 To num
bldbin i, bits, varr1
tot = Application.SumProduct(varr, varr1)
If tot = Range("A1") Then
icol = icol + 1
If icol = 255 Then
MsgBox "too many columns, i is " & i & " of " & num & _
" combinations checked"
Exit Sub
End If
rng.Offset(0, icol) = varr1
End If
Next

End Sub

A+


J'ai un tableau dans une variable indicée: montant(2000)
avec p exemples montant(1)P, montant(2)@ ....
1- comment trier ce tableau (je n'ai pas trouvé la fonction VBA
correspondante
2- Comment trouver un algorithme qui recherche tous les éléments dont la
somme est égal à une valeur donnée.
Par exemple quels sont tous les éléments dont la somme est égale 3000

J'en ai trouvé un mais beaucoup trop long pour les grosses valeur et qui
n'élimine pas les redondances
Le sujet est passionnant, mais j'ai peur d'y passer énormément de temps.





Avatar
anonymousA
erratum: 2 puissance N-1 d'ailleurs très exactement car il ne sert à rien
evidemment de chercher le nombre de combinaisons de 0 nombres parmi N.

A+


bonjour,

pour ce qui est des algorithmes de tri, ca fait partie des sujets qu'on pose
toujours en 1ere année d'écoles en informatique ( quelquene soient les
niveaux d'ailleurs). Autant te dire donc que de ce côté, on trouve de tout du
plus simple au plus compliqué en passant par le plus efficace. Donc tu
pourrais en réaliser un toi-même . Par ailleurs, il n'existe pas de fonction
VBA pour trier un tableau mais il existe une méthode VBA pour trier une plage
de cellules. Tu peux utiliser ça si tu veux ( c'est une idée comme une autre)
en transformant ton tableau en une plage de cellules puis en faisant faire le
tri à Excel puis en récupérant les valeurs dans ce même tableau.C'est très
rapide .Jamais essayé par contre de comparer la vitesse entre un algorithme
de tri en mémoire et un alogorithme pasant par une affectation de plages. un
exemple ci-dessous

Dim tableau
Dim rng As Range

tableau = Sheets(1).Range("A1:A3844").Value

Sheets(2).Range("A1:A3844").Value = tableau
Set rng = Sheets(2).Range("A1:A3844")
rng.Sort Key1:=Sheets(2).Range("A1"), Order1:=xlAscending

tableau = rng.Value

si tu ne veux pas passer par une affectation à une plage de cellules mais
utiliser un laorithme de tri classques avec des valurs en mémoire, va voir du
côté du site de Frédéric Sigonneau p.e ou Excelabo. Ce que tu demandes est
déjà tout fait.

Pour ta 2eme question, bien sur que ca existe des programmes comme ca.Ceci
dit, le temps de calcul est d'autant plus long que les valeurs du tableau
sont nombreuses ( ce n'est pas la valeur du chiffre à atteindre qui y fait
quoique ce soit). C'est une pure question de maths.
Combien de combinaisons de K nombres parmi N nombres existe t-il à partir
d'une collection de N nombres.? Je te renvoie aux plaisanteries qu'on étudie
en Terminale et au binome de Newton ( la somme des combinaisons de k nombres
parmi N si on va de 1 à N est égale à 2 puissance N). Autant dire que tu peut
y passer un moment si N est grand.
Bon je t'en communiques un quand même , même si tu en as déja un. Attention,
il a des limitations.



'**************************************************************************
'Dans la procédure qui suit , on cherche à obtenir à partir d'une liste de
'valeurs ,en faire la combinaison pour atteindre une autre valeur située
'dans une cellule. Attention, le nombre de combinaisons possible étant
'très élevé, pour que le code puisse fonctionner, il faut limiter le nombre
'de valeurs dans la liste des valeurs.

'Rentre les valeurs en colonne B en commencant par B1
'Rentrer la valeur à atteindre en A1
'Faire tourner TestBldbin

'Ce programme testera toutes les combinaisons en colonnes en allant vers la
droite
'et evidemment ne peut aller plus loin que 254 colonnes. Si rien n'apparait
, il
'n' y a aucune combinaisons possibles. Plus il y a de nombres en colonne B,
plus le temps
'de calcul sera long.

Option Explicit
Sub bldbin(num As Long, bits As Long, arr() As Long)
Dim lNum As Long, i As Long, cnt As Long
lNum = num
' Dim sStr As String
' sStr = ""
cnt = 0
For i = bits - 1 To 0 Step -1
If lNum And 2 ^ i Then
cnt = cnt + 1
arr(i, 0) = 1
' sStr = sStr & "1"
Else
arr(i, 0) = 0
' sStr = sStr & "0"
End If
Next
' If cnt = 2 Then
' Debug.Print num, sStr
' End If
End Sub

Sub TestBldbin()
Dim i As Long
Dim bits As Long
Dim varr As Variant
Dim varr1() As Long
Dim rng As Range
Dim icol As Long
Dim tot As Long
Dim num As Long 'il peut être utile de passer à double si la liste est un
peu importante
icol = 0
Set rng = Range(Range("B1"), Range("B1").End(xlDown))
num = 2 ^ rng.Count - 1 '(formule du binome (1+1)^n = somme des combinaisons
C(n,k)
bits = rng.Count
varr = rng.Value
ReDim varr1(0 To bits - 1, 0 To 0)
For i = 0 To num
bldbin i, bits, varr1
tot = Application.SumProduct(varr, varr1)
If tot = Range("A1") Then
icol = icol + 1
If icol = 255 Then
MsgBox "too many columns, i is " & i & " of " & num & _
" combinations checked"
Exit Sub
End If
rng.Offset(0, icol) = varr1
End If
Next

End Sub

A+


J'ai un tableau dans une variable indicée: montant(2000)
avec p exemples montant(1)P, montant(2)@ ....
1- comment trier ce tableau (je n'ai pas trouvé la fonction VBA
correspondante
2- Comment trouver un algorithme qui recherche tous les éléments dont la
somme est égal à une valeur donnée.
Par exemple quels sont tous les éléments dont la somme est égale 3000

J'en ai trouvé un mais beaucoup trop long pour les grosses valeur et qui
n'élimine pas les redondances
Le sujet est passionnant, mais j'ai peur d'y passer énormément de temps.







Avatar
gengiskhan
anonymousA a écrit le 26/02/2005 à 11h49 :
bonjour,

pour ce qui est des algorithmes de tri, ca fait partie des sujets qu'on pose
toujours en 1ere année d'écoles en informatique ( quelquene
soient les
niveaux d'ailleurs). Autant te dire donc que de ce côté, on trouve
de tout du
plus simple au plus compliqué en passant par le plus efficace. Donc tu
pourrais en réaliser un toi-même . Par ailleurs, il n'existe pas
de fonction
VBA pour trier un tableau mais il existe une méthode VBA pour trier une
plage
de cellules. Tu peux utiliser ça si tu veux ( c'est une idée
comme une autre)
en transformant ton tableau en une plage de cellules puis en faisant faire le
tri à Excel puis en récupérant les valeurs dans ce
même tableau.C'est très
rapide .Jamais essayé par contre de comparer la vitesse entre un
algorithme
de tri en mémoire et un alogorithme pasant par une affectation de
plages. un
exemple ci-dessous

Dim tableau
Dim rng As Range

tableau = Sheets(1).Range("A1:A3844").Value

Sheets(2).Range("A1:A3844").Value = tableau
Set rng = Sheets(2).Range("A1:A3844")
rng.Sort Key1:=Sheets(2).Range("A1"), Order1:=xlAscending

tableau = rng.Value

si tu ne veux pas passer par une affectation à une plage de cellules
mais
utiliser un laorithme de tri classques avec des valurs en mémoire, va
voir du
côté du site de Frédéric Sigonneau p.e ou Excelabo.
Ce que tu demandes est
déjà tout fait.

Pour ta 2eme question, bien sur que ca existe des programmes comme ca.Ceci
dit, le temps de calcul est d'autant plus long que les valeurs du tableau
sont nombreuses ( ce n'est pas la valeur du chiffre à atteindre qui y
fait
quoique ce soit). C'est une pure question de maths.
Combien de combinaisons de K nombres parmi N nombres existe t-il à
partir
d'une collection de N nombres.? Je te renvoie aux plaisanteries qu'on
étudie
en Terminale et au binome de Newton ( la somme des combinaisons de k nombres
parmi N si on va de 1 à N est égale à 2 puissance N).
Autant dire que tu peut
y passer un moment si N est grand.
Bon je t'en communiques un quand même , même si tu en as
déja un. Attention,
il a des limitations.



'**************************************************************************
'Dans la procédure qui suit , on cherche à obtenir à
partir d'une liste de
'valeurs ,en faire la combinaison pour atteindre une autre valeur située
'dans une cellule. Attention, le nombre de combinaisons possible étant
'très élevé, pour que le code puisse fonctionner, il faut
limiter le nombre
'de valeurs dans la liste des valeurs.

'Rentre les valeurs en colonne B en commencant par B1
'Rentrer la valeur à atteindre en A1
'Faire tourner TestBldbin

'Ce programme testera toutes les combinaisons en colonnes en allant vers la
droite
'et evidemment ne peut aller plus loin que 254 colonnes. Si rien n'apparait
, il
'n' y a aucune combinaisons possibles. Plus il y a de nombres en colonne B,
plus le temps
'de calcul sera long.

Option Explicit
Sub bldbin(num As Long, bits As Long, arr() As Long)
Dim lNum As Long, i As Long, cnt As Long
lNum = num
' Dim sStr As String
' sStr = ""
cnt = 0
For i = bits - 1 To 0 Step -1
If lNum And 2 ^ i Then
cnt = cnt + 1
arr(i, 0) = 1
' sStr = sStr & "1"
Else
arr(i, 0) = 0
' sStr = sStr & "0"
End If
Next
' If cnt = 2 Then
' Debug.Print num, sStr
' End If
End Sub

Sub TestBldbin()
Dim i As Long
Dim bits As Long
Dim varr As Variant
Dim varr1() As Long
Dim rng As Range
Dim icol As Long
Dim tot As Long
Dim num As Long 'il peut être utile de passer à double si la liste
est un
peu importante
icol = 0
Set rng = Range(Range("B1"), Range("B1").End(xlDown))
num = 2 ^ rng.Count - 1 '(formule du binome (1+1)^n = somme des combinaisons
C(n,k)
bits = rng.Count
varr = rng.Value
ReDim varr1(0 To bits - 1, 0 To 0)
For i = 0 To num
bldbin i, bits, varr1
tot = Application.SumProduct(varr, varr1)
If tot = Range("A1") Then
icol = icol + 1
If icol = 255 Then
MsgBox "too many columns, i is " & i & " of " &
num & _
" combinations checked"
Exit Sub
End If
rng.Offset(0, icol) = varr1
End If
Next

End Sub

A+


J'ai un tableau dans une variable indicée: montant(2000)
avec p exemples montant(1)P, montant(2)@ ....
1- comment trier ce tableau (je n'ai pas trouvé la fonction VBA
correspondante
2- Comment trouver un algorithme qui recherche tous les éléments
dont la
somme est égal à une valeur donnée.
Par exemple quels sont tous les éléments dont la somme est
égale 3000

J'en ai trouvé un mais beaucoup trop long pour les grosses valeur et
qui
n'élimine pas les redondances
Le sujet est passionnant, mais j'ai peur d'y passer énormément
de temps.








Bonjour,

J'ai fait tourner le programme TestBldbin sans pb avec une liste inférieure à 32 éléments.
Mais je n'ai pas réussi à le modifier pour une liste supérieure avec l'utilisation de type "double" par exemple.

Comment faire ?