Debogage: Macro TCD

Bonjour à tous,

Je sollicite votre aide car je n'arrive pas à résoudre une erreur

Ma macro récupère un fichier de données et le transforme en liste. Je cherche ensuite a créer un tableau croisé dynamique pour avoir une meilleur visibilité des résultats.

La macro créer bien le tableau mais celle-ci s'arrête au moment de placer le champs "Valeurs (?)".

J'ai recopié ce que m'a donné l'enregistreur de macro en effectuant la manipulation moi-même.

J'ai pensé que ce serai le caractère spécial ohm qui gênerai mais le problème persiste (d'ailleurs je n'arrive toujours pas à l'afficher correctement .

Je suis novice en VBA donc si vous voyez des bouts de code à améliorer n'hésitez pas non plus ! D'autant plus que la macro va être utilisée par plusieurs personnes donc elle doit être facile à l'utilisation.

Merci d'avance pour votre aide !

PS: Pour l'instant j'ai figé mes plages de TCD afin d'éviter les erreurs mais j’appellerai ensuite des variables. Donc NomConnecteur = P2 et nbpins = 15 pour l'instant.

Sub Mise_en_forme()

'1. DONNEES UTILISATEURS
    Dim NomConnecteur
    Dim fichier
    Dim nbpins

    'Entrée du nom du connecteur
    NomConnecteur = InputBox("Saisir le nom du connecteur en test")
    If NomConnecteur = "" Then
        MsgBox "La macro a été annulée"
        Exit Sub
    End If
    'Entrée du nombre de pins du connecteur
    nbpins = Application.InputBox("Saisir le nombre de pins du connecteur", , , , , , , 1) 'Type = 1 pour forcer l'input en nombre uniquement
    If nbpins = "" Then
        MsgBox "La macro a été annulée"
        Exit Sub
    End If
    'Sélection du fichier résultat
    fichier = Application.GetOpenFilename(FileFilter:="All Files (*.*),*.*", _
                                          Title:="Sélectionner le fichier résultat", _
                                          MultiSelect:=False)

'2. IMPORTATION DANS EXCEL DU FICHIER TEXTE
    Dim skipheader

    'Ouverture d'une sheet avec le nom du connecteur après la sheet "Macro"
    Sheets.Add(After:=Worksheets("Macro")).Name = NomConnecteur
    Sheets(NomConnecteur).Select
    'Nombre de ligne a sauter avant la première valeur
    skipheader = 17
    'Copie du fichier résultat dans la sheet active
    If fichier <> False Then
        With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & fichier, Destination:=Range("$A$2"))
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .AdjustColumnWidth = True
        .TextFileParseType = xlDelimited 'xlFixedWidth
        '.TextFileFixedColumnWidths = Array(x, x)
        .TextFileStartRow = skipheader
        .TextFileConsecutiveDelimiter = False
        .TextFileDecimalSeparator = "."
        .TextFileSpaceDelimiter = True 'Espace pour délimitation de colonne
        .TextFileColumnDataTypes = Array(xlTextFormat, xlGeneralFormat) '1ère colonne en texte et 2ème colonne en standard
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
        End With
    End If

'3. FORMATAGE DE LA FEUILLE EXCEL
    Dim ChrSpec
    Dim pin1
    Dim pin2

    'Suppression de la première colonne inutile
    Columns("A:A").Delete Shift:=xlToLeft
    'Insertion de 2 colonnes à gauche pour la liste des pins
    Range("A1").Select
    Selection.EntireColumn.Insert Shift:=xlToRight
    Selection.EntireColumn.Insert Shift:=xlToRight
    'Ecriture des en-têtes
    Range("A1") = "Pin n°1"
    Range("B1") = "Pin n°2"
    'Range("A1:B1").Interior.Color = RGB(50, 255, 50)
    Range("A1:B1").Font.Name = "Calibri"
    Range("A1:B1").Font.Size = 16
    Range("A1:B1").Font.Bold = True

    ChrSpec = ChrW(2126) 'Caractère spécial ohm
    Range("C1") = "Valeurs (" & ChrSpec & ")"
    'Range("C1").Interior.Color = RGB(50, 50, 255)
    Range("C1").Font.Name = "Calibri"
    Range("C1").Font.Size = 16
    Range("C1").Font.Bold = True
    Columns("C:C").NumberFormatLocal = "# ##0"

    Range("A1:C1").Columns.AutoFit 'Adaptation des largeurs de colonnes au texte

    'Ecriture de la liste des pins
    pin1 = 1
    pin2 = 2
    Range("A2") = pin1
    Range("B2") = pin2
    Range("B2").Select

    While pin1 < nbpins
        While pin2 < nbpins
            pin2 = pin2 + 1
            ActiveCell.Offset(1, -1).Select
            ActiveCell = pin1
            ActiveCell.Offset(0, 1).Select
            ActiveCell = pin2
        Wend
    pin2 = pin1 + 1
    pin1 = pin1 + 1
    Wend

