Variables d'une opération en fonction de la valeur d'une colonne

Le
Ashish Kebab
Bonjour,

mon premier post n'a pas marché, alors je recommence
J'ai besoin d'une formule qui me permette de faire une opération entre
plusieurs valeurs d'un tableau, en fonction de la valeur contenue dans
la première colonne. Exemple :

A B
1 a 2
2 b 3
3 c 5
4
5 b 10
6 a 20

L'opération sera : B1*B6 + B2*B5 (1er a * 2eme a + 1er b * 2eme b)

Quelqu'un a-t-il la solution ??
Merci beaucoup !
Ashish
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
cousinhub
Le #4329011
Bonsoir,
voici un petit code, à adapter bien sûr.
Il y a sûrement plus simple, mais c'est tout ce que j'avais comme idée
ce soir....-)

http://cjoint.com/?dnsQUYaF2t



Sub multi()
Application.ScreenUpdating = False
[h1:i1].Value = [a1:b1].Value
For Each c In [lettres]
temp = c
temp1 = c.Offset(0, 1)
[h65000].End(xlUp).Offset(1, 0) = temp
For Each cell In [lettres]
If cell.Address <> c.Address Then
If cell = c Then temp1 = temp1 * cell.Offset(0, 1)
End If
Next cell
[i65000].End(xlUp).Offset(1, 0) = temp1
Next c
derlig1 = [i65000].End(xlUp).Row
With Range("H1:I" & derlig1)
.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
"E1:F1"), Unique:=True
.ClearContents
End With
derlig = [f65000].End(xlUp).Row
[e65000].End(xlUp).Offset(1, 0) = "Total"
[f65000].End(xlUp).Offset(1, 0) = Evaluate("SUM(F2:F" & derlig & ")")
Application.ScreenUpdating = True
End Sub

bon courage

Bonjour,

mon premier post n'a pas marché, alors je recommence...
J'ai besoin d'une formule qui me permette de faire une opération entre
plusieurs valeurs d'un tableau, en fonction de la valeur contenue dans
la première colonne. Exemple :

A B
1 a 2
2 b 3
3 c 5
4
5 b 10
6 a 20

L'opération sera : B1*B6 + B2*B5 (1er a * 2eme a + 1er b * 2eme b)

Quelqu'un a-t-il la solution ??
Merci beaucoup !
Ashish



garnote
Le #4328721
Salut Ashish et cousinhub,

Si j'ai bien compris la question, cette macro me semble compétente.
Elle mutiplie tous les nombres de la colonne B qui correspondent
à une même lettre de la colonne A (pour chacune des lettres) et
additionne le tout. Est-ce bien cela qu'il faut obtenir ?

Sub Somme_De_Produits()
Application.ScreenUpdating = False
Dim k As Long
Dim i As Long
Dim L(1 To 65536) as Long
Dim p(1 To 65536) As Double
Dim s As Double
Range("A:B").Sort Key1:=Range("A1"), Order1:=xlAscending
i = 1
Do
i = i + 1
If Cells(i, 1) <> Cells(i - 1, 1) Then
k = k + 1
L(k) = i - 1
End If
Loop Until Cells(i - 1, 1) = ""
p(1) = WorksheetFunction.Product(Range(Cells(1, 2), Cells(L(1), 2)))
For i = 2 To k
p(i) = WorksheetFunction.Product(Range(Cells(L(i - 1) + 1, 2), Cells(L(i), 2)))
Next i
For i = 1 To k
s = s + p(i)
Next i
[D1] = s
Application.ScreenUpdating = True
End Sub

Serge


"cousinhub"
Bonsoir,
voici un petit code, à adapter bien sûr.
Il y a sûrement plus simple, mais c'est tout ce que j'avais comme idée ce soir....-)

http://cjoint.com/?dnsQUYaF2t



