Somme d'une plage de cellule variable

Résolu
Julia_74
Messages postés
20
Date d'inscription
mardi 30 septembre 2014
Statut
Membre
Dernière intervention
5 mars 2015
- 17 nov. 2014 à 09:03
Julia_74
Messages postés
20
Date d'inscription
mardi 30 septembre 2014
Statut
Membre
Dernière intervention
5 mars 2015
- 19 nov. 2014 à 14:07
Bonjour,
Je vous écris car j'ai un petit souci sur Excel :

Je souhaiterai dans ma feuille A, que ma cellule F1 soit le résultat de la somme :
- des cellules contenues dans le range "WP1" de cette feuille, si la cellule B1 de la veuille B contient le texte WP1
- des cellules contenues dans le range "WP2" si .... texte WP2

Voilà ce que j'ai : (qui ne fonctionne pas)

'sélection des conditions

Dim Fdesti As Worksheet


Set Fdesti = Sheets("B")

If Fdesti.Range("B1").Value Like "WP1" Then
Sheets("A").Activate
ActiveSheet.Range("WP1").Select
[F1].Value = Application.WorksheetFunction.Sum(Selection)

ElseIf Range("B1").Value Like "WP2" Then
Sheets("A").Activate
ActiveSheet.Range("WP2").Select
[F1].Value = Application.WorksheetFunction.Sum(Selection)

End If

End Sub



J'ai jamais fait de VBA avant le mois de septembre, j'ai donc du mal à savoir comment formuler "l'algorithme" que j'ai défini...

Merci d'avance,

Julia

7 réponses

jordane45
Messages postés
35442
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 mai 2022
356
Modifié par jordane45 le 17/11/2014 à 09:45
Bonjour Julia.

Et qu'est-ce qui ne fonctionne pas exactement ?
Le choix en fonction de ta cellule B1 ?
ou La somme de la plage selectionnée ?


Pour ce qui est de l'algo.. tu sembles avoir réussi à le coder logiquement...
par contre, à la place des IF ELSEIF..... je t'inviterai plutot à utiliser des SELECT CASE.
Et à tester en MAJUSCULE ( pour éviter toute erreur de frappe...)

Et aussi :
-WP1 et WP2.. sont déjà une CELLULE d'Excel.. évite de donner ce nom à une plage de cellules
- N'aurais tu pas un message d'erreur ? Si oui lequel ? et sur quelle ligne de ton code ?
... WorksheetFunction.Sum ... fonctionne avec des plages de cellules.. pas des "selection".

Ton code corrigé pourrait donner quelque chose du genre:
Sub test()
Dim Fdesti As Worksheet
Set Fdesti = Sheets("B")
Dim b1val As String
b1val = Fdesti.range("B1").Value
Select Case UCase(b1val)
    Case "PLAGE1"
      [F1].Value = somRange("A", "plage1")
    Case "PLAGE2"
      [F1].Value = somRange("A", "plage2")
    Case Else
     MsgBox "saisie incorecte" & b1val
End Select

End Sub

Function somRange(Feuille As String, strRange As String) As Double
 somRange = Application.WorksheetFunction.Sum(Sheets(Feuille).range(strRange))
End Function


=>>> A adapter à tes besoins bien entendu.


Avant de poser une question, merci de lire la charte du site.
Cordialement, Jordane
0
Julia_74
Messages postés
20
Date d'inscription
mardi 30 septembre 2014
Statut
Membre
Dernière intervention
5 mars 2015

18 nov. 2014 à 15:08
Bonjour Jordane,
Je n'avais pas pensé effectivement aux soucis "WP". J'ai modifié et réécrit en me basant sur le code que tu proposes, et... Ca marche à la perfection ! Je te remercie de ton aide, c'est vraiment super.
0
Julia_74
Messages postés
20
Date d'inscription
mardi 30 septembre 2014
Statut
Membre
Dernière intervention
5 mars 2015