'4. CREATION DU TABLEAU CROISE DYNAMIQUE
    Dim SourceData
    Dim TableDestination

    SourceData = "P2!R1C1:R106C3"
    TableDestination = "P2!R1C5"
    'Création du tableau croisé dynamique
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        SourceData, Version:=xlPivotTableVersion14).CreatePivotTable _
        TableDestination:=TableDestination, TableName:=NomConnecteur
    'Placement de la colonne Pin n°1 en ligne
    With ActiveSheet.PivotTables(NomConnecteur).PivotFields("Pin n°1")
        .Orientation = xlRowField
        .Position = 1
    End With
    'Placement de la colonne Pin n°2 en colonne
    With ActiveSheet.PivotTables(NomConnecteur).PivotFields("Pin n°2")
        .Orientation = xlColumnField
        .Position = 1
    End With
    'Placement de la colonne Valeur en data croisées
    ActiveSheet.PivotTables(NomConnecteur).AddDataField ActiveSheet.PivotTables(NomConnecteur). _
        PivotFields("Valeurs (?)"), "Somme de Valeurs (?)", xlSum
    ActiveWorkbook.ShowPivotTableFieldList = False 'Cache les options de champs du Tcd
    With ActiveSheet.PivotTables(NomConnecteur)
        .ColumnGrand = False 'Cache le nom des colonnes
        .RowGrand = False 'Cache le nom des lignes
    End With
End Sub

Bonjour,

Une procédure fonctionnelle à adapter !?

Cdlt.

Sub CreatePivotTable()
Dim wsData As Worksheet
Dim PTCache As PivotCache, pt As PivotTable
Dim rngData As Range

    Set wsData = Worksheets("P2")
    Set rngData = wsData.Cells(1).CurrentRegion
    Set PTCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rngData)
    Set pt = PTCache.CreatePivotTable(TableDestination:=Cells(5), TableName:="TCD_1")
    With pt
        .ManualUpdate = True
        .AddFields RowFields:="Pin n°1", ColumnFields:="Pin n°2"
        With .PivotFields("Valeurs")
            .Orientation = xlDataField
            .Function = xlSum
            .NumberFormat = "#,##0.00_ ;[Red]-#,##0.00 ;"
        End With
        .RowAxisLayout xlTabularRow
        .ColumnGrand = False
        .RowGrand = False
        .ManualUpdate = False
    End With
End Sub

Bonjour,

Merci pour votre réponse Jean-Eric.

J'ai essayé avec votre proposition de code. Déjà elle est beaucoup plus propre et je ne connaissais pas certaines fonction comme .CurrentRegion.

Cependant un bug persiste... Le debogage m'indique la ligne .Orientation = xlDataField au moment de placer la colonne "Valeurs" dans le champs Data.

Je commence a me demander si le problème ne vient pas d'un format de ma liste générée précédemment. Si vous avez une idée, je suis preneur !

Cordialement,

Bonjour,

Oups !...

J'ai modifié le nom du champ Valeurs dans ton tableau. Remplace donc" Valeurs" par "Valeurs (?)" dans la procédure.

Cdlt.

Désolé j'ai oublié de préciser que j'avais déjà anticiper cette erreur.

