Problème TCD VBA
Bonjour le Forum,
Je vous explique mon problème : j'ai un code pour récuperer et ranger correctement un fichier csv. Une fois que le csv est trié je réalise plusieurs opérations dont une qui est la création d'un tableau croisé dynamique, et c'est ici que ça coince. Mon code a toujours fonctioné jusque ici, mais je dois traiter un csv qui est plus gros que d'habitude qui une fois trier me donne 71 000 lignes et 20 colonnes.... est ce que le problème est que la limite d'un TCD est atteinte ? Mon code erreur est "running time 13 type mismatch" et quand je debug ça m'indique que le problème apparait à la création du TCD. Quand je lance le pas à pas tout fonctionne bien jusqu'au tcd également. Je poste le code ou le problème apparait.
Merci de votre aide.
Bonjour,
Déclare tes variables Derligne et Derncol en Long au lieu de Integer.
Cdlt.
Merci jean-Eric pour ta réponse,
Malheureusement cela ne change rien excepté que je ne peux plus debug maintenant, mais en pas à pas le problème est toujours situé au même endroit.
cdt
Bonjour,
Merci de joindre un fichier, ou l'intégralité de ta procédure, en utilisant la balise de code.
Mais pas une image.
Cdlt.
'première conversion du CSV
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=True, Comma:=False, Space:=False, Other:=True, OtherChar:= _
"/", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), _
Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1) _
), TrailingMinusNumbers:=True
'insert des colonnes : exemple Plage(Cellules(ligne 1,col 4), Cellules (ligne 1,col 4 + 3 suivantes)ajout de ' colonne depuis la ligne 1 col 4
Range(Cells(1, 4), Cells(1, 4 + 3)).EntireColumn.Insert xlToRight
Range(Cells(1, 11), Cells(1, 11 + 4)).EntireColumn.Insert xlToRight
'second séparation des années et heures de début
Columns("C:C").Select
Selection.TextToColumns Destination:=Range("C1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=True, Other:=True, OtherChar:= _
":", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), _
TrailingMinusNumbers:=True
'reconstruction de la date de début
Range("g2").Select
ActiveCell.FormulaR1C1 = "=DATE(RC[-4],RC[-5],RC[-6])+TIME(RC[-3],RC[-2],RC[-1])"
Selection.NumberFormat = "d/m/yy h:mm:ss"
'Pour déterminer le nombre de ligne à copier
Dim DernLigne As Long
DernLigne = Range("F" & Rows.Count).End(xlUp).Row
Range("G2").AutoFill Destination:=Range("G2:G" & DernLigne)
'Troisième séparation des années et heures de FIN
Columns("J:J").Select
Selection.TextToColumns Destination:=Range("J1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=True, Other:=True, OtherChar:= _
":", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), _
TrailingMinusNumbers:=True
'reconstruction de la date de fin
Range("N2").Select
ActiveCell.FormulaR1C1 = "=DATE(RC[-4],RC[-5],RC[-6])+TIME(RC[-3],RC[-2],RC[-1])"
Selection.NumberFormat = "[$-409]d/m/yy h:mm:ss"
Range("N2").AutoFill Destination:=Range("N2:N" & DernLigne)
'calcul du temps de l'activité
Range("O2").Select
ActiveCell.FormulaR1C1 = "=sum(RC[-1]-RC[-8])"
Selection.NumberFormat = "[h]:mm:ss"
Range("O2").AutoFill Destination:=Range("O2:O" & DernLigne) 'désignation des colonnes
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'Jour début
Range("A1").Select
ActiveCell.FormulaR1C1 = "jour début"
'mois début
Range("B1").Select
ActiveCell.FormulaR1C1 = "mois début"
'année début
Range("C1").Select
ActiveCell.FormulaR1C1 = "année début"
'Heure de début
Range("D1").Select
ActiveCell.FormulaR1C1 = " heure début"
'minute de début
Range("E1").Select
ActiveCell.FormulaR1C1 = " minute début"
'second de début
Range("F1").Select
ActiveCell.FormulaR1C1 = " second début"
'Date complète de début
Range("G1").Select
ActiveCell.FormulaR1C1 = " date de début"
'Jour fin
Range("H1").Select
ActiveCell.FormulaR1C1 = "jour fin"
'mois fin
Range("I1").Select
ActiveCell.FormulaR1C1 = "mois fin"
'année fin
Range("J1").Select
ActiveCell.FormulaR1C1 = "année fin"
'Heure de fin
Range("K1").Select
ActiveCell.FormulaR1C1 = " heure fin"
'minute de fin
Range("L1").Select
ActiveCell.FormulaR1C1 = " minute fin"
'second de fin
Range("M1").Select
ActiveCell.FormulaR1C1 = " second fin"
'Date de FIN compléte
Range("N1").Select
ActiveCell.FormulaR1C1 = "date de fin"
'Temps
Range("O1").Select
ActiveCell.FormulaR1C1 = "TEMPS"
'Ligne
Range("P1").Select
ActiveCell.FormulaR1C1 = " Ligne"
'Catégorie
Range("Q1").Select
ActiveCell.FormulaR1C1 = " Catégorie"
'Famille
Range("R1").Select
ActiveCell.FormulaR1C1 = " Famille"
'type d'arrêts
Range("S1").Select
ActiveCell.FormulaR1C1 = " Type d'arrêts"
'arrêts
Range("T1").Select
ActiveCell.FormulaR1C1 = " Arrêts"
'Mise en forme ligne 1
Range("A1:T1").Select
With Selection.Interior
End With
'largueur colonne "date de début et fin et temps
Columns("A:T").Select
Columns("A:T").EntireColumn.AutoFit
Dim Derncol As Long
Derncol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column
Set maPlage = Range(Cells(1, 1), Cells(DernLigne, Derncol))
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'création du tableau dynamique croisé
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Sheets("exploitationdata").Select
Cells.Select
Selection.ClearContents
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
maPlage, Version:=xlPivotTableVersion12). _
CreatePivotTable TableDestination:="exploitationdata!R207C1", TableName:= _
"PivotTable4", DefaultVersion:=xlPivotTableVersion12
Sheets("exploitationdata").Select
Cells(207, 1).Select
With ActiveSheet.PivotTables("PivotTable4").PivotFields(" Famille")
.Orientation = xlRowField
.Position = 1
End With
With ActiveSheet.PivotTables("PivotTable4").PivotFields(" Type d'arrêts")
.Orientation = xlRowField
.Position = 2
End With
ActiveSheet.PivotTables("PivotTable4").AddDataField ActiveSheet.PivotTables( _
"PivotTable4").PivotFields("TEMPS"), "Count of TEMPS", xlCount
With ActiveSheet.PivotTables("PivotTable4").PivotFields("Count of TEMPS")
.Caption = "Sum of TEMPS"
.Function = xlSum
With ActiveSheet.PivotTables("PivotTable4").PivotFields(" Arrêts")
.Orientation = xlRowField
.Position = 3
End With
End With
Columns("B:B").Select
Range("B256").Activate
Selection.NumberFormat = "[h]:mm:ss"
ActiveWindow.SmallScroll Down:=66
'Sheets("exploitationdata").Name = "exploitationdata"RE,
Merci de joindre un fichier csv et un fichier excel pour le résultat escompté.
Cdlt.
Jean-Eric,
je ne peux pas fournir de csv ni le fichier excel car ils contiennent des données confidentielles, je regarde ce que je peux faire comme exemple...
Merci
Exemple avec même erreur ......
Désolé pour le message précédent le fichier est trop volumineux j'ai du split en deux fichier.
Merci de votre aide
RE,
Une première proposition à étudier, de ce que j'ai compris.
La procédure ci-dessous doit être enregistré dans ton classeur de macros personnelles (Personal.xlsb).
Tu ouvres ton fichier csv et tu lances la procédure Extraction.
Le résultat sera equivalent au classeur joint.
A te relire.
Cdlt.
Option Explicit
Public Sub Extraction()
Dim wb As Workbook
Dim wsCSV As Worksheet, wsPT As Worksheet
Dim lo As ListObject
Dim PTCache As PivotCache
Dim PT As PivotTable
Application.ScreenUpdating = False
Set wb = ActiveWorkbook
Set wsCSV = wb.Worksheets(1)
With wsCSV
.Rows("1:3").Delete Shift:=xlUp
.Columns("A:A").TextToColumns _
Destination:=Range("A1"), _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
Semicolon:=True, _
FieldInfo _
:=Array(Array(1, 4), Array(2, 4), Array(3, 1), Array(4, 1), Array(5, 1), _
Array(6, 1), Array(7, 1), Array(8, 1)), _
TrailingMinusNumbers:=True
Set lo = .ListObjects.Add(xlSrcRange, .Cells(1).CurrentRegion, , xlYes)
With lo
.Name = "tbl_Données"
.TableStyle = ""
.ListColumns.Add
.HeaderRowRange(.ListColumns.Count) = "TEMPS"
.HeaderRowRange.EntireColumn.AutoFit
With .ListColumns("TEMPS").DataBodyRange
.Cells(1, 1).FormulaR1C1 = "=[@EndTime]-[@StartTime]"
.NumberFormat = "[hh]:mm:ss"
End With
End With
End With
Application.DisplayAlerts = False
On Error Resume Next
wb.Worksheets("").Delete
On Error GoTo 0
Application.DisplayAlerts = True
Set wsPT = wb.Worksheets.Add
wsPT.Name = "exploitationdata"
Set PTCache = wb.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=lo.Range)
Set PT = PTCache.CreatePivotTable(TableDestination:=wsPT.Cells(3, 1), TableName:="TCD_1")
With PT
.ManualUpdate = True
.AddFields RowFields:=Array("EquipmentName", "TimeCategoryName", "State")
With .PivotFields("TEMPS")
.Orientation = xlDataField
.Position = 1
.Function = xlCount
.NumberFormat = "#,##0"
.Caption = "NB TEMPS"
End With
With .PivotFields("TEMPS")
.Orientation = xlDataField
.Position = 2
.Function = xlSum
.NumberFormat = "[hh]:mm:ss"
.Caption = ChrW(931) & " TEMPS"
End With
.RowAxisLayout xlTabularRow
.ManualUpdate = False
End With
Set PT = Nothing
Set PTCache = Nothing
Set lo = Nothing
Set wsCSV = Nothing: Set wsPT = Nothing
Set wb = Nothing
End SubBonjour,
Ou en es tu ?
Cdlt.
ococo700 a écrit :Bonjour le Forum,
Je vous explique mon problème : j'ai un code pour récuperer et ranger correctement un fichier csv. Une fois que le csv est trié je réalise plusieurs opérations dont une qui est la création d'un tableau croisé dynamique, et c'est ici que ça coince. Mon code a toujours fonctioné jusque ici, mais je dois traiter un csv qui est plus gros que d'habitude qui une fois trier me donne 71 000 lignes et 20 colonnes.... est ce que le problème est que la limite d'un TCD est atteinte ? Mon code erreur est "running time 13 type mismatch" et quand je debug ça m'indique que le problème apparait à la création du TCD. Quand je lance le pas à pas tout fonctionne bien jusqu'au tcd également. Je poste le code ou le problème apparait.
Merci de votre aide.
bonjour
salut Jean-Eric
nul besoin de VBA, Excel dispose de tout ce qu'il faut
tu as un fichier FOE.csv (Fichier Origine obtenu par Export). Ce fichier, tu ne le modifies jamais ! Bien entendu chaque export le régénère en entier.
il suffit de créer un nouveau fichier MIR.xlsx
ouvre MIR, menu Données Externes Fichiers Texte
dans la fenêtre choisis le séparateur du fichier .csv
Valide
MIR est donc un miroir du csv
désormais, à chaque ouverture de MIR, Excel te pose la question "mettre à jour ?"
Oui
Le tour est joué
ATTENTION : il faut parfois figer la ligne 1 (les titres)
dans MIR tu peux ajouter des colonnes (à droite pour ne pas gêner les mises à jour). On a souvent besoin de formules du genre
=remettresousformededatespropres (lacolonnedesdatesmalexportées )
ou encore
= quantité * prixunitaire
ensuite, je te conseille de créer un FEX.xlsx (Fichier d'Exploitation) contenant des TCD, des formules, des SOMMEPROD qui lisent les valeurs dans MIR;xlsx
simple, aucune macro. Excel pur