Problème TCD et Import texte
Bonjour à toutes et à tous,
Je coince ! Merci d'avance pour votre aide.
Mon problème est le suivant, je construis un indicateur d'analyse du chiffre d'affaires dans excel constitué ainsi :
- Onglet import dans lequel je récupère un fichier texte
- A noter que cette importation insère systématiquement un colonne vide à la fin de l'intégration.
- Un module VBA qui rafraichit le fichier texte et intègre des en-têtes de colonnes et des formules à la suite des données importées.
- Des onglets comprenant des TCD qui sont tous rafraîchis à la fin du module VBA
Tout cela fonctionne à un gros détail près ! A chaque exécution de la macro les TCD perdent la partie "formule" de l'onglet import et je suis donc obligé de tous les reconstruire un par un !
Les données du fichier étant confidentielles difficile de le transmettre en l'état, mais voici le code, au cas où quelque chose sauteraient à vos yeux d'experts !
Merci beaucoup d'avance pour vos conseils,
Sub Import()
'
' Import Macro
'
'
' Importe le fichier texte
Application.ScreenUpdating = False
' Suppression des formules précédentes
Worksheets("Import").Activate
Range("T2").Select
Range(Selection, Cells(ActiveSheet.UsedRange.Columns.Count)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Delete
Range("A1").Select
Worksheets("Accueil").Activate
Range("A1").Select
' MAJ des Données
Worksheets("Import").Activate
Range("A1").Select
Selection.QueryTable.Refresh BackgroundQuery:=False
'Intégration des Formules dans la feuille "Import" !!!! A modifier si ajout de nvelles formules !!!
Application.ScreenUpdating = False
Worksheets("Import").Activate
Cells(ActiveSheet.UsedRange.Columns.Count + 1).Select
' Ajoute la formule "ANNEE" !!!! A modifier si ajout de nvelles formules !!!
ActiveCell.FormulaR1C1 = "ANNEE"
ActiveCell.Offset(1, 0).Select
ActiveCell.FormulaLocal = "=ANNEE(J2)"
' Ajoute la formule "MOIS" !!!! A modifier si ajout de nvelles formules !!!
Cells(ActiveSheet.UsedRange.Columns.Count + 1).Select
ActiveCell.FormulaR1C1 = "MOIS"
ActiveCell.Offset(1, 0).Select
ActiveCell.FormulaLocal = "=SI(MOIS(J2)<10;""0""&MOIS(J2);MOIS(J2))"
' Ajoute la formule "périodeM" !!!! A modifier si ajout de nvelles formules !!!
Cells(ActiveSheet.UsedRange.Columns.Count + 1).Select
ActiveCell.FormulaR1C1 = "PERIODE M"
ActiveCell.Offset(1, 0).Select
ActiveCell.FormulaLocal = "=T2&""-""&U2"
' Ajoute la formule "Trimestre" !!!! A modifier si ajout de nvelles formules !!!
Cells(ActiveSheet.UsedRange.Columns.Count + 1).Select
ActiveCell.FormulaR1C1 = "TRIMESTRE"
ActiveCell.Offset(1, 0).Select
ActiveCell.FormulaLocal = "=CHOISIR(U2;1;1;1;2;2;2;3;3;3;4;4;4)"
' Ajoute la formule "Période T" !!!! A modifier si ajout de nvelles formules !!!
Cells(ActiveSheet.UsedRange.Columns.Count + 1).Select
ActiveCell.FormulaR1C1 = "PERIODE T"
ActiveCell.Offset(1, 0).Select
ActiveCell.FormulaLocal = "=T2&""-""&W2"
' Ajoute la formule "FN2B" !!!! A modifier si ajout de nvelles formules !!!
Cells(ActiveSheet.UsedRange.Columns.Count + 1).Select
ActiveCell.FormulaR1C1 = "FN2B"
ActiveCell.Offset(1, 0).Select
ActiveCell.FormulaLocal = "=SI(OU(H2=""COMPENSEES"";H2=""NON COMPENSEES"");""GMC"";H2)"
' Applique les formules sur l'ensemble de la BD !!!! A modifier si ajout de nvelles formules !!!
Application.ScreenUpdating = False
Worksheets("Import").Activate
Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count).Select
Range(Selection, Selection.Offset(0, -5)).Select
Range(Selection, Selection.End(xlUp)).Select
Selection.FillDown
Range("A1").Select
Worksheets("Accueil").Activate
Range("A1").Select
' Met à jour tout les TCD du fichier
Dim pt As Excel.PivotTable
Dim oSh As Excel.Worksheet
Application.ScreenUpdating = False
For Each oSh In ThisWorkbook.Worksheets
For Each pt In oSh.PivotTables
pt.RefreshTable
Next pt
Next oSh
MsgBox ("Mise à jour terminée... Merci !")
End Sub
bonjour
ma méthode suggère ceci :
- un onglet Import brut, sans aucun traitement ni formules
- un onglet Miroir qui est le miroir de Import, dans lequel il y a les traitements et les colonnes calculées
- des onglets TCD basés sur Miroir
avantage : on ne modifie jamais Miroir (ni manuellement ni par VBA).
il suffit de mettre à jour Import et les TCD.
un onglet miroir contient des = qui sont le miroir des données que tu veux exploiter dans I
en A1 =Import!$A$1 formule à étendre vers le bas, te donne le miroir de la colonne A
faire de même pour les colonnes que tu veux.
Bonjour JMD,
Merci beaucoup pour cette réponse rapide !
C'est une solution à laquelle j'avais pensé (et que je garde toujours à l'idée de surcroît avec tes conseils !), mais le fichier importé représente environ 100 000 lignes, c'est pourquoi je cherchais une solution «directe» pour ne pas trop alourdir le fichier !
J'accueille donc ta proposition avec soulagement ( je la pratique sur d'autres indicateurs plus «lights») , mais garde le post ouvert au cas où l'on arrive collectivement à trouver une solution «en prise directe»,
Merci beaucoup pour ton aide,
re
le Miroir doit être limité aux seules colonnes intéressantes, ce qui n'alourdit pas trop
fais un essai avec 100 000 lignes
selon ton PC et le réseau, c'est jouable.
et sans prise de tête avec VBA
moins il y a de lignes de code, moins il y a de bugs
Bonjour,
Merci encore jmd pour tes conseils.
Je suis passé en mode miroir et j'ai pu conserver la stabilité des tcd.
Au passage cela allège considérablement le corps de la Macro !
Je passe donc le sujet en résolu, mais vais en ouvrir un autre pour ne pas être hors-sujet car je cherche maintenant comment dimensionner automatiquement le "miroir" en fonction de la taille de l'import... Je fait un tour dans le site avant de poster !
Merci encore.