Microsoft 365 mettre en forme un tableau par vba

Lolo le normand

XLDnaute Nouveau
Bonjour,
je reçois un export tous les jours que je dois transformer tous les jours pour plusieurs raisons:
  1. je filtre la colonne C équipe pour ne conserver que les lignes où figure Total
  2. les colonnes A et B sont fusionnées, une fois n'avoir gardé que les lignes totales de la colonne C, les deux premières lignes ont pour service abcd_campagne et abcd_plage; toutes les autres cellules de la colonne service contiennent des noms sous le format vf_bd_nom du service. Je souhaite n'avoir qu'une colonne (défusionner A et B) et ne conserver pour les deux premières lignes que ABCD et pour tout le reste que le nom du service.
  3. les colonnes E, O, U contiennent des informations de temps mais sous un format standard j'aimerai transformer ces temps sous le format [H]:mm:ss
  4. les colonnes G, H, S, T contiennent des informations de temps mais sous un format standard que j'aimerai transformer sous le format [mm]
  5. les colonnes V, W et X sont à supprimer
Aujourd'hui je fais tout cela de manière artisanale et si quelqu'un peut m'aider à créer un code VBA pour faire tout cela je gagnerai un temps précieux
Merci d'avance à vous
 

Pièces jointes

  • test téléphone.xlsx
    14 KB · Affichages: 14
Solution
Bonjour à tous, Bonjour @Gégé-45550
Je pense que notre ami @Lolo le normand veux aussi que la macro ne soit pas liée à un classeur mais l'avoir à disposition dans son Personal.xlb.
Je propose donc :
VB:
Sub MiseEnForme()
Dim LstRow&, i&, j&, K&
Dim TabSource As Variant, TabReport As Variant, Tmp As Variant
Dim Discrit$

Discrit = "CNMR"

With ActiveSheet
    LstRow = .Cells(.Rows.Count, 1).End(xlUp).Row
    TabSource = .Range(.Cells(1, 1), .Cells(LstRow, 21))
    K = Application.CountIf(.Columns("c"), "Total") + 1
End With
ReDim TabReport(1 To K, 1 To 21)
K = 1
TabReport(1, 1) = TabSource(1, 1)
For i = 3 To UBound(TabSource, 2)
    TabReport(1, i - 1) = TabSource(1, i)
Next i
For i = LBound(TabSource, 1) + 1 To...

Efgé

XLDnaute Barbatruc
Re
il reste une petite problématique sur les colonnes G, H,S,T le format que j'attends est [mm]:ss
Le choix des format est là
VB:
Select Case j
                Case 4, 15, 21
                    TabReport(K, j - 1) = Format(TabSource(i, j), "[H]hh:mm")
                Case 7, 8, 19, 20
                    TabReport(K, j - 1) = Format(TabSource(i, j), "[mm]mm:ss")
                Case Else
                    TabReport(K, j - 1) = TabSource(i, j)
            End Select
Tu peux choisir celui que tu veux par exemple
Code:
Select Case j
                Case 4, 15, 21
                    TabReport(K, j - 1) = Format(TabSource(i, j), "[H]hh:mm")
                Case 7, 8, 19, 20
                    TabReport(K, j - 1) = Format(TabSource(i, j), "[mm]:ss")
                Case Else
                    TabReport(K, j - 1) = TabSource(i, j)
            End Select
je dois remplacer par copier coller le fichier que je vous ai envoyé
Pour l'insant oui.
ou il y a un moyen d'enregistrer en dure votre macro?
Ce soir j'ai la flemme. J'éssaie de voir ça demain dans la journée pour faire une macro à mettre dans ton classeur de macros personnelles.

Cordialement
 

Lolo le normand

XLDnaute Nouveau
Re

Le choix des format est là
VB:
Select Case j
                Case 4, 15, 21
                    TabReport(K, j - 1) = Format(TabSource(i, j), "[H]hh:mm")
                Case 7, 8, 19, 20
                    TabReport(K, j - 1) = Format(TabSource(i, j), "[mm]mm:ss")
                Case Else
                    TabReport(K, j - 1) = TabSource(i, j)
            End Select
