Implémenter des techniques avancées de transformation de données, Excel VBA
Voici une explication détaillée et un exemple de code VBA pour implémenter des techniques avancées de transformation de données dans Excel. Nous allons vous guider à travers des techniques courantes telles que le pivotement des données, le dé-pivotement des données, le nettoyage des données et l’application de filtres complexes.
Techniques avancées de transformation de données avec Excel VBA
Scénario
Imaginons que vous ayez un ensemble de données avec plusieurs colonnes, et que vous souhaitiez le transformer dans un format plus utile. Par exemple, vous pourriez avoir besoin de :
1. Pivoter une table de données (transformer des lignes en colonnes).
2. Dé-pivoter des données (transformer des colonnes en lignes).
3. Nettoyer des données en supprimant des caractères indésirables ou en traitant des valeurs manquantes.
4. Appliquer des filtres complexes ou transformer les données en fonction de critères spécifiques.
Je vais détailler ces techniques et fournir un exemple de code VBA pour chaque cas.
1. Pivoter des données (Transformer des lignes en colonnes)
Problème : Vous avez une liste de données de ventes pour plusieurs commerciaux sur plusieurs mois, mais les données sont en lignes et vous voulez les transformer pour que chaque mois devienne une colonne.
Exemple de données :
| Commercial | Mois | Montant des ventes |
| Alice | Janv | 200 |
| Alice | Févr | 250 |
| Bob | Janv | 300 |
| Bob | Févr | 400 |
Sortie souhaitée :
| Commercial | Janv | Févr |
| Alice | 200 | 250 |
| Bob | 300 | 400 |
Code VBA pour pivoter les données :
Sub PivotData()
Dim ws As Worksheet
Dim lastRow As Long, lastCol As Long
Dim dataRange As Range
Dim pivotTable As PivotTable
Dim pivotCache As PivotCache
' Référence de la feuille et de la plage de données
Set ws = ThisWorkbook.Sheets("Feuil1")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
Set dataRange = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol))
' Créer un cache de pivot
Set pivotCache = ThisWorkbook.PivotTableWizard(dataRange)
' Créer la table pivot sur une nouvelle feuille
Set wsPivot = ThisWorkbook.Sheets.Add
Set pivotTable = wsPivot.PivotTableWizard(pivotCache, _
ws.Cells(1, 1), _
ws.Cells(1, 2), _
ws.Cells(1, 3))
' Organiser les champs de la table pivot
pivotTable.PivotFields("Commercial").Orientation = xlRowField
pivotTable.PivotFields("Mois").Orientation = xlColumnField
pivotTable.PivotFields("Montant des ventes").Orientation = xlDataField
pivotTable.PivotFields("Montant des ventes").Function = xlSum
End Sub
Explication :
1. Nous définissons la plage de données contenant l’ensemble de données.
2. Créez un cache de pivot et utilisez la méthode PivotTableWizard pour créer une nouvelle table pivot dans une feuille séparée.
3. Définissez l’orientation des champs pour les lignes (Commercial), les colonnes (Mois) et les données (Montant des ventes) pour afficher la somme des ventes.
2. Dé-pivoter des données (Transformer des colonnes en lignes)
Problème : Vous avez un jeu de données large et vous souhaitez le transformer en un format plus long (dé-pivoter les données).
Exemple de données :
| Commercial | Janv | Févr |
| Alice | 200 | 250 |
| Bob | 300 | 400 |
Sortie souhaitée :
| Commercial | Mois | Montant des ventes |
| Alice | Janv | 200 |
| Alice | Févr | 250 |
| Bob | Janv | 300 |
| Bob | Févr | 400 |
Code VBA pour dé-pivoter les données :
Sub UnpivotData()
Dim ws As Worksheet
Dim lastRow As Long, lastCol As Long
Dim i As Long, j As Long
Dim targetRow As Long
Dim monthName As String
Dim salesAmount As Double
' Référence de la feuille
Set ws = ThisWorkbook.Sheets("Feuil1")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
' Commencer à remplir les données dé-pivotées en dessous des données existantes
targetRow = lastRow + 2
' Écrire les en-têtes pour les données dé-pivotées
ws.Cells(targetRow, 1).Value = "Commercial"
ws.Cells(targetRow, 2).Value = "Mois"
ws.Cells(targetRow, 3).Value = "Montant des ventes"
targetRow = targetRow + 1
' Boucle à travers les données pour dé-pivoter
For i = 2 To lastRow
For j = 2 To lastCol
monthName = ws.Cells(1, j).Value
salesAmount = ws.Cells(i, j).Value
ws.Cells(targetRow, 1).Value = ws.Cells(i, 1).Value ' Commercial
ws.Cells(targetRow, 2).Value = monthName ' Mois
ws.Cells(targetRow, 3).Value = salesAmount ' Montant des ventes
targetRow = targetRow + 1
Next j
Next i
End Sub
Explication :
1. Nous parcourons chaque ligne et colonne de l’ensemble de données original.
2. Pour chaque combinaison de Commercial et Mois, nous créons une nouvelle ligne dans le tableau de sortie avec le mois et le montant des ventes correspondants.
3. Les données sont maintenant dans un format long, ce qui est souvent plus adapté pour l’analyse ou d’autres transformations.
3. Nettoyage des données (Suppression de caractères indésirables)
Problème : Votre ensemble de données contient des espaces ou des caractères spéciaux indésirables, et vous souhaitez les nettoyer.
Exemple de données :
| Nom | Âge | Adresse |
| John Doe | 30 | 123 Main St. |
| Alice@! | 25 | 456 Elm St.#$ |
Code VBA pour nettoyer les données :
Sub CleanData()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim cell As Range
' Référence de la feuille
Set ws = ThisWorkbook.Sheets("Feuil1")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' Boucle à travers chaque ligne pour nettoyer les données
For i = 2 To lastRow
' Nettoyer le Nom - supprimer les caractères spéciaux et les espaces superflus
Set cell = ws.Cells(i, 1)
cell.Value = Trim(Replace(cell.Value, "@", ""))
cell.Value = Trim(Replace(cell.Value, "!", ""))
' Nettoyer l'Adresse - supprimer les caractères spéciaux
Set cell = ws.Cells(i, 3)
cell.Value = Trim(Replace(cell.Value, "#", ""))
Next i
End Sub
Explication :
1. Nous parcourons les lignes et nettoyons les caractères indésirables (comme @, !, #, etc.) et les espaces supplémentaires dans les colonnes Nom et Adresse.
2. La fonction Trim() supprime les espaces en début et en fin de chaîne, et la fonction Replace() est utilisée pour remplacer les caractères indésirables.
4. Filtres complexes (Application de plusieurs critères)
Problème : Vous devez filtrer un ensemble de données en fonction de plusieurs critères (par exemple, des ventes supérieures à une certaine valeur et provenant d’une région spécifique).
Exemple de données :
| Commercial | Région | Montant des ventes |
| Alice | Nord | 200 |
| Bob | Sud | 300 |
| Alice | Sud | 150 |
| John | Nord | 500 |
Code VBA pour appliquer des filtres complexes :
Sub FilterData()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim salesAmount As Double
Dim region As String
' Référence de la feuille
Set ws = ThisWorkbook.Sheets("Feuil1")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' Boucle à travers chaque ligne pour appliquer les critères de filtre
For i = 2 To lastRow
salesAmount = ws.Cells(i, 3).Value
region = ws.Cells(i, 2).Value
' Conserver uniquement les lignes où le Montant des ventes > 200 et la Région = "Nord"
If salesAmount > 200 And region = "Nord" Then
ws.Rows(i).Hidden = False
Else
ws.Rows(i).Hidden = True
End If
Next i
End Sub
Explication :
1. Nous parcourons l’ensemble des données et appliquons un filtre où le Montant des ventes est supérieur à 200, et la Région est « Nord ».
2. Les lignes qui ne respectent pas ces critères sont masquées.
Conclusion
Voici quelques-unes des techniques avancées de transformation de données que vous pouvez implémenter avec VBA dans Excel. Ces méthodes vous permettent de pivoter et dé-pivoter vos données, de les nettoyer et d’appliquer des filtres complexes pour rendre votre ensemble de données plus utile pour l’analyse. Grâce à VBA, vous pouvez automatiser ces tâches, économisant ainsi du temps et garantissant la cohérence de vos transformations.