Faire un group by sur deux colonnes en VBA et un calcul
Huguo90
Messages postés
63
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous,
J'ai un tableau ainsi, je souhaite faire comme un group by avec deux calculs dessus comme ça:

Je vous ai mis l'image.
Mes données sont Num et résults et j'aimerais faire un petit tableau comme ça c'est bcp plus de données mais ici c'est un exemple que j'ai simplifié.
Merci d'avance,
Huguo
J'ai un tableau ainsi, je souhaite faire comme un group by avec deux calculs dessus comme ça:
Je vous ai mis l'image.
Mes données sont Num et résults et j'aimerais faire un petit tableau comme ça c'est bcp plus de données mais ici c'est un exemple que j'ai simplifié.
Merci d'avance,
Huguo
A voir également:
- Excel vba group by
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Déplacer colonne excel - Guide
- Si ou excel - Guide
- Excel compter cellule couleur sans vba - Guide
2 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour,
utilises-tu Excel?
quelle signification donnes-tu à "group by" dans ce contexte?
qu'as-tu essayé en VBA?
as-tu essayé d'utiliser des formules pour faire cela? ou un TCD?
utilises-tu Excel?
quelle signification donnes-tu à "group by" dans ce contexte?
qu'as-tu essayé en VBA?
as-tu essayé d'utiliser des formules pour faire cela? ou un TCD?
J'ai envie de faire exactement comme dans ma question
Option Explicit
Dim oWbk As Workbook
Sub GenereTCD()
Dim oSheet As Workbook
Dim i As Integer
Dim J As Integer
'suppression des feuille Existantes
Set oWbk = ThisWorkbook
Application.DisplayAlerts = False
For i = oWbk.Sheets.Count To 2 Step -1
oWbk.Sheets(i).Delete
Next
Application.DisplayAlerts = True
'Ajouter les nouvelles feuilles
For i = oWbk.Sheets.Count + i To 3
oWbk.Sheets.Add After:=oWbk.Sheets(oWbk.Sheets.Count)
Next
oWbk.Sheets(2).Name = "Données Traitées"
'Tableau croisé dynamique Données traitées
Creation_TCD "TCD", "Num", "Result", ""
oWbk.Sheets("Données Traitées").Activate
Application.ScreenUpdating = True
End Sub
Private Sub Creation_TCD(sTCDName As String, sheetName As String, _
sField1 As String, sField2 As String)
Dim Ilig As Integer
Dim oSheet As Worksheet
Dim oCache As PivotCache
'création du tableau croiser dynamique
Ilig = 2
oWbk.Activate
Set oSheet = oWbk.Sheets("Base de données")
'creation du Cache du tableau
Set oCache = oWbk.PivotCaches.Create(SourceType:=xlDatabase, _
SourceData:="Tableau_base", Version:=xlPivotTableVersion15)
'Création du Tableau
oCache.CreatePivotTable _
TableDestination:=oWbk.Sheets(sheetName).Cells(Ilig, 2), _
TableName:=sTCDName
Set oSheet = oWbk.Sheets(sheetName)
'Ligne du TCD
With oSheet.PivotTables(sTCDName).PivotFields(sField1)
.Orientation = xlRowField
.Position = 1
End With
If sField2 <> "" Then
With oSheet.PivotTables(sTCDName).PivotFields(sField2)
.Orientation = xlRowField
.Position = 2
End With
End If
oSheet.PivotTables(sTCDName).CompactLayoutRowHeader = UCase(sField1)
'Supprime les lignes Vide
oSheet.PivotTables(sTCDName).PivotFields(sField1) _
.PivotFilters.Add Type:=16, Value1:="(Vide)"
'En nombre et Pourcentage
oSheet.PivotTables(sTCDName).AddDataField _
oSheet.PivotTables(sTCDName).PivotFields("Nom"), "NOMBRE", xlCount
oSheet.PivotTables(sTCDName).AddDataField _
oSheet.PivotTables(sTCDName).PivotFields("Nom"), "POURCENTAGE", xlCount
With oSheet.PivotTables(sTCDName).PivotFields("Pourcentage")
.Calculation = xlPercentOfTotal
.Numerformat = "0.00%"
End With
End Sub
Option Explicit
Dim oWbk As Workbook
Sub GenereTCD()
Dim oSheet As Workbook
Dim i As Integer
Dim J As Integer
'suppression des feuille Existantes
Set oWbk = ThisWorkbook
Application.DisplayAlerts = False
For i = oWbk.Sheets.Count To 2 Step -1
oWbk.Sheets(i).Delete
Next
Application.DisplayAlerts = True
'Ajouter les nouvelles feuilles
For i = oWbk.Sheets.Count + i To 3
oWbk.Sheets.Add After:=oWbk.Sheets(oWbk.Sheets.Count)
Next
oWbk.Sheets(2).Name = "Données Traitées"
'Tableau croisé dynamique Données traitées
Creation_TCD "TCD", "Num", "Result", ""
oWbk.Sheets("Données Traitées").Activate
Application.ScreenUpdating = True
End Sub
Private Sub Creation_TCD(sTCDName As String, sheetName As String, _
sField1 As String, sField2 As String)
Dim Ilig As Integer
Dim oSheet As Worksheet
Dim oCache As PivotCache
'création du tableau croiser dynamique
Ilig = 2
oWbk.Activate
Set oSheet = oWbk.Sheets("Base de données")
'creation du Cache du tableau
Set oCache = oWbk.PivotCaches.Create(SourceType:=xlDatabase, _
SourceData:="Tableau_base", Version:=xlPivotTableVersion15)
'Création du Tableau
oCache.CreatePivotTable _
TableDestination:=oWbk.Sheets(sheetName).Cells(Ilig, 2), _
TableName:=sTCDName
Set oSheet = oWbk.Sheets(sheetName)
'Ligne du TCD
With oSheet.PivotTables(sTCDName).PivotFields(sField1)
.Orientation = xlRowField
.Position = 1
End With
If sField2 <> "" Then
With oSheet.PivotTables(sTCDName).PivotFields(sField2)
.Orientation = xlRowField
.Position = 2
End With
End If
oSheet.PivotTables(sTCDName).CompactLayoutRowHeader = UCase(sField1)
'Supprime les lignes Vide
oSheet.PivotTables(sTCDName).PivotFields(sField1) _
.PivotFilters.Add Type:=16, Value1:="(Vide)"
'En nombre et Pourcentage
oSheet.PivotTables(sTCDName).AddDataField _
oSheet.PivotTables(sTCDName).PivotFields("Nom"), "NOMBRE", xlCount
oSheet.PivotTables(sTCDName).AddDataField _
oSheet.PivotTables(sTCDName).PivotFields("Nom"), "POURCENTAGE", xlCount
With oSheet.PivotTables(sTCDName).PivotFields("Pourcentage")
.Calculation = xlPercentOfTotal
.Numerformat = "0.00%"
End With
End Sub
merci d'utiliser les balises de code quand tu partages du code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
ton code fonctionne bien?
ton code fonctionne bien?