Sub multi()
Application.ScreenUpdating = False
[h1:i1].Value = [a1:b1].Value
For Each c In [lettres]
temp = c
temp1 = c.Offset(0, 1)
[h65000].End(xlUp).Offset(1, 0) = temp
For Each cell In [lettres]
If cell.Address <> c.Address Then
If cell = c Then temp1 = temp1 * cell.Offset(0, 1)
End If
Next cell
[i65000].End(xlUp).Offset(1, 0) = temp1
Next c
derlig1 = [i65000].End(xlUp).Row
With Range("H1:I" & derlig1)
.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
"E1:F1"), Unique:=True
.ClearContents
End With
derlig = [f65000].End(xlUp).Row
[e65000].End(xlUp).Offset(1, 0) = "Total"
[f65000].End(xlUp).Offset(1, 0) = Evaluate("SUM(F2:F" & derlig & ")")
Application.ScreenUpdating = True
End Sub

bon courage

Bonjour,

mon premier post n'a pas marché, alors je recommence...
J'ai besoin d'une formule qui me permette de faire une opération entre
plusieurs valeurs d'un tableau, en fonction de la valeur contenue dans
la première colonne. Exemple :

A B
1 a 2
2 b 3
3 c 5
4
5 b 10
6 a 20

L'opération sera : B1*B6 + B2*B5 (1er a * 2eme a + 1er b * 2eme b)

Quelqu'un a-t-il la solution ??
Merci beaucoup !
Ashish





Ashish Kebab
Le #4328691
Wow en fait, je comptais pas forcément utiliser de VBA... :op
Est-ce que cette fonction est calculée automatiquement à chaque modif
du document ?
garnote
Le #4328681
Salut Ashish,

Non mais ça peut s'arranger avec cette macro
que tu dois copier dans le module de la feuille
qui contient tes données.
Fais un clic droit sur l'onglet de ta feuille, clique
sur "Visualiser le code" et copie cette macro sur la
feuille vierge qui devrait apparaître.

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A:B")) Is Nothing Then Somme_De_Produits
End Sub

Serge


"Ashish Kebab" Wow en fait, je comptais pas forcément utiliser de VBA... :op
Est-ce que cette fonction est calculée automatiquement à chaque modif
du document ?
cousinhub
Le #4328671
Bonsoir Serge et Ashish,
effectivement, Serge, c'était à priori cela, mais avec mon seul neurone
encore présent, et la détresse d'Ashish, j'avais essayé....
Devant ton code, je ne peux que m'incliner bien bas
Félicitations
PS, j'ai fait un essai avec 1500 lignes, je ne donnerais pour rien au
monde mon temps.................comparé au tien, j'avais pas pensé au
tri (snif!!!!)
Bonne soirée -)

Salut Ashish et cousinhub,

Si j'ai bien compris la question, cette macro me semble compétente.
Elle mutiplie tous les nombres de la colonne B qui correspondent
à une même lettre de la colonne A (pour chacune des lettres) et
additionne le tout. Est-ce bien cela qu'il faut obtenir ?

Sub Somme_De_Produits()
Application.ScreenUpdating = False
Dim k As Long
Dim i As Long
Dim L(1 To 65536) as Long
Dim p(1 To 65536) As Double
Dim s As Double
Range("A:B").Sort Key1:=Range("A1"), Order1:=xlAscending
i = 1
Do
i = i + 1
If Cells(i, 1) <> Cells(i - 1, 1) Then
k = k + 1
L(k) = i - 1
End If
Loop Until Cells(i - 1, 1) = ""
p(1) = WorksheetFunction.Product(Range(Cells(1, 2), Cells(L(1), 2)))
For i = 2 To k
p(i) = WorksheetFunction.Product(Range(Cells(L(i - 1) + 1, 2), Cells(L(i), 2)))
Next i
For i = 1 To k
s = s + p(i)
Next i
[D1] = s
Application.ScreenUpdating = True
End Sub

Serge


"cousinhub"
Bonsoir,
voici un petit code, à adapter bien sûr.
Il y a sûrement plus simple, mais c'est tout ce que j'avais comme idée ce soir....-)

http://cjoint.com/?dnsQUYaF2t


