Fenetre qui continue une action ou l'annule [Résolu]

Messages postés
16
Date d'inscription
dimanche 27 novembre 2011
Dernière intervention
21 février 2014
- - Dernière réponse : paolo_m
Messages postés
16
Date d'inscription
dimanche 27 novembre 2011
Dernière intervention
21 février 2014
- 21 févr. 2014 à 09:10
Bonjour,
Pour découvrir le langage VBA Office
je fais un petit programme qui copie des cellules d'une feuille (feuil1) et les colles sur une autre feuille (feuil2).
Jusque là tout va bien !!
j'ai rajouté une ligne qui vérifie qu'il n'y a rien dans la cellule de destination, le cas échéant, une fenêtre me demande si je veux continuer ou annuler.
If Sheets("feuil2").Range("c" & (a + m)).Value <> "" Then
Attention.Show
End If
Do
Loop While atention <> 0

If atention = 1 Then
Stop
End If
If atention = 2 Then
v = Sheets("Feuil1").Range("F12").Value
Sheets("Feuil2").Range("C" & (a + m)).Value = v
End If
La fenetre attention me permet de continuer ou annuler
Dim atention As Integer
Private Sub Annuler_Click()
Unload Me
Sheets("Feuil1").Select
Range("F3").Select
atention = 1
End Sub

Private Sub Continuer_click()
Unload Me
atention = 2
End Sub
Mon probleme :
Que je choisisse annuler ou continuer les données ne sont pas copiées dans la nouvelle cellule.
Je n'aime pas trop cette idée de boucle via Do et Loop, avez vous une meilleure idée ?

Merci
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
1
Merci
J'ai la (très) vague impression que ce que tu cherches à faire ressemblerait à ceci :

titi = Sheets("feuil2").Range("c" & (a + m)).Value
toto = Sheets("Feuil1").Range("F12").Value
If titi = "" Then
Sheets("Feuil2").Range("C" & a + m).Value = toto
Else
If MsgBox("voulez-vous écraser " & titi, vbYesNo) = vbYes Then
Sheets("Feuil2").Range("C" & a + m).Value = toto
End If
End If
--
________________________
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

Merci ucfoutu 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 103 internautes ce mois-ci

paolo_m
Messages postés
16
Date d'inscription
dimanche 27 novembre 2011
Dernière intervention
21 février 2014
-
Très bien vu !!!
je ne connais rien au développement ça c'est sûr !
Et donc je n'ai effectivement pas besoin d'un userform puisque tu viens de me faire découvrir MsgBox
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Bonjour,
Je vais me limiter (il y aurait beaucoup d'autres observations à faire, mais elles ne concernent pas directement ta question) au seul problème que tu soulèves :
si la variable attention n'est pas déclarée publique dans un module standard, elle n'est accessible que depuis le module de ton userform.

PS ! tu serais bien inspiré d'écrire :
Option Explicit
en toute première ligne (avant les sub, etc ...) de chaque module de code.
Si tu avais observé cette sage discipline, ton programme aurait dénoncé la variable attention du module où tu as écrit le premier code.

________________________
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
Commenter la réponse de ucfoutu
Messages postés
16
Date d'inscription
dimanche 27 novembre 2011
Dernière intervention
21 février 2014
0
Merci
Bon...
Tout d'abord j'ai rajouté Option Explicit (merci ucfoutu)
ensuite
j'ai changé mon approche :
si la cellule de destination est occupée:
If Sheets("feuil2").Range("c" & (a + m)).Value <> "" Then
Attention.Show
Else
v = Sheets("Feuil1").Range("F12").Value
Sheets("Feuil2").Range("C" & (a + m)).Value = v
End If
Afin que ce soit le module de code Attention qui gère la copie ou non.
Option Explicit
Dim v As Integer

Private Sub Annuler_Click()
Unload Me
Sheets("Feuil1").Select
Range("F3").Select
End Sub

Private Sub Continuer_click()
Unload Me
'v = Sheets("Feuil1").Range("F12").Value
'Sheets("Feuil2").Range("C" & (a + m)).Value = v
GoTo Valider_Click

End Sub
Je pensais que definir v as Integer dans la feuille "ThisWorkbook" la définisait partout.
En fait NON !!!!

Y a t'il une commande qui permet de changer de module de code afin que le programme continue à une certaine ligne de cet autre module (ce que j'essaye de faire à la ligne 14) ?
Commenter la réponse de paolo_m
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Je ne te comprends plus, notamment :
"dans la feuille "ThisWorkbook""
1) ThisWorkBook n'est pas une feuille, mais le classeur actif !
2) ta variable v, non déclarée publique dans un module standard, est inconnue depuis ton userform.
3) :
v = Sheets("Feuil1").Range("F12").Value
Sheets("Feuil2").Range("C" & (a + m)).Value = v

