Appliquer formule sur plusieurs cellules

r3dkross

XLDnaute Nouveau
Bonjour à tous, bonjour au forum,

Je viens vers vous car je n’arrive pas à trouver la solution pour compter les horaires d’un planning en VBA:

chaque horaire journalier est affiché ainsi:
0930-1200/1300-1830
J’ai donc fait la formule suivante pour trouver le nombre d’heures (ici en C9):
=(STXT(C9;6;4)-(STXT(C9;1;4))+(STXT(C9;16;4)-(STXT(C9;11;4))))/100
Ce qui me donne 8 soit 8h
Ce que je souhaiterais maintenant c’est pouvoir appliquer cette formule sur l’ensemble des horaires existants dans le tableau.

malheureusement je bloque car je ne sais pas comment copier la valeur actuelle de la cellule, appliquer la formule correspondante et enfin coller le résultat dans la même cellule.

je souhaite si possible le faire en vba car le planning est évolutif et je l’intègrerais dans une macro par la suite

merci beaucoup par avance pour votre aide, je vous joint un fichier correspondant.

bien à vous,

rk
 

Pièces jointes

  • Copie de HEURES.xlsb
    21 KB · Affichages: 7
Solution
VB:
Sub convH()
    Dim pl As Range, c As Range, tmp, ch As String, i As Long
    Set pl = Selection.SpecialCells(xlCellTypeConstants, xlTextValues)
    If pl Is Nothing Then Exit Sub
    For Each c In pl
        If Left(c.Value, 1) = ":" Then ch = Mid(c.Value, 2) Else ch = c.Value
        If ch Like "####-####/####-####" Then
            tmp = Split(Replace(ch, "/", "-"), "-")
            For i = 0 To 3: tmp(i) = Format(tmp(i), "00:00"): Next i
            c.Value = TimeValue(tmp(1)) - TimeValue(tmp(0)) + TimeValue(tmp(3)) - TimeValue(tmp(2))
            c.NumberFormat = "hh:mm"
        End If
    Next c
End Sub
sélectionne la plage à traiter et lance la macro.
Comme elle ne traite que les cellules contenant hhmm-hhmm/hhmm-hhmm tu...

r3dkross

XLDnaute Nouveau
Bonjour,

voilà ce qui arrive quand on fusionne inutilement.
C: D sont fusionnées, tu as donc un résultat valide toutes les 2 colonnes.
Supprime tes colonnes D, F, H, etc et élargi les autres.
eric

Bonjour Eriiic, merci pour ton retour.

Il est vrai que le fichier sort toujours avec des cellules fusionnées ce qui n’est guère pratique .

J’ai par contre mal du m’exprimer, je souhaite que le calcul se fasse dans la cellule concernée comme C9 par exemple et qu’ensuite le résultat de la formule vienne remplacer le contenu de la cellule C9, et faire de même pour toutes les cellules entre C9 et BL26.
J’espère que c’est un peu plus clair :/

Merci encore
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Testez déjà cette macro qui remplace par une formule ce texte dans la première cellule de la plage fusionnée sélectionnée :
VB:
Sub Test()
Dim Cel As Range, S As String
Set Cel = Selection(1, 1).MergeArea(1, 1)
S = Cel.Value
If S Like "####-####/####-####" Then
   Cel.Formula = "=""" & Mid$(S, 6, 2) & ":" & Mid$(S, 8, 2) & """-""" & Mid$(S, 1, 2) & ":" & Mid$(S, 3, 2) _
      & """+""" & Mid$(S, 16, 2) & ":" & Mid$(S, 18, 2) & """-""" & Mid$(S, 11, 2) & ":" & Mid$(S, 13, 2) & """"
   Cel.NumberFormat = "[h]:mm": End If
End Sub
 

eriiic

XLDnaute Barbatruc
VB:
Sub convH()
    Dim pl As Range, c As Range, tmp, ch As String, i As Long
    Set pl = Selection.SpecialCells(xlCellTypeConstants, xlTextValues)
    If pl Is Nothing Then Exit Sub
    For Each c In pl
        If Left(c.Value, 1) = ":" Then ch = Mid(c.Value, 2) Else ch = c.Value
        If ch Like "####-####/####-####" Then
            tmp = Split(Replace(ch, "/", "-"), "-")
            For i = 0 To 3: tmp(i) = Format(tmp(i), "00:00"): Next i
            c.Value = TimeValue(tmp(1)) - TimeValue(tmp(0)) + TimeValue(tmp(3)) - TimeValue(tmp(2))
            c.NumberFormat = "hh:mm"
        End If
    Next c
End Sub
sélectionne la plage à traiter et lance la macro.
Comme elle ne traite que les cellules contenant hhmm-hhmm/hhmm-hhmm tu peux tailler large pour la sélection sans problème, la feuille entière si tu veux.
Je traite aussi celles au même format précédées de ":" comme cette anomalie a l'air récurrente.
Je met les heures au format excel : 8:00
Si tu veux vraiment 8 tu as juste à multiplier par 24 dans la macro et supprimer l'ajout du format "hh:mm"
eric

Edit : je viens de voir que tu as des 1300-2000
Complète le test :
Code:
If ch Like "####-####/####-####" or ch Like "####-####" Then
par contre je te laisse le soin de contrôler que la sélection de la feuille entière ne crée pas d'anomalies. Sinon restreint ta sélection
 
Dernière édition:

Discussions similaires

Réponses
4
Affichages
256

Statistiques des forums

Discussions
311 720
Messages
2 081 909
Membres
101 836
dernier inscrit
karmon