Copie plage de données avec modifications et récurrence

Bonjour,

Voici mon problème :

Je souhaiterai, grâce à une macro Excel, créer une feuille de données rassemblant toutes les informations qui m'intéressent, ces dernières étant présentes dans d'autres feuilles de données. Au total, je compte une trentaine de feuilles qui ont toutes la même structure, mais décelles parfois quelques incohérences.

Voici-ci joint un exemple de l'une de mes feuilles de données. Je souhaiterai dans ma nouvelle feuille obtenir les informations suivantes :

  • la date du jour dans la première colonne
  • Matin / Après-midi dans la seconde
  • Descriptif dans la troisième colonne en ne gardant que "A1", "A2", "A3", etc.
  • les 4 variables et leurs données dans les colonnes suivantes

De ce fait, je voudrais faire la somme des données, pour chaque variable en fonction du moment de la journée (AM / PM), afin de n'obtenir qu'une donnée finale pour chaque variable, et ce pour chaque jour de la semaine.

Par la suite, je souhaiterai répéter ce schéma sur chaque feuille (Une feuille = 1 semaine) dans un ordre chronologique.

Après quelques tests, rien n'a été concluant de mon côté.

J'avais pensé, pour la colonne Descriptif, créer un cycle VBA permettant de répérer les mots en gras et certains mots. Je suhaiterai garder que les "A1", "A2", etc. et aisni délaisser les "bla-bla" (1 jour = AM + PM = 1 Decriptif finale par demi-journée). Les descriptifs sont dans 99% des cas en gras, les blabla toujours en police basique. De plus, certains mots présents dans les "A1", "A2", etc sont similaire 95% du temps, ce qui pourrait permettre un repérage plus simple et un ajustement final mineur. (En effet, tous les descriptifs majeurs ("A1" par exemple", ne sont pas positionnés en première ligne du tableur jour..). Je ne sais pas si cela est pertinent ou non.

Merci de votre aide!

Cordialement,

GoodtimeB

GoodtimeB,

Peux-tu apporter quelques précisions :

  • Pour mettre en forme les dates, il manque l'année sur la feuille, peux-tu la rajouter?
  • Est-il possible de fusionner les cellules AM/PM i.e. fusionner D3:D6, D7:D10, D12:D15, D16:D19...?
  • Le nombre de lignes de "blabla" comme tu dis, comporte-t-il toujours le même nombre de lignes (4 sur ton exemple) ?

Bonjour,

Merci de votre réponse!

L'année est 2017, mais elle n'est pas présente sur lefichier d'origine.

En ce qu i concerne AM/PM, elles ne sont pasnon plus fusionnées sur le document d'origine (ce dernier ne pouvant pas être modifié..)

Pour les lignes "bla-bla", le nombre de ligne dédiées sont toujours le même (même sipastoujours toutes remplies), en effet !

Cordialement,

GoodtimeB

Bonsoir GoodtimeB,

Je joins une proposition avec un essai de résolution des problèmes :

  • Ajoût d'une feuille "Recap" pour récupérer les lignes AM/PM présentes dans toutes les autres feuilles .
  • Ajoût de cellules nommées :
o "Annee_Courante" pour une cellule de "Recap contenant l'année de traitement

o "Mois" pour le mois présent dans les feuilles de données (janvier dans mon classeur)

o "FirstRow_Summary" pour la 1ère ligne à remplir dans la feuille "Recap"

- Création de la procédure VBA "populateSummary_MainProcess" dans le module1 pour réaliser le remplissage de la feuille "RECAP" .

Voilà, je pense ne rien oublier...

Bonjour monsieur,

Merci beaucoup de votre aide.

Nous souhaitons moduler la macro (enlever la partie "total journée", notamment). Malheureusement, nous avons peine à comprendre le fonctionnement de cette macro (étant novice en VBA excel). Est-il possible d'avoir plus de renseignements/inidcations/aides sur le fonctionnement de celle-ci?

Nous tentons actuellement de l'appliquer à une réelle base de données, et un blocage apparait dès "iYear = This Workbook....". Cette partie de 4 lignes de code est déjà dur à comprendre pour nous, pour vous expliquer notre niveau..

Merci de votre compréhension,

Cordialement

GoodtimeB

Bonjour GoodtimeB

En fait, le blocage décrit est dû certainement au fait que les actions rappelées ci-dessous n'ont pas toutes été réalisées avant l'exécution de la macro :

- Ajoût d'une feuille "Recap" pour récupérer les lignes AM/PM présentes dans toutes les autres feuilles .

- Ajoût de cellules nommées :

o "Annee_Courante" pour une cellule de "Recap contenant l'année de traitement

o "Mois" pour le mois présent dans les feuilles de données (janvier dans mon classeur)

o "FirstRow_Summary" pour la 1ère ligne à remplir dans la feuille "Recap"

Peux-être, as-tu besoin d'aide pour savoir comment on nomme une cellule dans EXCEL?

Sinon, j'ai ajouté quelques nouvelles lignes de commentaires dans le code de la macro :

Option Explicit
Const cSummarySheet = "RECAP"
Const cColDateSum = 1
Const cColAM_PMSum = 2
Const cColDescSum = 3
Const cColV1Sum = 4
Const cColV2Sum = 5
Const cColV3Sum = 6
Const cColV4Sum = 7
Const cColTotalSum = 8