n'est rien d'autre que :
Sheets("Feuil2").Range("C" & (a + m)).Value = Sheets("Feuil1").Range("F12").Value
j'ai l'impression que tu t'égares de plus en plus et que tu t'égares parce que t'échappent encore les rudiments mêmes du développement !
Je répugne en général à répondre à une question autre que celle posée (Fenetre qui continue une action ou l'annule), ce qui n'est pas le propos de ce forum, mais nous allons faire une exception.
Décris ce que tu veux faire TRES EXACTEMENT et tu verras que tu n'as même pas besoin d'un userform pour cela !

________________________
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
Commenter la réponse de ucfoutu
Messages postés
23600
Date d'inscription
mercredi 22 octobre 2003
Statut
Contributeur
Dernière intervention
13 décembre 2018
0
Merci
Bonjour,

Pour ce qui est de l'utilisation des variables GLOBALES ou, en VBA nommées PUBLIC :
http://silkyroad.developpez.com/VBA/LesVariables/#LV
Pour que la variable soit utilisable dans toutes les macros du projet, il faut utiliser l'instruction Public et la variable doit impérativement être placée en tête d'un module standard.

   
Public X As String

Sub Test()
   X = 10
End Sub

Sub LectureX()
   Msgbox X
End Sub



Sinon pour ce qui est de ton code..
Pourquoi passer, pour une simple question Continuer/annuler par un userform alors qu'une MsgBox ferait tout aussi bien l'affaire ?

Dim atention As Integer

 If Sheets("feuil2").Range("c" & (a + m)).Value <> "" Then
  atention = MsgBox("La cellule : " & "c" & (a + m) & _
                    " n'est pas vide." & vbclrf & _
                    "Souhaitez-vous poursuivre ?", _
                    vbOKCancel)
 End If

 If atention = 2 Then
   'On Sort de la sub
    Exit Sub
  Else
     Sheets("Feuil2").Range("C" & (a + m)).Value = Sheets("Feuil1").Range("F12").Value
  End If




Comme le dit Ucfoutu, il y a certainement d'autres choses à améliorer dans ton programme (mais sans en savoir plus ce sera difficile de te le dire).

Quoi qu'il en soit, concernant la question posée initialement "Fenetre qui continue une action ou l'annule" est, je pense, largement traitée.

Si tu rencontres de nouveaux soucis, n'hésites pas à ouvrir UNE NOUVELLE discussion sur le forum.
Et si les réponses données résolvent bien ton souci de départ..merci de penser à mettre cette discussion en RESOLUE.





Avant de poser une question, merci de lire la charte du site.
Cordialement, Jordane
paolo_m
Messages postés
16
Date d'inscription
dimanche 27 novembre 2011
Dernière intervention
21 février 2014
-
Merci pour le lien.
Commenter la réponse de jordane45
Messages postés
23600
Date d'inscription
mercredi 22 octobre 2003
Statut
Contributeur
Dernière intervention
13 décembre 2018
0
Merci
Y a t'il une commande qui permet de changer de module de code afin que le programme continue à une certaine ligne de cet autre module (ce que j'essaye de faire à la ligne 14)

Il vaut mieux éviter au MAXIMUM d'utiliser des GOTO.

A la rigueur, tu peux découper ton programme en sous programmes et/ou fonctions pour les appeler lorsque tu le souhaites.

exemple :


 If atention = 1 Then
   'On Sort de la sub
    Exit Sub
  Else
     Call copierCellule(a, m)
     msg = addition(a, m)
     Call afficherMessage(msg)
  End If




End Sub

Function addition(a As Double, b As Double) As Double
addition = a + b
End Function

Sub copierCellule(a, m)

Sheets("Feuil2").Range("C" & (a + m)).Value = Sheets("Feuil1").Range("F12").Value

End Sub

Sub afficherMessage(message)
MsgBox "Je viens de faire une addition dans un function et le resultat est :" & message
End Sub


Commenter la réponse de jordane45
Messages postés
16
Date d'inscription
dimanche 27 novembre 2011
Dernière intervention
21 février 2014
0
Merci
Et voila cela fonctionne !
(je ne dirai pas à merveille vu que je suis novice mais bon !)
merci pour ton aide ucfoutu et en plus tu n'aura pas le besoin de te trainer dans la boue et faire tomber tes convictions (humour) car tu as réellement répondu à mon appel.
Encore merci.
Option Explicit
Public a As Integer
Public m As Integer
Public v As Integer


Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If ActiveCell.Address() = "$AL$6" Then
Range("G5:AK5").ClearContents
End If

If ActiveCell.Address() = "$AL$5" Then

If Range("E3") = 2012 Then
a = 3
End If

If Range("E3") = 2013 Then
a = 16
End If

If Range("E3") = 2014 Then
a = 29
End If

If Range("F3") = "Janvier" Then
m = 0
End If

If Range("F3") = "Février" Then
m = 1
End If

If Range("F3") = "Mars" Then
m = 2
End If

If Range("F3") = "Avril" Then
m = 3
End If

If Range("F3") = "Mai" Then
m = 4
End If

If Range("F3") = "Juin" Then
m = 5
End If

If Range("F3") = "Juillet" Then
m = 6
End If

If Range("F3") = "Août" Then
m = 7
End If

If Range("F3") = "Septembre" Then
m = 8
End If

