Gestion des type de cellule
bonjour
je revient vers vous car je n'avance plus dans mon projet...
pour fair cour, l’idée: on doit passer ^par différent point et noter l'heure et date du passage,
j'ai donc (avec votre aide) rédiger quelque ligne qui me permette d'horodater une colonne (la 7) sur double clic, j'ai ajouter un test qui vérifié que la cellule est vide, et si elle comprend déjà une valeur un MSGBOX me propose d'effacer les datas ou de les garder... le tout devant tourner sur une tablette, mais ej n'en suis pour l'heure qu'au développement sur PC
cela aller très bien sur ma maquette, mais quand j'ai voulus coller ces lignes sur le fichier "utile" j'ai des retours "erreur 13" sur la ligne "If Target.Value = "0""... je n'arrive pas a trouver le bon type de de donnée dans mes cellules, (j'imagine que pour excel une cellule est une variable défini par son X; Y et type)... j'ai bien essayer d'afficher le type de variable dans un msgbox, mais même retour "13", et j'ai beau fouiller le net je ne trouve pas d'explication sur la manipulation du type de variables...
si l'un d'entre vous peu m'indiquer de quel coté chercher..
copie de "mon" code:
Private Sub worksheet_beforedoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column = 7 Then
If Target.Value = "0" Then
Target.Value = Now
Else
choix = MsgBox("Attention horodatage deja defini souhaiter vous effacer le contenu", vbQustion + vbYesNo + vbDefaultButton2, "Est tu sure")
If choix = vbYes Then
MsgBox ("OK tampis pour toi")
Target.Value = Clear
End If
End If
End If
Cancel = True
End Submerci a vous
Bonjour
Le code fonctionne correctement chez moi, sans erreur.
Cependant, voici quelques modifs :
Private Sub worksheet_beforedoubleClick(ByVal Target As Range, Cancel As Boolean)
With Target
If .Column = 7 Then
If Not IsDate(.Value) Then
.Value = Now
Else
If MsgBox("Attention horodatage déjà défini. Souhaites-tu effacer le contenu ?", vbQuestion + vbYesNo + vbDefaultButton2, "Es-tu sûr.") = 6 Then
MsgBox ("OK tant pis pour toi")
.Value = Clear
End If
End If
Cancel = True
End If
End With
End Sub- Utilisez With pour simplifier le code
- Le contenu de la cellule (colonne 7) devant être une date, on teste si une date est déjà présente.
- Si date présente : demande confirmation pour une remise à zéro (inutile de passer par une variable). Attention : Clear efface également la mise en forme.
- Si date absente (ou non date), on place la date actuelle.
- Le Cancel=True est utilisé uniquement si on est en colonne 7 (pour les autres colonnes on doit pouvoir entrer dans les cellules).
- Correction de quelques fautes.
Pour les tests selon le type de cellule, voir le post https://www.excel-pratique.com/fr/fonctions-vba/vartype#google_vignette
On aurait pu écrire : If VarType(.Value) <> 7 Then ou If VarType(.Value) <> vbDate Then
Bonne journée
merci pour ton rapide retour.. .
alors effectivement ça marche mieux que "ma vrs" mais reste un tit problème que je n'arrive pas a corriger... le test savoir si la case n'est pas déjà remplie; quelque que soit l'étas de ma cellule il l’écrase avec la date "now"
peut être car c'est une date ET une heure, j'ai essayer de filtrer avec un "variable type variant = Left (.value,, 8)" mais retour de ma vielle copine erreurs 13 d’ès la tentative d'affectation de la valeur a ma variable ... sic
pour le whith, je l'avais bien vue, mais j'avoue que re-ecrire a chaque fois toute ma variable est plus "parlant" a mon niveau, merci de
l'info au moins autant faire directement propre
existe t’il en VBA un mode débogage pas a pas avec possibilité d'afficher les contenue et type des variable je n'avais plus du toucher au basic depuis le spectrum... et j'ai pris de "mauvaise" habitudes ayant principalement développer en 4D
merci a tous bonne journée/WE
Re
La présence de l'heure dans la date ne change rien. Pour n'avoir que la date il suffit de formater la colonne 7 :
(Sélectionner toute la colonne et bouton droit, format de cellule, date, "*14/03/2012" par exemple)
De toute façon elle doit être au format Date. Si elle ne l'est pas, ça peut expliquer ton problème d'erreur 13. Les dates présentes sont alors au format texte ; il faudra les réenregistrer (ou les transposer).
Pour ce qui est de la présence d'une donnée autre que date dans la cellule, il suffit de tester le contenu et demander, via un message s'il faut écraser le contenu.
L'affectation de la date du jour reformate la cellule pour qu'elle reste au format date.
Private Sub worksheet_beforedoubleClick(ByVal Target As Range, Cancel As Boolean)
With Target
If .Column = 7 Then
If .Value = Empty Then
' Vide place la date au format
.Value = Now
.NumberFormat = "dd/mm/yyyy"
Else
If IsDate(.Value) Then
' Date présente, supprimer ?
If MsgBox("Attention horodatage déjà défini. Souhaites-tu effacer le contenu ?", vbQuestion + vbYesNo + vbDefaultButton2, "Es-tu sûr.") = 6 Then
MsgBox ("OK tant pis pour toi")
.Value = Clear
End If
Else
' Autre donnée : Confirmer le remplacement
If MsgBox("Remplacez le contenu par la date du jour ?", vbQuestion + vbYesNo + vbDefaultButton2, "Donnée présente") = 6 Then
.Value = Now
.NumberFormat = "dd/mm/yyyy"
End If
End If
End If
Cancel = True
End If
End With
End SubCe code peut être simplifié bien-sûr.
Pour tester le contenu et le type des cellules en mode débogage et pas à pas, il suffit d'ajouter des espions.
Ici Target.value qui doit donner la date complète et être de type Variant/Date
et Vartype(Target.value) qui doit donner 7 (date) de type Long.
Bonne journée
merci a toi, je n'arrive toujours pas a faire le test de cellule vide.. .mais pas grave pour l'instant, déjà il prend l'horodatage, je verrais plus tard, ça me donnera l’occasion d'avancer mes connaissance en excel/VBA... déjà l’essentiel est la... après c'est du plus/sécurité
merci a toi et au fofo... c'est toujours bon de pouvoir (comme disait jean pierre) faire appelle a un ami.. .;-)... bonne soiree