Tu peux choisir celui que tu veux par exemple
Code:
Select Case j
                Case 4, 15, 21
                    TabReport(K, j - 1) = Format(TabSource(i, j), "[H]hh:mm")
                Case 7, 8, 19, 20
                    TabReport(K, j - 1) = Format(TabSource(i, j), "[mm]:ss")
                Case Else
                    TabReport(K, j - 1) = TabSource(i, j)
            End Select

Pour l'insant oui.

Ce soir j'ai la flemme. J'éssaie de voir ça demain dans la journée pour faire une macro à mettre dans ton classeur de macros personnelles.

Cordialement
Pas de problème on voit ça demain pour le format je n'y arrive pas. Dans ta mise en forme par exemple apparait en F2 12:02 alors qu'il devrait y avoir en F2 07:02 (7 minutes 02)
pour les heures cela fonctionne parfaitement.
Mais sans pb pour le format et la macro on voit demain quand tu auras le temps.
en attendant très belle soirée à toi
cordialement
 

Efgé

XLDnaute Barbatruc
Bonjour @Lolo le normand , le fil, le forum
Une version à mettre dans ton PERSONAL.SLBS.
Après implémentation, tu n'auras qu'a ouvrir le fichier à traiter et Alt+F8 pour mettre en forme.
J'ai été obligé de mettre une verrue pour retrouver le format mm:ss des colonnes F, G etc... tes données me posent soucis.
Si tu ne sais pas comment créer ton classeur de macros personnelles revient et je te guiderai pas à pas.
VB:
Sub MiseEnForme()
Dim LstRow&, i&, j&, K&
Dim TabSource As Variant, TabReport As Variant, Tmp As Variant
Dim Discrit$

Discrit = "CNMR"

With ActiveSheet
    LstRow = .Cells(.Rows.Count, 1).End(xlUp).Row
    TabSource = .Range(.Cells(1, 1), .Cells(LstRow, 21))
    K = Application.CountIf(.Columns("c"), "Total") + 1
End With
ReDim TabReport(1 To K, 1 To 21)
K = 1
TabReport(1, 1) = TabSource(1, 1)
For i = 3 To UBound(TabSource, 2)
    TabReport(1, i - 1) = TabSource(1, i)
Next i
For i = LBound(TabSource, 1) + 1 To UBound(TabSource, 1)
    If TabSource(i, 3) = "Total" Then
        K = K + 1
        Tmp = Split(TabSource(i, 1), "_")
        Select Case Tmp(LBound(Tmp))
            Case Discrit
                TabReport(K, 1) = Tmp(LBound(Tmp))
            Case Else
                TabReport(K, 1) = Tmp(UBound(Tmp))
        End Select
        For j = 3 To UBound(TabSource, 2)
            Select Case j
                Case 4, 15, 21
                    TabReport(K, j - 1) = Format(TabSource(i, j), "[H]hh:mm")
                Case 7, 8, 19, 20
                    Tmp = Split(TabSource(i, j), ":")
                    TabReport(K, j - 1) = Tmp(1) & ":" & Tmp(2)
                Case Else
                    TabReport(K, j - 1) = TabSource(i, j)
            End Select
        Next j
    End If
Next i

With Sheets.Add(after:=Sheets(Sheets.Count))
    .Name = "MiseEnForme_" & Sheets.Count - 1
    .Cells(1, 1).Resize(UBound(TabReport, 1), UBound(TabReport, 2)).Value = TabReport
    .Columns.AutoFit
End With

End Sub
Cordialement
 

Lolo le normand

XLDnaute Nouveau
Bonjour @Lolo le normand , le fil, le forum
Une version à mettre dans ton PERSONAL.SLBS.
Après implémentation, tu n'auras qu'a ouvrir le fichier à traiter et Alt+F8 pour mettre en forme.
J'ai été obligé de mettre une verrue pour retrouver le format mm:ss des colonnes F, G etc... tes données me posent soucis.
Si tu ne sais pas comment créer ton classeur de macros personnelles revient et je te guiderai pas à pas.
VB:
Sub MiseEnForme()
Dim LstRow&, i&, j&, K&
Dim TabSource As Variant, TabReport As Variant, Tmp As Variant
Dim Discrit$

