[Excel] probleme code adressage
fred
-
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
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:
- [Excel] probleme code adressage
- Code ascii - Guide
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Code puk bloqué - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
9 réponses
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.
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
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) ??
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) ??
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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.
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.
Salut Fred,
Dans la macro, définis un indice (I) pour une boucle For... next, et remplace les lignes Lib1 et Lib2 par ceci :
Armojax
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
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
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
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...
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...