Sub multi()
Application.ScreenUpdating = False
[h1:i1].Value = [a1:b1].Value
For Each c In [lettres]
temp = c
temp1 = c.Offset(0, 1)
[h65000].End(xlUp).Offset(1, 0) = temp
For Each cell In [lettres]
If cell.Address <> c.Address Then
If cell = c Then temp1 = temp1 * cell.Offset(0, 1)
End If
Next cell
[i65000].End(xlUp).Offset(1, 0) = temp1
Next c
derlig1 = [i65000].End(xlUp).Row
With Range("H1:I" & derlig1)
.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
"E1:F1"), Unique:=True
.ClearContents
End With
derlig = [f65000].End(xlUp).Row
[e65000].End(xlUp).Offset(1, 0) = "Total"
[f65000].End(xlUp).Offset(1, 0) = Evaluate("SUM(F2:F" & derlig & ")")
Application.ScreenUpdating = True
End Sub

bon courage

Bonjour,

mon premier post n'a pas marché, alors je recommence...
J'ai besoin d'une formule qui me permette de faire une opération entre
plusieurs valeurs d'un tableau, en fonction de la valeur contenue dans
la première colonne. Exemple :

A B
1 a 2
2 b 3
3 c 5
4
5 b 10
6 a 20

L'opération sera : B1*B6 + B2*B5 (1er a * 2eme a + 1er b * 2eme b)

Quelqu'un a-t-il la solution ??
Merci beaucoup !
Ashish









garnote
Le #4328661
Salut cousin,

Ce qui m'a mis sur cette piste, c'est la macro des
sauts de lignes sur laquelle nous buchämes récemment.
Quant au tri et aux boucles, trois ou quatre petites cervoises
et des heures d'obstination maladive ;-)
Si quelqu'un trouve une formule pour faire ça,
je vais sombrer dans une profonde dépression ;-)))

A+

Serge



"cousinhub"
Bonsoir Serge et Ashish,
effectivement, Serge, c'était à priori cela, mais avec mon seul neurone encore présent, et la détresse d'Ashish, j'avais
essayé....
Devant ton code, je ne peux que m'incliner bien bas
Félicitations
PS, j'ai fait un essai avec 1500 lignes, je ne donnerais pour rien au monde mon temps.................comparé au tien, j'avais pas
pensé au tri (snif!!!!)
Bonne soirée -)

Salut Ashish et cousinhub,

Si j'ai bien compris la question, cette macro me semble compétente.
Elle mutiplie tous les nombres de la colonne B qui correspondent
à une même lettre de la colonne A (pour chacune des lettres) et
additionne le tout. Est-ce bien cela qu'il faut obtenir ?

Sub Somme_De_Produits()
Application.ScreenUpdating = False
Dim k As Long
Dim i As Long
Dim L(1 To 65536) as Long
Dim p(1 To 65536) As Double
Dim s As Double
Range("A:B").Sort Key1:=Range("A1"), Order1:=xlAscending
i = 1
Do
i = i + 1
If Cells(i, 1) <> Cells(i - 1, 1) Then
k = k + 1
L(k) = i - 1
End If
Loop Until Cells(i - 1, 1) = ""
p(1) = WorksheetFunction.Product(Range(Cells(1, 2), Cells(L(1), 2)))
For i = 2 To k
p(i) = WorksheetFunction.Product(Range(Cells(L(i - 1) + 1, 2), Cells(L(i), 2)))
Next i
For i = 1 To k
s = s + p(i)
Next i
[D1] = s
Application.ScreenUpdating = True
End Sub

Serge


"cousinhub"
Bonsoir,
voici un petit code, à adapter bien sûr.
Il y a sûrement plus simple, mais c'est tout ce que j'avais comme idée ce soir....-)

http://cjoint.com/?dnsQUYaF2t


