SOUS-TITRES : INCRÉMENTATION DE TOUTES LES CHAÎNES DE CARACTÈRES "HH:MM:SS,MMM"

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 5 janv. 2012 à 08:40
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 6 janv. 2012 à 19:10
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53945-sous-titres-incrementation-de-toutes-les-chaines-de-caracteres-hh-mm-ss-mmm

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
6 janv. 2012 à 19:10
Attention : Minute est un mot clé du langage, donc à bannir des noms de variables
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
6 janv. 2012 à 07:06
J'aime bien ce genre d'exercice de bon matin, ca permet de garder l'oeil vif ^^

"ça va forcément planter et afficher un message, non?"

oui, mais au moins, là, c'est notre message... et on prend de bonnes habitudes.
macro, ca va, mais sur un programme VB6 (ou dans un UserForm), ce serait plantage direct (avec message) mais fermeture de l'application.
En règle général, tout ce qui vient de l'exterieur doit etre vérifié (saisie, fichier...) un test bien placé peut éviter de lancer des traitements parfois destructeurs

et oui, il s'agit bien d'une expression régulière^^
cs_ALMIRA Messages postés 1 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 5 janvier 2012
5 janv. 2012 à 23:16
Impressionnant Renfield!!!
Je ne m'attendais pas à un commentaire si rapide et de cette qualité, pour ce petit morceau de code. Merci !
Pour être honnête je n'ai pas tout compris, il faut que je me pose tranquillement et que je regarde ça.
D'accord pour utiliser un string au lieu d'un Long...
encore que si l'utilisateur ne rentre pas des chiffres ça va forcément planter et afficher un message, non?
ensuite cela ressemble à une expression régulière, pour enlever les --> et autres signes de ponctuation, ok...
Désolé, je reprends ça un peu plus tard
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 janv. 2012 à 08:40
J'ai nettoyé et commenté ton code.

Sub IncrementTempo()
Dim sBuffer As String
Dim nMilliSeconds As Long
Dim oMatch As Object
'# La saisie est une chaîne de caractère.
'# Evite un plantage en cas de saisie incorrecte.
sBuffer = InputBox("temps additionnel en millisecondes", "Tempo")
If Not IsNumeric(sBuffer) Then '# Verifications d'usage...
MsgBox "Saisie incorrecte"
ElseIf CLng(sBuffer) = 0 Then
MsgBox "Aucun décalage a appliquer"
Else
'# On convertit le décalage en numérique
nMilliSeconds = CLng(sBuffer)
With CreateObject("VbScript.Regexp")
'# Permet le ciblage et le découpage des lignes qui nous interessent.
.Pattern = Chr$(11) & "(\d+\:\d+\:\d*)(,?\d*)( +--> +)(\d+\:\d+\:\d*)(,?\d*)"
.Global = True
.Multiline = True
'# On ne touche pas a la selection, ce n'est jamais necessaire et peut perturber l'utilisateur
'# Cela déplace l'ascenseur, fait perdre a l'utilisateur sa selection courante, etc.
For Each oMatch In .Execute(ActiveDocument.Range(1).Text)
With oMatch
'# On reconstitue la chaine, ajoutant le décalage
sBuffer = Chr$(11) & _
AdditionTempo(.subMatches(0), .subMatches(1), nMilliSeconds) & _
.subMatches(2) & _
AdditionTempo(.subMatches(3), .subMatches(4), nMilliSeconds)
'# On remplace la chaine de départ par la notre.
ActiveDocument.Range(.FirstIndex + 1, .FirstIndex + 1 + .Length).Text = sBuffer
End With
Next oMatch
End With
End If
End Sub

'# A un temps donné, va ajouter un nombre de secondes et de millisecondes donné.
'# Le nombre de secondes est la partie décimale lue dans le fichier
Private Function AdditionTempo(ByVal vdTime As Date, ByVal vsSeconds As String, ByVal vnMilliSeconds As Long) As String
'# On cumule la fraction de secondes lue dans le fichier avec le décalage souhaité.
If IsNumeric(vsSeconds) Then
'# On s'arrange avec les virgules ou les points pouvant figurer dans le fichier srt.
'# redondant ? peut etre, mais on s'assure que notre code sera fonctionnel quels que soient les parametres regionnaux
vnMilliSeconds = vnMilliSeconds + CDbl(vsSeconds) * 1000
Else
vnMilliSeconds = vnMilliSeconds + Val(vsSeconds) * 1000
End If

'# On met a jour la date
vdTime = DateAdd("s", CLng(vnMilliSeconds / 1000), vdTime)
'# Et On prépare la partie décimale restante
vnMilliSeconds = vnMilliSeconds - Fix(vnMilliSeconds / 1000) * 1000
If vnMilliSeconds < 0 Then '# Vrai lorsque l'on soustraie un certain nombre de secondes
vnMilliSeconds = vnMilliSeconds + 1000
End If

'# Formatage de la date.
AdditionTempo = Format$(vdTime, "hh:nn:ss") & Format$(vnMilliSeconds, "\,000")
End Function
Rejoignez-nous