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
@ 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 SubBonjour,
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 iA 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 ?
@ bientôt
LouReeD