Sub multi()
Application.ScreenUpdating = False
[h1:i1].Value = [a1:b1].Value
For Each c In [lettres]
temp = c
temp1 = c.Offset(0, 1)
[h65000].End(xlUp).Offset(1, 0) = temp
For Each cell In [lettres]
If cell.Address <> c.Address Then
If cell = c Then temp1 = temp1 * cell.Offset(0, 1)
End If
Next cell
[i65000].End(xlUp).Offset(1, 0) = temp1
Next c
derlig1 = [i65000].End(xlUp).Row
With Range("H1:I" & derlig1)
.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
"E1:F1"), Unique:=True
.ClearContents
End With
derlig = [f65000].End(xlUp).Row
[e65000].End(xlUp).Offset(1, 0) = "Total"
[f65000].End(xlUp).Offset(1, 0) = Evaluate("SUM(F2:F" & derlig & ")")
Application.ScreenUpdating = True
End Sub

bon courage

Bonjour,

mon premier post n'a pas marché, alors je recommence...
J'ai besoin d'une formule qui me permette de faire une opération entre
plusieurs valeurs d'un tableau, en fonction de la valeur contenue dans
la première colonne. Exemple :

A B
1 a 2
2 b 3
3 c 5
4
5 b 10
6 a 20

L'opération sera : B1*B6 + B2*B5 (1er a * 2eme a + 1er b * 2eme b)

Quelqu'un a-t-il la solution ??
Merci beaucoup !
Ashish










cousinhub
Le #4328651
Re-,
je crains une intervention de LSteph ou JB qui, non seulement me
mettrait définitivement hors course (déjà largué), mais qui en plus
mettrait ton code au rang des éléphants. Heureusement que JPS est hors
de toute portée WIFI....
Pour les cervoises, c'est peut-être la raison du seul neurone...
Amicalement

Salut cousin,

Ce qui m'a mis sur cette piste, c'est la macro des
sauts de lignes sur laquelle nous buchämes récemment.
Quant au tri et aux boucles, trois ou quatre petites cervoises
et des heures d'obstination maladive ;-)
Si quelqu'un trouve une formule pour faire ça,
je vais sombrer dans une profonde dépression ;-)))

A+

Serge



"cousinhub"
Bonsoir Serge et Ashish,
effectivement, Serge, c'était à priori cela, mais avec mon seul neurone encore présent, et la détresse d'Ashish, j'avais
essayé....
Devant ton code, je ne peux que m'incliner bien bas
Félicitations
PS, j'ai fait un essai avec 1500 lignes, je ne donnerais pour rien au monde mon temps.................comparé au tien, j'avais pas
pensé au tri (snif!!!!)
Bonne soirée -)

Salut Ashish et cousinhub,

Si j'ai bien compris la question, cette macro me semble compétente.
Elle mutiplie tous les nombres de la colonne B qui correspondent
à une même lettre de la colonne A (pour chacune des lettres) et
additionne le tout. Est-ce bien cela qu'il faut obtenir ?

Sub Somme_De_Produits()
Application.ScreenUpdating = False
Dim k As Long
Dim i As Long
Dim L(1 To 65536) as Long
Dim p(1 To 65536) As Double
Dim s As Double
Range("A:B").Sort Key1:=Range("A1"), Order1:=xlAscending
i = 1
Do
i = i + 1
If Cells(i, 1) <> Cells(i - 1, 1) Then
k = k + 1
L(k) = i - 1
End If
Loop Until Cells(i - 1, 1) = ""
p(1) = WorksheetFunction.Product(Range(Cells(1, 2), Cells(L(1), 2)))
For i = 2 To k
p(i) = WorksheetFunction.Product(Range(Cells(L(i - 1) + 1, 2), Cells(L(i), 2)))
Next i
For i = 1 To k
s = s + p(i)
Next i
[D1] = s
Application.ScreenUpdating = True
End Sub

Serge


"cousinhub"
Bonsoir,
voici un petit code, à adapter bien sûr.
Il y a sûrement plus simple, mais c'est tout ce que j'avais comme idée ce soir....-)

http://cjoint.com/?dnsQUYaF2t
Sub multi()

