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

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

12 réponses
Avatar
Ashish Kebab
Bonjour,

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

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

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

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

10 réponses

1 2
Avatar
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



Avatar
garnote
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" a écrit dans le message de news: %
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





Avatar
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 ?
Avatar
garnote
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" a écrit dans le message de news:
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 ?
Avatar
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" a écrit dans le message de news: %
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









Avatar
garnote
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" a écrit dans le message de news:
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" a écrit dans le message de news: %
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










Avatar
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" a écrit dans le message de news:
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" a écrit dans le message de news: %
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












Avatar
garnote
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" a écrit dans le message de news:
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" a écrit dans le message de news:
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" a écrit dans le message de news: %
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














Avatar
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
Avatar
garnote
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" a écrit dans le message de news:
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
1 2