boucle sur cellule vide avant sauvegarde ?

assniok

XLDnaute Occasionnel
Bonjour,

Je cherche a empecher la sauvegarde d'un fichier excel si certaines cellules sont vides.

j'ai deja commencé un bout de code vba que j'ai placé dans un module :

Code:
sub test
If Sheets("SAP").Range("T1").Value <> Date Then
MsgBox ("Merci de compléter la DATE avant d'enregistrer.")
Sheets("SAP").Select
Range("T1").Select
Cancel = True
End If
end sub
sub test
If Sheets("SAP").Range("G1").Value <> Date Then
MsgBox ("Merci de compléter la quantité avant d'enregistrer.")
Sheets("SAP").Select
Range("G1").Select
Cancel = True
End If
end sub

J'ai placé dans ThisWorkBook :

Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Call test
End Sub

cela m'affiche bien une alerte mais n'empeche pas la sauvegarde, de plus j'aimerais rajouter une boucle la dessus mais je n'y arrive pas :( (tant que la cellule est vide, on ne sauvegarde pas...)

Pouvez vous m'aider ?

Merci d'avance et bonne journée.
 

Dranreb

XLDnaute Barbatruc
Re : boucle sur cellule vide avant sauvegarde ?

Bonjour,

La variable Cancel passée par adresse à la Private Sub Workbook_BeforeSave n'est pas connue dans d'autres procédures. Il faut la modifier depuis celle ci. Peut-être pourriez vous transformer votre sub test en Function test() as Boolean à affecter au Cancel, et transformer les Cancel = en test =

Cordialement.
 

ROGER2327

XLDnaute Barbatruc
Re : boucle sur cellule vide avant sauvegarde ?

Bonjour à tous
Deux propositions à tester :
  1. VB:
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Call test
    End Sub
    
    Sub test()
      With Sheets("SAP")
        Do
          If .Range("T1").Value <> Date Then .Range("T1").Value = InputBox("Merci de compléter la DATE avant d'enregistrer.")
          If .Range("G1").Value <> Date Then .Range("G1").Value = InputBox("Merci de compléter la quantité avant d'enregistrer.")
        Loop Until IsDate(Range("T1")) And IsDate(Range("G1"))
      End With
    End Sub
  2. VB:
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Cancel = test
    End Sub
    
    Function test() As Boolean
      With Sheets("SAP")
        If .Range("T1").Value <> Date Then .Range("T1").Value = InputBox("Merci de compléter la DATE avant d'enregistrer.")
        If .Range("G1").Value <> Date Then .Range("G1").Value = InputBox("Merci de compléter la quantité avant d'enregistrer.")
        test = Not (IsDate(Range("T1")) And IsDate(Range("G1")))
      End With
    End Function
(Sans certitude : il semblerait que votre code suggérât de saisir une quantité en G1 dont on teste par ailleurs la valeur pour la comparer à la date courante…)​
ROGER2327
#5064


Mardi 17 Pédale 138 (Saint Dricarpe, prosélyte, SQ)
21 Ventôse An CCXIX
2011-W10-5T14:59:48Z
 

assniok

XLDnaute Occasionnel
Re : boucle sur cellule vide avant sauvegarde ?

Bonjour a tous,

Je reviens un peu tard, mais merci beaucoup pour ces reponses qui me font bien avancer.

Je suis entrain de tester la derniere solution donnee par Roger2327.

Et en effet, j'ai fait une petite erreur dans le code au niveau de la date, la deuxieme cellule testée n'est pas une date mais une quantité.

J'ai egalement une question peut etre stupide.

Comment je peux enregistrer mon modele en laissant les cellules T1 et G1 vides mais qu'une fois enregistré le code soit actif pour les utilisateurs (que la macro fasse son effet en fait, empecher la sauvegarde d'un fichier ou T1 et G1 ne serait pas completé)

merci d'avance et bonne journée
 

Dranreb

XLDnaute Barbatruc
Re : boucle sur cellule vide avant sauvegarde ?

Bonjour.
Ne pourriez vous dissocier les InputBox de leur affectation aux valeurs de cellules et prévoir entre les deux une réponse spéciale à votre intention de développeur, vidant les cellules et sauvegardant le classeur ?
À+
 

assniok

XLDnaute Occasionnel
Re : boucle sur cellule vide avant sauvegarde ?

