Collage spéciale diviser par une constante

Bonjour,

je reçois régulièrement des fichiers avec des temps en centième que je convertis en hh:mm:ss.

je copie 86400 dans une cellule, je copie, je fais un collage spécial avec Division, puis j'affecte le format personnalisé hh:mm:ss. Puis j'efface ma cellule à 86400

Pour automatiser cette opération, j'ai déclaré une constante au niveau du module

    Const ConvSs As Long = 86400    'Ajouter un format hh:mm:ss

mais après je ne sais pas mettre ma constante en mémoire.

J'ai essayé

    Range("C4:C12", Range("C4").End(xlToRight)).Select
    Selection.PasteSpecial Paste:=xlPasteValues(ConvSs), operation:=xmdivide, skipblanks _
        :=fase, Transpose:=False
     Selection.NumberFormat = "h:mm:ss"

mais ça ne fonctionne pas. Peut-être peut-on créer une fonction ? mais là encore, je ne sais pas faire...

QQ'1 peut-il m'aider, svp.

Merci

Bonjour,

Pourquoi ne fais-tu pas simplement

Const ConvSs As Long = 86400    'Ajouter un format hh:mm:ss
Dim Cel As Range
    For Each Cel In Range("C4:C12", Range("C4").End(xlToRight))
        Cel = Format(Cel / ConvSs, "h:mm:ss")
    Next

A+

Bonsoir Frangy

Merci pour ta réponse ; mais c'est pas top...

En effet, ça mouline plus d'une mn, j'ai arrêté avec ctl Pause puis j'ai réduit avec

    Const ConvSs As Long = 86400    'Ajouter un format hh:mm:ss
    Dim Cel As Range
        For Each Cel In Range("C4:F12")
            Cel = Format(Cel / ConvSs, "h:mm:ss")
        Next

Là, ça divise bien par 86400, mais ça n'applique pas le format hh:mm:ss, c'est à dire que j'ai mes cellule à 0, puis si j'applique le format c'est Ok.

PS : mon fichier va jusqu'à la colonne COR, ça doit correspondre à un peu plus de 1000 colonnes.

Merci pour ton aide

Voici mon fichier test avec 1200 colonnes

22classeur1.xlsm (67.11 Ko)

A+

Merci encore Frangy,

Effectivement, ton fichier fonctionne parfaitement bien en 5,65 seconde, alors que pour mon fichier, ça met plus de 87 s avec un résultat sous la forme : 0,067349537037037 au lieu de 01:25:36 (par exemple).

Je pense que c'est mon fichier d'origine qui a un format personnalisé #0, je ne sais pas à quoi ça correspond, mais ça semble "foutre un m..." incroyable ; ce fichier d'origine me vient d'un fournisseur.

Je te joins tout ça si tu y comprends qq chose ? https://www.cjoint.com/c/CBxvSYHrkpl

Merci encore

Bonsoir,

0.25s ça te va ?

Sub test()
    Const ConvSs As Long = 86400    'Ajouter un format hh:mm:ss
    Dim plage As Range
    Dim data As Variant, lig As Long, col As Long
    Dim T As Single
    T = Timer
    Application.ScreenUpdating = False
    Set plage = Range("C4:C12", Range("C4").End(xlToRight))
    data = plage
    For lig = 1 To plage.Rows.Count
        For col = 1 To plage.Columns.Count
            data(lig, col) = data(lig, col) / ConvSs
        Next col
    Next lig
    plage = data
    plage.NumberFormat = "hh:mm:ss"
    Application.ScreenUpdating = True
    MsgBox Timer - T    '0.25s
End Sub

eric

Excellent

Peux pas mieux !

A+

Bonsoir Eric,

Impressionnée même, mais pourrais-tu m'expliquer l'idée du Data = plage puis du plage = data.

ça a l'air un peu compliqué, quand on voit comme c'est simple manuellement (collage spécial), mais c'est rudement efficasse.

J'aimerai bien savoir faire ça pour autre chose...

donc, si tu as encore un peu de temps pour m'expliquer, ce serait sympa de ta part.

Egalement si tu as compris le pb du format d'origine qui ne semble pas affecter ton code, alors qu'il affectait celui de Frangy...

En tous les cas un grand merci à vous deux et à bientôt

Validé...

Re,

Data = plage :

On charge les données pour travailler dessus en mémoire.

On lit toute la plage en une fois et on l'écrit en une fois avec plage=data (on pourrait même se passer du screenupdating=false qui doit faire gagner seulement 0.3s).

C'est beaucoup, beaucoup plus rapide que de lire et écrire toutes les cellules une par une.

Egalement si tu as compris le pb du format d'origine qui ne semble pas affecter ton code, alors qu'il affectait celui de Frangy...

Je n'ai pas regardé le code de Frangy, je ne sais pas s'il y avait un problème.

J'ai juste appliquer le format nombre voulu sur la plage avec :

plage.NumberFormat = "hh:mm:ss"

eric

Bonjour Éric,

Ça valait la peine que je demande, car l'explication est claire et l'information (que je n'ai vu nulle part - je ne dis pas qu'elle n'y est pas...) est des plus intéressante.

Encore une fois merci beaucoup Éric, bonne journée

Rechercher des sujets similaires à "collage speciale diviser constante"