J'ai essayer avec "Valeurs (?)" et aussi en changeant plus haut dans la macro en "Valeurs" simplement. Les deux cas génèrent la même erreur.

En changeant le format de la case qui contient "Valeurs" en texte ça ne fonctionne pas non plus.

Re,

Ton classeur comporte des connexions externes !...

Tu confirmes ? Sont elles nécessaires ?

Cdlt.

Oui je confirme, je fais appel a un fichier de données brutes.

Le but de ma macro est justement de mettre en forme ces données. Donc oui elle est nécessaire.

Je link l'exemple de fichier brut que j'appelle dans la macro.

En recommençant la manip manuellement j'ai remarqué que le champ de Data portait le nom "Valeurs2" au lieu de "Valeurs".

J'ai modifié ma macro en ce sens et ça fonctionne !

Bon par contre je sais pas encore pourquoi le champs de données s’appelle comme ça...

Peut-être que "Valeurs" est déjà utilisé autre part...

Bonjour,

pour les TCD il est souvent inutile de le reconstruire entièrement en vba.
Il est plus simple de le construire manuellement et de se contenter en vba de mettre à jour la plage de source des données une fois celles-ci mises en forme.
eric

Re,

Essaie ainsi :

Sub CreatePivotTable()
Dim wsPT As Worksheet
Dim PTCache As PivotCache, pt As PivotTable
Dim rngData As Range
Dim ChrSpec: ChrSpec = ChrW(2126)

    Set wsPT = Worksheets("P2")
    Set rngData = wsPT.Cells(1).CurrentRegion
    On Error Resume Next
    wsPT.PivotTables("TCD_1").TableRange2.Clear
    On Error GoTo 0
    Set PTCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rngData)
    Set pt = PTCache.CreatePivotTable(TableDestination:=Cells(5), TableName:="TCD_1")
    With pt
        .ManualUpdate = True
        .AddFields RowFields:="Pin n°1", ColumnFields:="Pin n°2"
        With .PivotFields("Valeurs (" & ChrSpec & ")")
            .Orientation = xlDataField
            .Function = xlSum
            .NumberFormat = "#,##0.00_ ;[Red]-#,##0.00 ;"
            .Caption = ChrW(931) & " Valeurs"
        End With
        .RowAxisLayout xlTabularRow
        .ColumnGrand = False
        .RowGrand = False
        .ManualUpdate = False
    End With
End Sub

Même erreur, le debogage pointe la ligne With .PivotFields("Valeurs (" & ChrSpec & ")").

Dans le TCD c'est toujours "Valeurs2" qui s'affiche dans la liste des champs.

Concernant ChrSpec = ChrW(2126), il affiche ? au lieu du symbole ohm.

Au début je pensais que c'était la cause mais quand j'enlève le symbole ça ne fonctionne pas on plus.

Re,

Alt F8 et exécuter CreatePivotTable

Cdlt.

Erreur d'éxécution '1004':

Impossible de lire la propriété PivotFields de la classe PivotTable.

Il semblerai bien que ce soit le caractère spécial finalement...

Re,

Le fichier de mon précédent message n'a pas été téléchargé. Il est fonctionnel chez moi !...

Cdlt.

Bonjour,

Pardon je n'avais pas compris.

Votre fichier fonctionne chez moi aussi !

La différence se situe donc soit dans la variable à la place de "P2" ou "TCD_1"(J'utilise la même pour ces deux informations) soit dans la code au-dessus du TCD.

Je vais remplacer votre code par le mien progressivement pour voir où est le problème.

Merci encore de votre aide c'est sympa de prendre du temps pour les autres :)

Bonjour,

Vire les caractères spéciaux de tes en-têtes.

Cdlt.

Le problème venait finalement du fait que le TCD utilise déjà la variable "Valeurs" pour créer le tableau.

Donc nommé une colonne "Valeurs" en champs d'entrée n'est pas une bonne idée (d'où le nom "valeur2" qu'Excel changeait à chaque fois)

J'ai renommé l'entête en "Mesures" et tout est rentré dans l'ordre.

Merci Jean-Eric pour l'aide

Rechercher des sujets similaires à "debogage macro tcd"