cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 6 janv. 2012 à 19:10
Attention : Minute est un mot clé du langage, donc à bannir des noms de variables
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és1Date d'inscriptionlundi 9 février 2004StatutMembreDerniè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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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
6 janv. 2012 à 19:10
6 janv. 2012 à 07:06
"ç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^^
5 janv. 2012 à 23:16
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
5 janv. 2012 à 08:40
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