18 nov. 2014 à 15:12
PS : en message d'erreur, j'avais "la selection de la case range a échouée"
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
17 nov. 2014 à 10:39
Bonjour,
je n'utiliserais personnellement aucune expression conditionnelle.
Range(Ucase(Range("B1").text)
se réfère tout simplement à la plage nommée "TOTO" si le contenu de la cellule B1 est "toto" ou "TOTO"
Reste par ailleurs bien évidemment (puisqu'il semble s'agir de feuilles différentes) à préciser ces feuilles.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Modifié par ucfoutu le 17/11/2014 à 10:46
Et l'erreur éventuelle de saisie serait alors à traiter ainsi :
Dim laplage As Range
On Error Resume Next
Set laplage = Range(UCase(Range("B1").Text))
If Not laplage Is Nothing Then
........ 'ce que l'on veut en utilisant laplage
Else
MsgBox "erreur de saisie": Beep: Range("B1").Select
End If
on error goto 0

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Modifié par ucfoutu le 17/11/2014 à 10:50
Ceci étant dit, je me demande pourquoi prendre le risque d'une saisie ne correspondant pas à une plage nommée.
Des méthodes existent (plusieurs) pour éviter cette maladresse.
La plus simple (pas forcément la plus colnviviale) est l'utilisation de Application.Input
Les plus conviviales utiliseraient une listbox en B1
0
Julia_74
Messages postés
20
Date d'inscription
mardi 30 septembre 2014
Statut
Membre
Dernière intervention
5 mars 2015

18 nov. 2014 à 15:12
Il y a tellement de solution, pour une novice on s'y perd :) ça me semble très intéressant j'éssaie ! merci !
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Modifié par ucfoutu le 18/11/2014 à 07:18
Alors ? Où en es-tu ?
Regarde, maintenant :
De cette manière : convivialité + aucune gestion d'erreur nécessaire ...
Sur ta feuille de calcul "Feuil1", place une listbox Listbox1 dont tu mets la propriété Visible à False

et ce code :
Private Sub ListBox1_Click()
Range("B1") = ListBox1.Text
Range("F1").Value = Application.WorksheetFunction.Sum(Range(ListBox1.Text))
ListBox1.Visible = False
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address <> Range("B1").Address Then
ListBox1.Visible = False
Else
With ListBox1
.Clear
If ThisWorkbook.Worksheets("Feuil1").Names.Count > 0 Then
For Each plage_nommee In ThisWorkbook.Worksheets("Feuil1").Names
.AddItem plage_nommee.Name
Next
.Left = Range("B1").Left
.Top = Range("B1").Top
.Visible = True
.Width = Range("B1").Width * 2
.Height = Range("B1").Height * 2
End If
End With
End If
End Sub


Tout ceci suppose bien évidemment que des plages ont été nommées sur ta feuille Feuil1 ("Feuil1" choisi à la rubrique Zone de la boîte de dialogue de nommage)

Lance, va dans B1, sélectionne dans la listbox et regarde ce qui se passe en B1 et en F1
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
Julia_74
Messages postés
20
Date d'inscription
mardi 30 septembre 2014
Statut
Membre
Dernière intervention
5 mars 2015

18 nov. 2014 à 15:10
ufcoutu,
Désolée pour le retard de retour de réponse, je n'ai pas eu le temps de m'y repencher. Ta solution me semble effectivement plus élegante;
0
Julia_74
Messages postés
20
Date d'inscription
mardi 30 septembre 2014
Statut
Membre
Dernière intervention
5 mars 2015

18 nov. 2014 à 15:11
Pour le moment la solution de jordane fonctionne, mais c'est vrai que c'est plus risqué; je suis en train d'étudier la tienne, je te fais un retour au plus vite (une fois que j'aurais tout compris) . Merci pour ton aide et d'avoir pris le temps de réfléchir pour moi, c'est très gentil.
0

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

Posez votre question
Julia_74
Messages postés
20
Date d'inscription
mardi 30 septembre 2014
Statut
Membre
Dernière intervention
5 mars 2015

19 nov. 2014 à 11:37
Bonjour à vous deux ! Et bien, les solutions marchent, et marchent même très bien ! Du fil à retordre, merci pour vos précieux conseils toujours très utiles !

Bonne journée

merci encore
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
19 nov. 2014 à 12:26
Bien ...
N'oublie alors pas de clore cette discussion (cela la libère) en cliquant sur le tag RESOLU au niveau de ton tout premier message.
Il en va probablement de même pour d'autres discussions que tu as ouvertes et encore en cours ... (c'est important).
0
Julia_74
Messages postés
20
Date d'inscription
mardi 30 septembre 2014
Statut
Membre
Dernière intervention
5 mars 2015

19 nov. 2014 à 14:07
Bonjour,
Désolée je ne savais pas que ça existait, j e le fais de suite et pour toutes les conversations
0