[Excel] probleme code adressage

fred -  
 fred -
salut tout le monde, j'ai écrit le code suivant :

Sub Selection_Plages()

Dim Val1 As Range
Dim Val2 As Range
Dim OùÇa1 As Range
Dim OùÇa2 As Range

' Désignation de la plage Val1
Set Val1 = Application.InputBox(prompt:="Sélectionnez " _
& "la plage Val1, puis faites OK", _
Title:="CHOIX DE LA MATRICE", Type:=8)

' La plage Val2 est déduite de Val1
Set Val2 = Val1.Offset(0, 1)

' Désignation de la cellule résultatde la somme
Set OùÇa1 = Application.InputBox(prompt:="Sélectionnez " _
& "la cellule où mettre le résultat, puis faites OK", _
Title:="EMPLACEMENT DU RESULTAT", Type:=8)

' Désignation de la cellule résultat du produit
Set OùÇa2 = OùÇa1.Offset(0, 1)
a1 = Val1.Address(rowabsolute:=True, columnabsolute:=True)
a2 = Val2.Address(rowabsolute:=True, columnabsolute:=True)
OùÇa1.Formula = "=SUM(" & a1 & ")"
OùÇa1.Replace What:="'", Replacement:="", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False

OùÇa2.Formula = "=SUMPRODUCT((" & a1 & ")*(" & a2 & "))/SUM(" & a1 & ")"
OùÇa2.Replace What:="'", Replacement:="", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False

End Sub

Voila le souci: val1 et val2 sont des selections de cellules qui appartiennent a une feuille Tableau! et la cellule désignée par Oùça (disons O4) est dans une autre feuille Avancement!

Le probleme est que les formules apparaissent dans O4 mais si par exemple on avait val1=Tableau!I6:I50 et val2=Tableau!J6:J50 alors dans O4 on a
SOMME(I6:I50)
et ces cellules sont alors prises dans la feuille Avancement...

Je voudrait donc garder lors de l'adressage l'information qui renseigne dans quelle feuille il faut prendre les selections
A voir également:

9 réponses

fred
 