Application.ScreenUpdating = False
[h1:i1].Value = [a1:b1].Value
For Each c In [lettres]
temp = c
temp1 = c.Offset(0, 1)
[h65000].End(xlUp).Offset(1, 0) = temp
For Each cell In [lettres]
If cell.Address <> c.Address Then
If cell = c Then temp1 = temp1 * cell.Offset(0, 1)
End If
Next cell
[i65000].End(xlUp).Offset(1, 0) = temp1
Next c
derlig1 = [i65000].End(xlUp).Row
With Range("H1:I" & derlig1)
.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
"E1:F1"), Unique:=True
.ClearContents
End With
derlig = [f65000].End(xlUp).Row
[e65000].End(xlUp).Offset(1, 0) = "Total"
[f65000].End(xlUp).Offset(1, 0) = Evaluate("SUM(F2:F" & derlig & ")")
Application.ScreenUpdating = True
End Sub

bon courage

Bonjour,

mon premier post n'a pas marché, alors je recommence...
J'ai besoin d'une formule qui me permette de faire une opération entre
plusieurs valeurs d'un tableau, en fonction de la valeur contenue dans
la première colonne. Exemple :

A B
1 a 2
2 b 3
3 c 5
4
5 b 10
6 a 20

L'opération sera : B1*B6 + B2*B5 (1er a * 2eme a + 1er b * 2eme b)

Quelqu'un a-t-il la solution ??
Merci beaucoup !
Ashish












garnote
Le #4328621
Et imagine ce qui pourrait arriver
si Monsieur Longre débarquait ;-)
De toute façon, je suis sûr que
nous serons humiliés ;-)))

Bonsoir, Bonne nuit.



"cousinhub"
Re-,
je crains une intervention de LSteph ou JB qui, non seulement me mettrait définitivement hors course (déjà largué), mais qui en
plus mettrait ton code au rang des éléphants. Heureusement que JPS est hors de toute portée WIFI....
Pour les cervoises, c'est peut-être la raison du seul neurone...
Amicalement

Salut cousin,

Ce qui m'a mis sur cette piste, c'est la macro des
sauts de lignes sur laquelle nous buchämes récemment.
Quant au tri et aux boucles, trois ou quatre petites cervoises
et des heures d'obstination maladive ;-)
Si quelqu'un trouve une formule pour faire ça,
je vais sombrer dans une profonde dépression ;-)))

A+

Serge



"cousinhub"
Bonsoir Serge et Ashish,
effectivement, Serge, c'était à priori cela, mais avec mon seul neurone encore présent, et la détresse d'Ashish, j'avais
essayé....
Devant ton code, je ne peux que m'incliner bien bas
Félicitations
PS, j'ai fait un essai avec 1500 lignes, je ne donnerais pour rien au monde mon temps.................comparé au tien, j'avais
pas pensé au tri (snif!!!!)
Bonne soirée -)

Salut Ashish et cousinhub,

Si j'ai bien compris la question, cette macro me semble compétente.
Elle mutiplie tous les nombres de la colonne B qui correspondent
à une même lettre de la colonne A (pour chacune des lettres) et
additionne le tout. Est-ce bien cela qu'il faut obtenir ?

Sub Somme_De_Produits()
Application.ScreenUpdating = False
Dim k As Long
Dim i As Long
Dim L(1 To 65536) as Long
Dim p(1 To 65536) As Double
Dim s As Double
Range("A:B").Sort Key1:=Range("A1"), Order1:=xlAscending
i = 1
Do
i = i + 1
If Cells(i, 1) <> Cells(i - 1, 1) Then
k = k + 1
L(k) = i - 1
End If
Loop Until Cells(i - 1, 1) = ""
p(1) = WorksheetFunction.Product(Range(Cells(1, 2), Cells(L(1), 2)))
For i = 2 To k
p(i) = WorksheetFunction.Product(Range(Cells(L(i - 1) + 1, 2), Cells(L(i), 2)))
Next i
For i = 1 To k
s = s + p(i)
Next i
[D1] = s
Application.ScreenUpdating = True
End Sub