Discrit = "CNMR"

With ActiveSheet
    LstRow = .Cells(.Rows.Count, 1).End(xlUp).Row
    TabSource = .Range(.Cells(1, 1), .Cells(LstRow, 21))
    K = Application.CountIf(.Columns("c"), "Total") + 1
End With
ReDim TabReport(1 To K, 1 To 21)
K = 1
TabReport(1, 1) = TabSource(1, 1)
For i = 3 To UBound(TabSource, 2)
    TabReport(1, i - 1) = TabSource(1, i)
Next i
For i = LBound(TabSource, 1) + 1 To UBound(TabSource, 1)
    If TabSource(i, 3) = "Total" Then
        K = K + 1
        Tmp = Split(TabSource(i, 1), "_")
        Select Case Tmp(LBound(Tmp))
            Case Discrit
                TabReport(K, 1) = Tmp(LBound(Tmp))
            Case Else
                TabReport(K, 1) = Tmp(UBound(Tmp))
        End Select
        For j = 3 To UBound(TabSource, 2)
            Select Case j
                Case 4, 15, 21
                    TabReport(K, j - 1) = Format(TabSource(i, j), "[H]hh:mm")
                Case 7, 8, 19, 20
                    Tmp = Split(TabSource(i, j), ":")
                    TabReport(K, j - 1) = Tmp(1) & ":" & Tmp(2)
                Case Else
                    TabReport(K, j - 1) = TabSource(i, j)
            End Select
        Next j
    End If
Next i

With Sheets.Add(after:=Sheets(Sheets.Count))
    .Name = "MiseEnForme_" & Sheets.Count - 1
    .Cells(1, 1).Resize(UBound(TabReport, 1), UBound(TabReport, 2)).Value = TabReport
    .Columns.AutoFit
End With

End Sub
Cordialement
1666784544570.png

Bonjour Efgé,
le format n'est toujours pas bon car dans les calculs ils considère que c'est des HH:mm et non des MM:ss
Quand je le fais à la main j'ajoute une colonne et j'utilise une formule = convert(la cellule;"hh";"hh") ça me transforme les heures en décimal et quand j'applique un format personnalisé [mm]:ss cela fonctionne.
Tu as une idée?

Merci d'avance
 

vgendron

XLDnaute Barbatruc
Hello
je ne fais que passer par la,
une propostion par Power Query
clic droit sur le tableau de la feuille 2: actualiser si des données ont changé dans le premier tableau de la feuill1
 

Pièces jointes

  • test téléphone.xlsx
    25.3 KB · Affichages: 1

Lolo le normand

XLDnaute Nouveau
Re
Pour le format j'ai été au bout de ce que je connais.
Comme dit précédemment tes données me posent soucis.
Si tu as pu implémenter le dernier code, je pense avoir été au bout du sujet.

Cordialement
si_ ça peut aider quelqu'un à trouver, ton code marche parfaitement pour la première colonne de temps comme vu si dessous:
1666789315258.png

1666789573001.png

Et il ne fonctionne plus pour la deuxième
En tous les cas merci beaucoup Efgé pour ton aide
Bien à toi
 

Gégé-45550

XLDnaute Accro
Bonjour à tous
Je répercute un message privé reçu de @Lolo le normand


Cette question, en plus d'être incompréhensible, devrait être posée dans le fil de discution.