Y'aurait'y pas quelqu'un qui pourrait m'aider svp...
[:-(
0
Armojax Messages postés 1916 Date d'inscription   Statut Membre Dernière intervention   1 529
 
Hello fred,

Essaie cette petite variante : la macro active la feuille Tableau pour choisir la plage Val1 (donc Val2) et leur attribue un nom.
Ensuite, elle active la feuille Avancement, et de la même façon, donne un nom. De cette façon, les noms sont connus et situés dans les bonnes feuilles.

Regarde si ça te va mieux.
Ajx.
Sub Selection_Plages()

  Dim Val1  As Range
  Dim Val2  As Range
  Dim OùÇa1 As Range
  Dim OùÇa2 As Range
  
  Sheets("Tableau").Activate
  ' Désignation de la plage Val1
  Set Val1 = Application.InputBox(prompt:="Sélectionnez " _
  & "la plage Val1, puis faites OK", _
  Title:="CHOIX DE LA MATRICE", Type:=8)
  ActiveWorkbook.Names.Add Name:="Val1", RefersToR1C1:=Val1
  
  ' La plage Val2 est déduite de Val1
  Set Val2 = Val1.Offset(0, 1)
  ActiveWorkbook.Names.Add Name:="Val2", RefersToR1C1:=Val2
  
  Sheets("Avancement").Activate
  ' Désignation de la cellule résultat de la somme
  Set OùÇa1 = Application.InputBox(prompt:="Sélectionnez " _
  & "la cellule où mettre le résultat, puis faites OK", _
  Title:="EMPLACEMENT DU RESULTAT", Type:=8)
  ActiveWorkbook.Names.Add Name:="OùÇa1", RefersToR1C1:=OùÇa1
  
  ' Désignation de la cellule résultat du produit
  Set OùÇa2 = OùÇa1.Offset(0, 1)
  ActiveWorkbook.Names.Add Name:="OùÇa2", RefersToR1C1:=OùÇa2
  
  OùÇa1.FormulaR1C1 = "=SUM(Val1)"
  OùÇa2.FormulaR1C1 = "=(SUMPRODUCT(Val1,Val2))/SUM(Val1)"

End Sub
0
fred
 
salut armojax merci pour ton code ça marche, il considère les bonnes feuilles pour mes selections !

Par contre quand on clique sur la case où l'on a mis le résultat de la somme est-ce possible d'avoir la formule:
SOMME(Tableau!Itruc:Imachin) au lieu de SOMME(Val1) ??
0
random Messages postés 1612 Statut Membre 155
 
"=(SUMPRODUCT(Val1,Val2))/SUM(Val1)"
"=(sumprduct(" & val1 & "," & val2&"))/SUM(" & Val1& ")"

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fred
 
j'ai déja essayé avec "& ...&" mais ça marche pô.
0
Armojax Messages postés 1916 Date d'inscription   Statut Membre Dernière intervention   1 529
 
Nouvelle mouture plus conforme à ce que tu veux...
Sub Selection_Plages()

  Dim Lib1  As String
  Dim Lib2  As String
  Dim Val1  As Range
  Dim Val2  As Range
  Dim OùÇa1 As Range
  Dim OùÇa2 As Range
  
  Sheets("Tableau").Activate
  ' Désignation de la plage Val1
  Set Val1 = Application.InputBox(prompt:="Sélectionnez " _
  & "la plage Val1, puis faites OK", _
  Title:="CHOIX DE LA MATRICE", Type:=8)
  ActiveWorkbook.Names.Add Name:="Val1", RefersToR1C1:=Val1
  
  ' La plage Val2 est déduite de Val1
  Set Val2 = Val1.Offset(0, 1)
  ActiveWorkbook.Names.Add Name:="Val2", RefersToR1C1:=Val2
  
  Lib1 = "Tableau!" & Val1.Address(False, False)
  Lib2 = "Tableau!" & Val2.Address(False, False)
  
  Sheets("Avancement").Activate
  ' Désignation de la cellule résultat de la somme
  Set OùÇa1 = Application.InputBox(prompt:="Sélectionnez " _
  & "la cellule où mettre le résultat, puis faites OK", _
  Title:="EMPLACEMENT DU RESULTAT", Type:=8)
  ActiveWorkbook.Names.Add Name:="OùÇa1", RefersToR1C1:=OùÇa1
  
  ' Désignation de la cellule résultat du produit
  Set OùÇa2 = OùÇa1.Offset(0, 1)
  ActiveWorkbook.Names.Add Name:="OùÇa2", RefersToR1C1:=OùÇa2
  
  OùÇa1.Formula = "=SUM(" & Lib1 & ")"
  OùÇa2.Formula = "=(SUMPRODUCT(" & Lib1 & "," & Lib2 & "))/SUM(" & Lib1 & ")"

End Sub
0
fred
 
salut armojax!
merci pour ton code je me permets de t'embêter une derniere fois pour te demander comment je peux insérer "TABLEAU! "dans Oùça1 et Oùça2 après chaque ";" qui représente l'union de cellules.
En effet si je sélectionne une plage correspondant à
"I6:I9;I58:I63" il faut que le programme l'écrive dans la feuille "Avancement" : "TABLEAU!I6:I9;TABLEAU!I58:I63"

Je pense que je dois me servir de Replace mais je ne comprends pas trop comment l'utiliser.
0
Armojax Messages postés 1916 Date d'inscription   Statut Membre Dernière intervention   1 529
 
Salut Fred,

Dans la macro, définis un indice (I) pour une boucle For... next, et remplace les lignes Lib1 et Lib2 par ceci :
  Dim I     As Integer

' - - - - - - - - - - - - - - -

'  Lib1 = "Tableau!" & Val1.Address(False, False)
'  Lib2 = "Tableau!" & Val2.Address(False, False)
  
  Lib1 = ""
    For I = 1 To Val1.Areas.Count
    Lib1 = Lib1 & "Tableau!" & Val1.Areas(I).Address(False, False) & ","
  Next
  Lib1 = Left(Lib1, Len(Lib1) - 1)
  
  Lib2 = ""
    For I = 1 To Val2.Areas.Count
    Lib2 = Lib2 & "Tableau!" & Val2.Areas(I).Address(False, False) & ","
  Next
  Lib2 = Left(Lib2, Len(Lib2) - 1)
  
' - - - - - - - - - - - - - - - -

Armojax
0
fred
 
merci Armojax ça marche avec la boucle for mais en fait j'ai réalisé que l'erreur venait d'ailleurs: Excel me sort toujours comme résultat '#valeur' lorsque j'utilise SOMMEPROD avec des unions de cellules, je sais pas pourquoi, il faut que je trouve une autre fonction..
En fait j'utilise SOMMEPROD/SOMME pour trouver un pourcentage global, le produit de matrice ct sympa mais je peux pas choisir les lignes que je veux dans mes matrices colonnes
0
Armojax Messages postés 1916 Date d'inscription   Statut Membre Dernière intervention   1 529
 
Re fred,

A mon avis, tu ne peux pas utiliser correctement SOMMEPROD avec des sélections multiples. En effet, cette fonction reçoit en paramètres une liste de plages (matrices) de tailles identiques. Si tu veux effectuer un SOMMEPROD entre deux listes de plages (sélections multiples), tu retrouves dans tes parenthèses une liste qui est la concaténation de tes deux listes initiales.

1) Ça ne fait pas ce que tu veux
2) Il y a de fortes chances que les plages ainsi définies ne soient pas identiques, d'où le résultat "#VALEUR".

Creuse dans une autre direction...
0
fred
 
ouai je v plancher la dessus .
En tout cas merci pour ton aide armojax :°)
Bonne soirée, à plus.
0