Const cColDate = 2
Const cColDesc = 5
Const cColV1 = 7
Const cColV2 = 8
Const cColV3 = 9
Const cColV4 = 10
Sub populateSummary_MainProcess()
    Dim oSheet As Excel.Worksheet
    Dim oSheetSummary As Excel.Worksheet
    Dim oCellDate As Excel.Range
    Dim oCell As Excel.Range
    Dim lRowSummary As Long
    Dim dDate As Date
    Dim sDate As String
    Dim sMois As String, iYear As Integer, i As Integer, j As Integer
    Dim lV(3) As Long, lTotalJour As Long
    Dim sAdresseMois As String

    Set oSheetSummary = ThisWorkbook.Worksheets(cSummarySheet)
    'Récupération de l'année courante dans la cellule nommée "Année_Courante"
    iYear = ThisWorkbook.Names("Annee_Courante").RefersToRange.Value
    'Récupération de l'année courante dans la cellule nommée "Année_Courante"
    lRowSummary = ThisWorkbook.Names("FirstRow_Summary").RefersToRange.Row - 1
    sAdresseMois = ThisWorkbook.Names("Mois").RefersToRange.AddressLocal

    'Boucle sur les différentes feuilles
    For Each oSheet In ThisWorkbook.Worksheets
        If oSheet.Name <> cSummarySheet Then
            sMois = oSheet.Range(sAdresseMois).Value
            'Recherche de cellules contenant la date du jour
            For Each oCell In oSheet.UsedRange.Columns(cColDate).Cells
                'Si la cellule contient une date
                If IsDate(oCell.Value) And oCell.Column = cColDate Then
                    'Confection de la date en prenant le jour, le mois et l'année
                    Set oCellDate = oCell
                    oCell.Value = oCell.Value + 1
                    sDate = CStr(Day(oCellDate.Value)) & " " & sMois & " " & CStr(iYear)
                    dDate = CDate(sDate)
                    'Ajout d'une nouvelle ligne dans la feuille RECAP
                    lRowSummary = lRowSummary + 1
                    oSheetSummary.Cells(lRowSummary, cColDateSum).Value = dDate
                    oSheetSummary.Cells(lRowSummary, cColAM_PMSum).Value = "AM"
                    'Remise à zero des compteurs
                    For j = 0 To 3
                        lV(j) = 0
                    Next
                    'Parcours des valeurs AM et totalisation dans lV()
                    For i = -3 To 0
                        If oCellDate.Offset(i, cColDesc - cColDate).Font.Bold And Len(oCellDate.Offset(i, cColDesc - cColDate).Value & "") > 0 Then
                            oSheetSummary.Cells(lRowSummary, cColDescSum).Value = oCellDate.Offset(i, cColDesc - cColDate).Value
                        End If
                        j = 0
                        For j = 0 To 3
                            If IsNumeric(oCellDate.Offset(i, cColV1 - cColDate + j).Value) Then
                                lV(j) = lV(j) + oCellDate.Offset(i, cColV1 - cColDate + j).Value
                            End If
                        Next
                    Next
                    'Initialisation de la totalisation jour et recopie des valeurs dans RECAP
                    lTotalJour = 0
                    For j = 0 To 3
                        lTotalJour = lTotalJour + lV(j)
                        oSheetSummary.Cells(lRowSummary, cColV1Sum + j) = lV(j)
                    Next

                    'Parcours des valeurs PM et totalisation dans lV()
                    'et ajout d'une nouvelle ligne dans la feuille RECAP
                    lRowSummary = lRowSummary + 1
                    oSheetSummary.Cells(lRowSummary, cColAM_PMSum).Value = "PM"
                    'Remise à zero des compteurs
                    For j = 0 To 3
                        lV(j) = 0
                    Next
                    For i = 1 To 4
                        If oCellDate.Offset(i, cColDesc - cColDate).Font.Bold And Len(oCellDate.Offset(i, cColDesc - cColDate).Value & "") > 0 Then
                            oSheetSummary.Cells(lRowSummary, cColDescSum).Value = oCellDate.Offset(i, cColDesc - cColDate).Value
                        End If
                        For j = 0 To 3
                            If IsNumeric(oCellDate.Offset(i, cColV1 - cColDate + j).Value) Then
                                lV(j) = lV(j) + oCellDate.Offset(i, cColV1 - cColDate + j).Value
                            End If
                        Next
                    Next
                    'totalisation jour et recopie des valeurs PM
                    For j = 0 To 3
                        lTotalJour = lTotalJour + lV(j)
                        oSheetSummary.Cells(lRowSummary, cColV1Sum + j) = lV(j)
                    Next
                    'Recopie de la totalisation jour dans la feuille RECAP
                    'oSheetSummary.Cells(lRowSummary, cColTotalSum).Value = lTotalJour
                    'oSheetSummary.Cells(lRowSummary, cColTotalSum).Font.Bold = True
                End If
            Next
        End If
    Next
End Sub

Comme désiré, j'ai supprimé la totalisation jour en mettant en commentaire les 2 lignes sous le titre 'Recopie de la totalisation jour dans la feuille RECAP (cf le code)

J'espère qu'ainsi, les choses se sont éclaircis pour toi.

Bye

Rechercher des sujets similaires à "copie plage donnees modifications recurrence"