Dans l'attente de précisons sur le pourquoi du comment...
Cordialement
Bonsoir @Efgé, Lolo le normand, le fil,
Je reviens dans cette discussion pour la dernière fois (alors que j'avais décidé d'en sortir, mais bon, il n'y a que les imbéciles qui ne changent pas d'avis, d'ailleurs c'est ce que j'ai toujours dit ;)).
Si j'ai bien compris, le fichier source de Lolo le normand contient en LBP_R6 les données source et en Feuil1 le résultat attendu.
J'ai donc appliqué sur la LBP_R6 l'excellente macro de @Efgé, la première fois en totalité (c'est l'onglet MiseEnForme_2), et la deuxième fois en neutralisant la fonction de formatage des heures (c'est l'onglet MiseEnForme_3).
Je constate que ce dernier onglet correspond exactement à la Feuil1 (résultats attendus ?), y compris les formats.
Du coup, j'ai la désagréable impression que ce fil commence à tourner en rond.
Ci-joint, le fichier tel que je l'ai enregistré après le dernier traitement.
Encore bravo, @Efgé.
Bonne soirée.
 

Pièces jointes

  • Copie de 17___Suivi_des_activites_par_agent_Rapport_1_1_1 (00B).xlsm
    237.3 KB · Affichages: 3

Lolo le normand

XLDnaute Nouveau
Bonjour à tous
Je répercute un message privé reçu de @Lolo le normand


Cette question, en plus d'être incompréhensible, devrait être posée dans le fil de discution.

Dans l'attente de précisons sur le pourquoi du comment...
Cordialement
Bonjour Efgé,
je suis désolé si j'ai commis un impair ce n'était pas le but.
Je t'ai écrit en privé car ton code est parfait c'est juste le format du fichier que je reçois qui est bizarre.
Et comme le format est bizarre je souhaitais juste garder dans ton code la partie de mise en forme suppression des colonnes, supprimer les lignes pour ne garder que les totaux, etc.
Et comme je débute en VBA je ne voyais pas comment faire.
Encore une fois désolé de ne pas avoir opérer de la bonne façon.
Bien cordialement
 

Lolo le normand

XLDnaute Nouveau
Bonsoir @Efgé, Lolo le normand, le fil,
Je reviens dans cette discussion pour la dernière fois (alors que j'avais décidé d'en sortir, mais bon, il n'y a que les imbéciles qui ne changent pas d'avis, d'ailleurs c'est ce que j'ai toujours dit ;)).
Si j'ai bien compris, le fichier source de Lolo le normand contient en LBP_R6 les données source et en Feuil1 le résultat attendu.
J'ai donc appliqué sur la LBP_R6 l'excellente macro de @Efgé, la première fois en totalité (c'est l'onglet MiseEnForme_2), et la deuxième fois en neutralisant la fonction de formatage des heures (c'est l'onglet MiseEnForme_3).
Je constate que ce dernier onglet correspond exactement à la Feuil1 (résultats attendus ?), y compris les formats.
Du coup, j'ai la désagréable impression que ce fil commence à tourner en rond.
Ci-joint, le fichier tel que je l'ai enregistré après le dernier traitement.
Encore bravo, @Efgé.
Bonne soirée.
Bonjour Gégé
Oui je suis d'accord bravo à Efgé
Ensuite effectivement la mise en forme 3 correspond ^parfaitement à ce que je veux faire.
Mais j'ai encore besoin d'une petite aide si possible, je débute en vba et je ne vois pas quel code je dois écrire dans mes macros perso pour garder le mise en forme 3?
Merci d'avance à toi
Et merci à tous pour votre site tellement utile pour des débutant en VBA
Bien à toi
 

Gégé-45550

XLDnaute Accro
Bonjour Gégé
Oui je suis d'accord bravo à Efgé
Ensuite effectivement la mise en forme 3 correspond ^parfaitement à ce que je veux faire.
Mais j'ai encore besoin d'une petite aide si possible, je débute en vba et je ne vois pas quel code je dois écrire dans mes macros perso pour garder le mise en forme 3?
Merci d'avance à toi
Et merci à tous pour votre site tellement utile pour des débutant en VBA
Bien à toi
Bonjour,
il faut garder le code tel que je l'ai envoyé dans le post #25, où les formats ont été neutralisés.
Cordialement,
 

Discussions similaires

Réponses
12
Affichages
304

Statistiques des forums

Discussions
312 196
Messages
2 086 101
Membres
103 116
dernier inscrit
kutobi87