Bonjour.
Ne pourriez vous dissocier les InputBox de leur affectation aux valeurs de cellules et prévoir entre les deux une réponse spéciale à votre intention de développeur, vidant les cellules et sauvegardant le classeur ?
À+

En effet, ce serait la meilleure approche.

Pourriez vous me donner un exemple de comment je pourrais faire cela ?

Merci
 

Dranreb

XLDnaute Barbatruc
Re : boucle sur cellule vide avant sauvegarde ?

Eh bien en reprenant la solution 2 de ROGER2327, que je salue, ça donnerait:
VB:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = test
End Sub

Function test() As Boolean
Dim Rép as string
  With Sheets("SAP")
    If .Range("T1").Value <> Date Then 
         Rép = InputBox("Merci de compléter la DATE avant d'enregistrer.")
         If Rép <> "µ" then .Range("T1").Value = Rép Else Test = False: Exit Function
         End If
    If .Range("G1").Value <> Date Then .Range("G1").Value = InputBox("Merci de compléter la quantité avant d'enregistrer.")
    test = Not (IsDate(Range("T1")) And IsDate(Range("G1")))
  End With
End Function
 
Dernière édition:

assniok

XLDnaute Occasionnel
Re : boucle sur cellule vide avant sauvegarde ?

Merci pour cette reponse aussi rapide.

J'aimerais savoir une precision, je dois verifier 3 types de cellules, la premiere (T1) qui doit contenir une date.

Mais aussi F3 qui dont contenir un Nom et W14 qui doit contenir une valeur numerique.

Je pense que pour la date cela convient, mais pas pour le reste.

Est il possible de faire cela comme ça :

Code:
If .Range("F3").Value <> IsEmpty Then .Range("F3").Value = InputBox("Merci de compléter la quantité avant d'enregistrer.")

Si non, que faut il utiliser a la place de IsDate ?

De plus, je ne sais toujours pas comment enregistrer mon fichier sans remplir ces cellules (normal puisque c'est ce que je cherche a faire) mais j'aimerais que cela soit actif une fois le modele creer pour de bon...

encore merci pour votre aide
 

ROGER2327

XLDnaute Barbatruc
Re : boucle sur cellule vide avant sauvegarde ?

Bonsoir à tous
Cette proposition suppose que vous utilisez un classeur de macros personnelles, génériquement nommé PERSO.XLS.
Si tel est le cas, on suppose de plus que vous y avez placé un identifiant personnel (i.e. une chaîne de caractères ad libitum) dans la première cellule de la première feuille.

Sous ces hypothèses, le code suivant vous permettra de vous dispenser de la procédure de validation de la fermeture du classeur, sous réserve de saisir votre identifiant personnel.
VB:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  Cancel = toto()
End Sub

Private Function toto() As Boolean
Dim admin$
  On Error Resume Next
  admin = Workbooks("PERSO.XLS").Sheets(1).Range("A1").Value
  If Err.Number = 0 Then
    On Error GoTo 0
    If InputBox("Si vous êtes l'administrateur de ce fichier, saisissez votre mot de passe.") = admin Then toto = False Else toto = True
  Else
    On Error GoTo 0
    With Sheets("SAP")
      If .Range("T1").Value <> Date Then .Range("T1").Value = InputBox("Merci de compléter la DATE avant d'enregistrer.")
      If IsEmpty(.Range("G1")) Or Not IsNumeric(.Range("G1").Value) Then .Range("G1").Value = InputBox("Merci de compléter la quantité avant d'enregistrer.")
      If Len(CStr(.Range("F3").Value)) = 0 Then .Range("F3").Value = InputBox("Merci de saisir votre nom avant d'enregistrer.")
      toto = Not IsDate(.Range("T1")) Or IsEmpty(.Range("G1")) Or Not IsNumeric(.Range("G1").Value) Or Len(CStr(.Range("F3").Value)) = 0
    End With
  End If
End Function
ROGER2327
#5108


Mardi 24 Pédale 138 (Nativité de Saint Stéphane, faune, SQ)
28 Ventôse An CCXIX
2011-W11-5T17:46:43Z
 

Discussions similaires

Statistiques des forums

Discussions
312 294
Messages
2 086 896
Membres
103 404
dernier inscrit
sultan87