Fenetre qui continue une action ou l'annule

Résolu
paolo_m Messages postés 16 Date d'inscription dimanche 27 novembre 2011 Statut Membre Dernière intervention 21 février 2014 - 16 févr. 2014 à 18:44
paolo_m Messages postés 16 Date d'inscription dimanche 27 novembre 2011 Statut Membre 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

9 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
16 févr. 2014 à 21:14
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
1
paolo_m Messages postés 16 Date d'inscription dimanche 27 novembre 2011 Statut Membre Dernière intervention 21 février 2014
16 févr. 2014 à 23:56
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
Modifié par ucfoutu le 16/02/2014 à 19:04
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
0
paolo_m Messages postés 16 Date d'inscription dimanche 27 novembre 2011 Statut Membre Dernière intervention 21 février 2014
16 févr. 2014 à 20:23
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) ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
Modifié par ucfoutu le 16/02/2014 à 20:54
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
0

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

Posez votre question
jordane45 Messages postés 37725 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 26 septembre 2023 342
Modifié par jordane45 le 16/02/2014 à 21:28
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
0
paolo_m Messages postés 16 Date d'inscription dimanche 27 novembre 2011 Statut Membre Dernière intervention 21 février 2014
17 févr. 2014 à 00:10
Merci pour le lien.
0
jordane45 Messages postés 37725 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 26 septembre 2023 342
16 févr. 2014 à 21:35
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


0
paolo_m Messages postés 16 Date d'inscription dimanche 27 novembre 2011 Statut Membre Dernière intervention 21 février 2014
Modifié par paolo_m le 17/02/2014 à 00:12
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
0
jordane45 Messages postés 37725 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 26 septembre 2023 342
Modifié par jordane45 le 17/02/2014 à 01:01
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 ^^
0
jordane45 Messages postés 37725 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 26 septembre 2023 342
17 févr. 2014 à 00:40
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

0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
17 févr. 2014 à 00:45
des 2; mon capitaine
ucfoutu 16 févr. 2014 à 21:14
jordane45 16 févr. 2014 à 21:28
0
jordane45 Messages postés 37725 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 26 septembre 2023 342
17 févr. 2014 à 01:05
Le temps de rédiger mon message il a posté le sien.. et je ne l'avais pas vu ^^
0
jordane45 Messages postés 37725 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 26 septembre 2023 342
Modifié par jordane45 le 17/02/2014 à 01:03
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

0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
Modifié par ucfoutu le 17/02/2014 à 08:18
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
0
paolo_m Messages postés 16 Date d'inscription dimanche 27 novembre 2011 Statut Membre Dernière intervention 21 février 2014
21 févr. 2014 à 09:10
Effectivement ces trois codes indique bien la valeur que je veux donner à m et à a !
0
Rejoignez-nous