2 votes

Comment obtenir le texte exact qu'un utilisateur a entré dans une cellule dans Excel ?

Je dois commencer par dire que je ne connais pas VBA

Je dois saisir un grand nombre de valeurs temporelles dans Excel. Comme cela me ralentit vraiment de saisir les deux points en tapant, j'ai pensé écrire une macro qui me permettrait de saisir une chaîne comme "18.10" et de la convertir en "18:10". (Je pourrais alors utiliser le pavé numérique et saisir les heures rapidement).

J'ai bricolé la fonction permettant de convertir n'importe quelle chaîne (délimitée) en heure - c'était facile. Mais maintenant, j'ai des problèmes avec mon gestionnaire d'événement car je ne peux pas accéder à la fonction texte exact que je saisis parce qu'Excel semble le traiter comme un nombre et couper les 0 de fin de ligne.

Par exemple, 18.10 est converti en 18.1 - qui est converti en 18:01 (et non 18:10 comme je le souhaite).

Voici mon code de gestion des changements (copié depuis l'interweb)

    Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim TimeStr As String

' This code copied from Chip Pearson
'http://www.cpearson.com/excel/DateTimeEntry.htm
If Application.Intersect(Target, Range("C6:F1000")) Is Nothing Then
    Exit Sub
End If
If Target.Cells.Count > 1 Then
    Exit Sub
End If
If Target.Value = "" Then
    Exit Sub
End If

Application.EnableEvents = False
With Target
    TimeStr = .Text  ' What should I use here????
    If .HasFormula = False Then
        .Value = ConvertToTime(TimeStr)
    End If
End With
Application.EnableEvents = True
Exit Sub

EndMacro : MsgBox "Vous n'avez pas saisi une heure valide". Application.EnableEvents = True End Sub

Comme vous pouvez le constater, j'utilise actuellement Text - J'ai regardé toutes les propriétés sur Target dans le débogueur et je n'en ai trouvé aucun qui ressemblait au texte brut saisi. Existe-t-il un moyen d'accéder à la valeur ?

Toute aide est la bienvenue.


Merci à Issun et Craig. Issun a raison - je complique trop les choses (en ce qui concerne la conversion en temps). Voici ce que j'ai mis au point et qui fonctionne plutôt bien.

' This requires the format of the cells to ce "0.00" to prevent trailing 0s being trimmed
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
On Error GoTo ErrHandler:

Dim TimeStr As String
Dim TimeVal
' I am only entering times in this range
If Application.Intersect(Target, Range("C6:F1000")) Is Nothing Then
    Exit Sub
End If
If Target.Cells.Count > 1 Then
    Exit Sub
End If
If Target.Value = "" Then
    Exit Sub
End If

TimeStr = Replace(Target.Text, ".", ":")
TimeVal = TimeValue(TimeStr)
Application.EnableEvents = False
Target.Value = TimeVal
Target.NumberFormat = "h:mm"
Application.EnableEvents = True

Exit Sub
ErrHandler:
Exit Sub
End Sub

Sub SetTimeFormat()
    Selection.NumberFormat = "h:mm"
End Sub

Sub SetNumFormat()
    Selection.NumberFormat = "0.00"
End Sub

Comme mentionné dans le commentaire, j'ai trouvé que changer le format de la cellule en "0.00" fonctionne bien. Les heures entrées comme "18.1" sont converties en "18:10" (au lieu de 18:01), mais cela me convient parfaitement.

Les deux dernières macros sont affectées à deux touches de raccourci, de sorte que si je fais une erreur, je peux rapidement reconvertir le format de la cellule en numérique et terminer la valeur à nouveau.

4voto

starlocke Points 182

Si vous changez le format de la cellule en texte (Format des cellules -> Texte), cela conservera le 18.10 et vous permettra d'analyser la valeur plus facilement.

Edit : Lorsque vous exécutez votre macro, ajoutez une ligne similaire à :

Selection.NumberFormat = "h:mm AM/PM"

Cela devrait alors reformater les cellules au format "heure".

2voto

Issun Points 7271

Si tout ce que vous voulez faire est de changer 18.10 en 18:10, cliquez sur le coin supérieur gauche de la feuille pour sélectionner toutes les cellules, et changez le format en texte. Ensuite, tapez et faites une recherche et un remplacement pour "." et " :" lorsque vous avez terminé.

Si vous le souhaitez, voici un moyen amusant de mettre en forme automatiquement ce que vous saisissez au moment où vous le tapez. Dans l'éditeur VBA, double-cliquez sur Sheet1 ou sur la feuille sur laquelle vous travaillez, puis entrez ce code :

Private Sub Worksheet_Change(ByVal Target As Range)

If InStr(Target.Value, ".") <> 0 Then
    Application.EnableEvents = False
    Target.Value = Replace(Target.Value, ".", ":")
    Target.NumberFormat = "h:mm AM/PM"
    Application.EnableEvents = True
End If

End Sub

Cette fonction vérifie d'abord s'il y a un "." dans la cellule que vous venez de modifier ou de taper. Si c'est le cas, il désactive les événements (afin que la modification qu'il s'apprête à effectuer ne déclenche pas un autre événement de modification), puis il remplace le "." par " :". Il le convertit ensuite au format de l'heure.

Voici un exemple de ce qui se passe. Une remarque : pour xx:30, vous devez taper un "." supplémentaire pour qu'Excel ne se trompe pas.

1 h 15 deviendra 1 h 15 du matin

13.15 deviendra 1:15 PM

16:30. deviendra 4:30 PM

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X