Serge


"cousinhub"
Bonsoir,
voici un petit code, à adapter bien sûr.
Il y a sûrement plus simple, mais c'est tout ce que j'avais comme idée ce soir....-)

http://cjoint.com/?dnsQUYaF2t
Sub multi()

Application.ScreenUpdating = False
[h1:i1].Value = [a1:b1].Value
For Each c In [lettres]
temp = c
temp1 = c.Offset(0, 1)
[h65000].End(xlUp).Offset(1, 0) = temp
For Each cell In [lettres]
If cell.Address <> c.Address Then
If cell = c Then temp1 = temp1 * cell.Offset(0, 1)
End If
Next cell
[i65000].End(xlUp).Offset(1, 0) = temp1
Next c
derlig1 = [i65000].End(xlUp).Row
With Range("H1:I" & derlig1)
.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
"E1:F1"), Unique:=True
.ClearContents
End With
derlig = [f65000].End(xlUp).Row
[e65000].End(xlUp).Offset(1, 0) = "Total"
[f65000].End(xlUp).Offset(1, 0) = Evaluate("SUM(F2:F" & derlig & ")")
Application.ScreenUpdating = True
End Sub

bon courage

Bonjour,

mon premier post n'a pas marché, alors je recommence...
J'ai besoin d'une formule qui me permette de faire une opération entre
plusieurs valeurs d'un tableau, en fonction de la valeur contenue dans
la première colonne. Exemple :

A B
1 a 2
2 b 3
3 c 5
4
5 b 10
6 a 20

L'opération sera : B1*B6 + B2*B5 (1er a * 2eme a + 1er b * 2eme b)

Quelqu'un a-t-il la solution ??
Merci beaucoup !
Ashish














Ashish Kebab
Le #4328381
Bonjour et merci à tous les deux !

Garnote, ton code marche bien (j'aime beaucoup la mise à jour
automatique :oD ), mais une petite contrainte que, il est vrai, je
n'avais pas précisée... Il ne faut pas que mes cases bougent... !
Parce que là, mon exemple est petit, c'est juste pour donner un énonc é
clair de mon problème. Mais j'ai besoin de cette formule pour un bon
gros tableau de prod, déjà bien organisé, les premières valeurs é tant
par exemple des capacités de production et les secondes les charges de
production... Bref, faut pas tout mélanger !

Est-ce que la solution ne serait pas de créer une feuille de calcul
tampon ? un peu long en temps de calcul peut-être ? d'autant que ce
type de calcul sera réutilisé plusieurs fois dans la même feuille...

Voilou, désolé de pas avoir précisé plus tôt... :op

++ Ashish
garnote
Le #4328041
Bonjour Ashish,

Oui c'est possible mais j'aimerais bien voir à quoi ressemble
ton tableau de production. Je n'ai fait des essais qu'avec des
tableaux du genre :
A B
a 2
a 4
b 5
c
a 3
b
a 4

Et quand le nombre de données augmente, j'obtiens des nombres astronomiques.

Serge


"Ashish Kebab" Bonjour et merci à tous les deux !

Garnote, ton code marche bien (j'aime beaucoup la mise à jour
automatique :oD ), mais une petite contrainte que, il est vrai, je
n'avais pas précisée... Il ne faut pas que mes cases bougent... !
Parce que là, mon exemple est petit, c'est juste pour donner un énoncé
clair de mon problème. Mais j'ai besoin de cette formule pour un bon
gros tableau de prod, déjà bien organisé, les premières valeurs étant
par exemple des capacités de production et les secondes les charges de
production... Bref, faut pas tout mélanger !

Est-ce que la solution ne serait pas de créer une feuille de calcul
tampon ? un peu long en temps de calcul peut-être ? d'autant que ce
type de calcul sera réutilisé plusieurs fois dans la même feuille...

Voilou, désolé de pas avoir précisé plus tôt... :op

++ Ashish
Publicité
Poster une réponse
Anonyme