Somme d'une plage de cellule variable [Résolu]

Julia_74 20 Messages postés mardi 30 septembre 2014Date d'inscription 5 mars 2015 Dernière intervention - 17 nov. 2014 à 09:03 - Dernière réponse : Julia_74 20 Messages postés mardi 30 septembre 2014Date d'inscription 5 mars 2015 Dernière intervention
- 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
Afficher la suite 

Votre réponse

13 réponses

jordane45 22646 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 2 octobre 2018 Dernière intervention - Modifié par jordane45 le 17/11/2014 à 09:45
0
Merci
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
Julia_74 20 Messages postés mardi 30 septembre 2014Date d'inscription 5 mars 2015 Dernière intervention - 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.
Julia_74 20 Messages postés mardi 30 septembre 2014Date d'inscription 5 mars 2015 Dernière intervention - 18 nov. 2014 à 15:12
PS : en message d'erreur, j'avais "la selection de la case range a échouée"
Commenter la réponse de jordane45
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 17 nov. 2014 à 10:39
0
Merci
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.
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 17/11/2014 à 10:46
0
Merci
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
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 17 nov. 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
Julia_74 20 Messages postés mardi 30 septembre 2014Date d'inscription 5 mars 2015 Dernière intervention - 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 !
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 18/11/2014 à 07:18
0
Merci
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
Julia_74 20 Messages postés mardi 30 septembre 2014Date d'inscription 5 mars 2015 Dernière intervention - 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;
Julia_74 20 Messages postés mardi 30 septembre 2014Date d'inscription 5 mars 2015 Dernière intervention - 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.
Commenter la réponse de ucfoutu
Julia_74 20 Messages postés mardi 30 septembre 2014Date d'inscription 5 mars 2015 Dernière intervention - 19 nov. 2014 à 11:37
0
Merci
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
Commenter la réponse de Julia_74
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 19 nov. 2014 à 12:26
0
Merci
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).
Commenter la réponse de ucfoutu
Julia_74 20 Messages postés mardi 30 septembre 2014Date d'inscription 5 mars 2015 Dernière intervention - 19 nov. 2014 à 14:07
0
Merci
Bonjour,
Désolée je ne savais pas que ça existait, j e le fais de suite et pour toutes les conversations
Commenter la réponse de Julia_74

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.