Si error alors ignore et passe à la suite

Bonjour à tous,

Je suis nouveau sur le forum et espère que vous pourrez m'aider

Je cherche à réaliser une macro VBA qui permet de transformer les données issues d'un système d'information sous forme de tableau Excel (et non de plage) pour pouvoir ensuite réutiliser les en-têtes de colonnes dans des TCD avec champs calculés (le tout en VBA). En étape intermédiaire (après avoir créé le tableau et avant le TCD), je cherche à mettre certaines colonnes avec le bon format de données (€ pour la colonne COST, % pour la colonne taux de conversion etc.).

Le problème est qu'il se peut que selon les exports qui dépendent des besoins des utilisateurs finaux, certaines colonnes prévues dans la macro ne soient, en réalité, pas exportées dans le fichier XLSX de base... lors de l'exécution de la macro, on tombe sur un bug si la colonne n'existe pas et la macro s'arrête. Ce que je cherche à lui dire, c'est par exemple : si la colonne Cost n'existe pas alors ignore l'instruction de formatage et passe au formatage de la colonne suivante; si la colonne suivante n'existe pas même chose: ignore et passe à la suivante jusqu'au bout de toutes les colonnes à formater.

Voici le code brute (mon tableau Excel s'appelle entreprise_data) :

Range("entreprise_data[[#All],[Cost]]").Select

J'ai tenté avec un On Error GoTo comme suit :

On Error GoTo skip:

Range("entreprise_data[[#All],[Cost]]").Select

Selection.NumberFormat = "#,##0.00 $"

ça fonctionne si la colonne Cost n'existe pas... par contre, si je veux faire la même chose pour la colonne CPC, je ne peux pas déclarer la même étiquette car redondance... (ce qui est dommage en soi mais bon) et si je déclare une autre étiquette, la macro s'arrête avec bug... par ailleurs, je ne suis pas persuadé de m'y prendre de la meilleure façon sur ce coup.

Au départ, j'avais pensé faire juste un On Error Resume Next mais le problème est que l'exécution passe à la deuxième ligne du code (Selection.NumberFormat = "#,##0.00 $") et formate l'intégralité du tableau en €...

Si vous pouvez m'aider ce serait top!

Je vous mets ici l'intégralité de la macro si besoin

Sub test_reboot()

Merci beaucoup par avance,

Ben

Bonsoir,

je ne suis pas là

mais juste une idée, mais en fait je ne suis pas bon, c'est juste une idée :

un tableau avec vos colonnes, une boucle sur les dites colonnes, une valeur à 1 en correspondance pour les colonnes existantes et une valeur à 0 si elles n'existent pas. Ensuite une autre boucle sur ce tableau, si colonne existe alors modification de sont format en fonction du noms de la colonne du tableau testée, sinon on passe à la colonne suivante...

Mouais, il doit y avoir autre chose à faire avec les "tableaux" Excel...

N'y a t-il pas une instruction de test de colonne sur ce type de tableau ?

Voilà, comme dit plus haut je ne suis pas là

@ bientôt

LouReeD

Edit : en fait si ce peut être une bonne idée vu que le format à mettre est le même pour toutes les colonnes testées !

for i = 1 to fintablo

if tablo(i) = 1 then mise au format

next i

bien sûr la syntaxe n'est pas la bonne , c'est juste pour l'idée...

@ bientôt

LouReeD

Bonjour,

Que penses-tu de l'idée de nous joindre un petit fichier?

Cdlt.

Re,

En attendant un complément d'informations, , ci-dessous, ta procédure telle qu'elle pourrait être..

Cdlt.

Option Explicit
Option Private Module

Public Sub test_reboot()
'Test_reboot Macro
Dim wb As Workbook
Dim wsData As Worksheet
Dim lo As ListObject
Dim PTCache As PivotCache
Dim PT As PivotTable

    Application.ScreenUpdating = False
    Set wb = ActiveWorkbook
    Set wsData = wb.Worksheets("Summary")
    'Removes summary tab and merged cells while transforming data range into
    'a table named entreprise_data
    With wsData
        .Columns(1).Delete Shift:=xlToLeft
        .Rows("1:1").Delete Shift:=xlUp
        Set lo = .ListObjects.Add(xlSrcRange, .Cells(1).CurrentRegion, , xlYes)
        With lo
            .Name = "entreprise_data"
            .TableStyle = "TableStyleLight16"
        End With
    End With

    'Creates a pivot table based on entreprise
    Set PTCache = wb.PivotCaches.Create(xlDatabase, lo.Range, 5)
    wb.Worksheets.Add after:=Worksheets(Worksheets.Count)
    ActiveSheet.Name = "Pivot Table"
    Set PT = PTCache.CreatePivotTable(Cells(3, 1), "entreprise_data_pivot_table", , 5)
    'Adds calculated fields
    On Error Resume Next
    With PT
        .ManualUpdate = True
        .CalculatedFields.Add "CPC", "=Cost /Clicks", True
        With .PivotFields("CPC")
            .Orientation = xlDataField
            .Caption = "CPC "
            .NumberFormat = "#,##0.000"
        End With
        .CalculatedFields.Add "CVR", "='#' /Clicks", True
        With .PivotFields("CVR")
            .Orientation = xlDataField
            .Caption = "CVR "
            .NumberFormat = "#,##0.000"
        End With
        .RowAxisLayout xlTabularRow
        .TableStyle2 = "PivotStyleMedium2"
        .ManualUpdate = False
    End With
    On Error GoTo 0

    Set PT = Nothing
    Set PTCache = Nothing
    Set lo = Nothing
    Set wsData = Nothing
    Set wb = Nothing

End Sub

Merci à vous deux pour vos retours,

Voici le fichier.

Merci encore!

34test-vba.xlsx (10.73 Ko)

Bonjour,

Il va falloir être plus précis dans ta demande. Quel résultat souhaites tu ?

Il y a des doublons dans les en-têtes.

Cdlt.

Merci Jean-Eric,

Il y a des doublons dans les en-têtes car la première ligne (avant qu'elle ne soit supprimée par la macro) contient une différenciation de ces en-têtes. Ceci dit, ce n'est pas un souci dans la mesure où la mise en forme sous tableau créé une notion 2,3 etc. pour les en-tête en double donc pas de doublons à terme.

Sur le résultat, la macro supprime l'onglet Summary, retire les colonnes fusionnées et met les bonnes unités dans les colonnes monétaires avant de transformer le tout en TCD. C'est la mise en place des bonnes unités qui me bloque dans la macro; je voudrais juste lui dire, si tu ne trouves pas la colonne Cost (par exemple) alors zappe la sélection de la colonne (la colonne n'existant pas) et par conséquent zappe la mise en forme monétaire spécifiée à la deuxième ligne du code ci après :

Range("entreprise_data[[#All],[Cost]]").Select

Selection.NumberFormat = "#,##0.00 $"

Ensuite, reprend directement à l'instruction suivante (en l’occurrence, mise en forme monétaire pour la colonne CPC) avec la même prérogative: si tu ne trouve pas la colonne CPC alors zappe les deux lignes de code... etc. Ce principe de 'si ça n'existe pas, zappe deux lignes de code' sera également réutilisé lors de la création des champs calculés dans le TCD car un champ calculé nécessitant une colonne qui n'existe pas au préalable doit être zappé de la même façon.

En fait, ça ressemble à un On Error Resume Next mais au lieu de Next ce serait Next +1 par exemple pour dire ne reprend pas à la ligne juste après mais à x lignes après.

Le On Error GoTo Label est intéressant quand il y a une erreur possible mais l'association de deux On Error GoTo Label n'est pas pris en compte : le formatage des unités s'arrête après la première erreur, comme s'il zappé toute la partie de la macro qui concerne le formatage et celle-ci reprend qu'à partir du TCD.

J'espère que cela est plus clair

Merci encore pour l'aide,

Ben

Re,

Ce que je souhaiterai c'est que tu précises les champs à intégrer dans le TCD et sous quelles formes.

Cdlt.

Bonsoir

j'ai essayé de mettre en forme mon idée, mais je ne l'ai pas testée...

Dim tablo(0 To 6, 1 To 2) As Variant
    ' définition du noms des colonnes
    tablo(0, 1) = "Cost"
    tablo(1, 1) = "CPC"
    tablo(2, 1) = "€"
    tablo(3, 1) = "Average Basket"
    tablo(4, 1) = "CPA"
    tablo(5, 1) = "eCPM"
    tablo(6, 1) = "MAX CPC"
    ' on part du principe que toutes les colonnes existent, donc on met vrai
    For i = 0 To 6
        tablo(i, 2) = True
    Next i

' on boucle sur le tableau des colonnes pour tester la sélection
For i = 0 To 6
    ' on gère les erreurs éventuelles
    On Error Resume Next
    Range("entreprise_data[[#All],[" & tablo(i, 1) & "]]").Select
    ' si la sélection provoque une erreur alors on met la valeur de la colonne correspondante à faux
    If Err > 0 Then
         tablo(i, 2) = False
    End If
    ' on arrête la gestion des erreurs
    On Error Goto 0
Next i

' on boucle sur le tableau des colonnes
For i = 0 To 6
    ' si la colonne est à vrai on peut la sélectionnée
    If tablo(i, 2) = True Then
        ' du coup on met le format voulu
        Range("entreprise_data[[#All],[" & tablo(i, 1) & "]]").Select
        Selection.NumberFormat = "#,##0.00 $"
    End If
Next i

A mettre après : 'Adds currency to monetary KPIs

et avant : 'Creates a pivot table based on entreprise

@ bientôt

LouReeD

Bonjour,

pas de réponse ? C'est que ça marche alors !

@ bientôt

LouReeD

Rechercher des sujets similaires à "error ignore passe suite"