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.

code vba

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

78aidevba.xlsm (749.92 Ko)
77test.xlsx (366.43 Ko)

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.

80test-1.xlsb (416.31 Ko)
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 Sub

Bonjour,

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

Rechercher des sujets similaires à "probleme tcd vba"