If Range("F3") = "Octobre" Then
m = 9
End If

If Range("F3") = "Novembre" Then
m = 10
End If

If Range("F3") = "Décembre" Then
m = 11
End If

v = Sheets("Feuil1").Range("F12").Value

If Sheets("feuil2").Range("c" & (a + m)).Value = "" Then
Sheets("Feuil2").Range("C" & (a + m)).Value = v
Else
If MsgBox("Attention, vous êtes sur le point de détruire des données déja existantes !", vbYesNo) = vbYes Then
Sheets("Feuil2").Range("C" & a + m).Value = v
End If
End If
End If
End Sub
Je pense qu'il existe un moyen de ne pas passer par une suite de If mais j'aime bien découvrir de cette façon
jordane45
Messages postés
23600
Date d'inscription
mercredi 22 octobre 2003
Statut
Contributeur
Dernière intervention
13 décembre 2018
-
Pour ne pas passer par tous ces IF il existe :
SELECT CASE.


select case Range("F3").value

case "Janvier"
  m=0
 case  "Février"
   m=1
 case "Mars"
  m=3

'etc..

End Select

'idem pour ton autre range

select case  Range("E3").value
case 2012
 a = 3
case 2013 
a = 16
case 2014
a = 29
case else
 'aucun de ces cas..
 msgbox "error !"
end select


Edit* : j'ai rien dit ^^
jordane45
Messages postés
23600
Date d'inscription
mercredi 22 octobre 2003
Statut
Contributeur
Dernière intervention
13 décembre 2018
-
Edit2 : Au lieu d'utiliser ActiveCell.adress sert toi plutôt de l'objet Target passé en paramètre de la méthode worsheet_selectionchange.

If Target.Address = "$AL$6" Then
Range("G5:AK5").ClearContents
End If

ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
-
des 2; mon capitaine
ucfoutu 16 févr. 2014 à 21:14
jordane45 16 févr. 2014 à 21:28
jordane45
Messages postés
23600
Date d'inscription
mercredi 22 octobre 2003
Statut
Contributeur
Dernière intervention
13 décembre 2018
-
Le temps de rédiger mon message il a posté le sien.. et je ne l'avais pas vu ^^
Commenter la réponse de paolo_m
Messages postés
23600
Date d'inscription
mercredi 22 octobre 2003
Statut
Contributeur
Dernière intervention
13 décembre 2018
0
Merci
Edit 3 :*
Pour tes mois tu pourrais aussi passer par un tableau (array)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim arr As Variant
'Tableau contenant la liste de tes mois ( A compléter)
arr = Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet")


If Target.Address() = "$AL$6" Then
   Range("G5:AK5").ClearContents
End If

If Target.Address() = "$AL$5" Then
   '------------------------------------------
   ' recherche de l'année
   '----------------------------------
    Select case  Range("E3").value
      case 2012
         a = 3
      case 2013 
        a = 16
     case 2014
        a = 29
     case else
       'aucun de ces cas..
         msgbox "error !"
    End select

    '------------------------------------------
    ' Recherche du mois dans le tableau
    '------------------------------------------
      Mois = Range("F3").Value
      On Error GoTo errMonth
      m = Application.Match(Mois, arr, False) - 1
    '------------------------------------------
    ' Le reste de ton programme
    '------------------------------------------
     v = Sheets("Feuil1").Range("F12").Value

     If Sheets("feuil2").Range("c" & (a + m)).Value = "" Then
        Sheets("Feuil2").Range("C" & (a + m)).Value = v
     Else
        If MsgBox("Attention, vous êtes sur le point de détruire des données déja existantes !", vbYesNo) = vbYes Then
        Sheets("Feuil2").Range("C" & a + m).Value = v
        End If
     End If
End If
'------------------------------------------
' Code à placer A la fin de ton Sub
'    Gestion des "Erreurs"
'------------------------------------------
 Exit Sub
errMonth:
 ' La valeur n'existe pas dans le tableau
 MsgBox "Le mois demandé " & Mois & " n'existe pas"
 Exit Sub

End Sub

Commenter la réponse de jordane45
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Qu'afficherait :
m = Month("01 " & Range("F3").Text & " 2000") -1
msgbox m
(où 2000 pourrait être remplacé par n'importe quel millésime de ce siècle) ?
Ce qui n'affranchit pas, bien sûr, de la gestion d'erreur telle que vue.

Cette manière de procéder a un avantage supplémentaire, par rapport à l'array : elle n'exige pas l'observation d'une casse rigoureuse en F3

Et qu'afficherait par ailleurs ceci ? :
a = (Range("E3").Value Mod 2012) + 3 + (12 * (Range("E3").Value - 2012))
MsgBox a

ou encore (plus simple) ceci :
a = (13 * (Range("E3").Value - 2012)) + 3
MsgBox a

________________________
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
paolo_m
Messages postés
16
Date d'inscription
dimanche 27 novembre 2011
Dernière intervention
21 février 2014
-
Effectivement ces trois codes indique bien la valeur que je veux donner à m et à a !
Commenter la réponse de ucfoutu

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.