VBA- Choix de colonnes par case à cocher

jotiamo

XLDnaute Nouveau
Bonjour à tous,

Lors d’un import d’un fichier sur excel, je dispose de beaucoup de colonnes dont l’information ne m’est pas nécessaire. D’autres colonnes sont indispensables et d’autres sont facultatives selon l’analyse que l’on souhaite faire de ce fichier.
Je souhaite faire une macro que je diffuserais à mes collègues et qui permettrait à tous de trier efficacement et rapidement les données.
Partant de l’hypothèse que celui qui veut analyser un fichier connaît le type d’information nécessaire à l’avance, je voudrais que la macro, une fois lancée, demande à travers un userform (cases à cocher) quelles sont les informations (facultatives) que l’utilisateur veut récupérer. Les libellés des infos indispensables seront affichés à titre d’information.
En fonction des cases sélectionnées, les colonnes y relatives seront conservées dans le fichier et toutes les autres colonnes seront supprimées (sauf évidemment les colonnes indispensables…).

Pour un type concret d’information, j’ai déjà fait ceci mais le code pourrait à mon avis être facilement allégé…
En gras les commentaires ajoutés pour votre compréhension
Code:
    Columns("AJ:AJ").Select
    Selection.Delete Shift:=xlToLeft
    Columns("AF:AH").Select
    Range("AH1").Activate
    Selection.Delete Shift:=xlToLeft
    Columns("AD:AD").Select
    Selection.Delete Shift:=xlToLeft
    Columns("W:AB").Select
    Range("AB1").Activate
    Selection.Delete Shift:=xlToLeft
    Columns("N:T").Select
    Range("T1").Activate
    Selection.Delete Shift:=xlToLeft
    Columns("L:L").Select
    Selection.Delete Shift:=xlToLeft
    Columns("I:J").Select
    Range("J1").Activate
    Selection.Delete Shift:=xlToLeft
    Columns("E:F").Select
    Range("F1").Activate
    Selection.Delete Shift:=xlToLeft
    Columns("A:C").Select
    Range("C1").Activate
    Selection.Delete Shift:=xlToLeft
[B]Je supprime les colonnes de droite à gauche pour éviter qu’elles ne changent de références…[/B]    
    Columns("B:B").Select
    Selection.Insert Shift:=xlToRight
    Columns("F:F").Select
    Selection.Insert Shift:=xlToRight
    Columns("H:H").Select
    Selection.Insert Shift:=xlToRight
[B]J’insère des colonnes qui vont me permettre de transcodifier des informations[/B]    Range("B2").Select
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(RC[-1],'CheminDuFichier[ref_tables.xls]Instruments'!C1:C3,3,FALSE)"
    Range("B2").Select
    Selection.AutoFill Destination:=Range("B2:B200")
    Range("B2:B200").Select
    Range("F2").Select
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(RC[-1],' CheminDuFichier[ref_tables.xls]quotation'!C1:C3,3,FALSE)"
    Range("F2").Select
    Selection.AutoFill Destination:=Range("F2:F200")
    Range("F2:F200").Select
    Range("H2").Select
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(RC[-1],' CheminDuFichier [ref_tables.xls]guarantee'!C1:C3,3,FALSE)"
    Range("H2").Select
    Selection.AutoFill Destination:=Range("H2:H200")
    Range("H2:H200").Select
[B]Je vais récupérer les informations dans un fichier fermé[/B]
    Cells.Select
    Range("C2").Activate
    With Selection.Font
        .Name = "Arial"
        .Size = 8
    End With
    Cells.EntireColumn.AutoFit
    Range("B1").Select
    ActiveWorkbook.breaklink Name:= _
        " CheminDuFichier \ref_tables.xls" _
        , Type:=xlExcelLinks
[B]Je romps le lien[/B]
    Columns("A:A").Select
    Selection.Delete Shift:=xlToLeft
    Columns("D:D").Select
    Selection.Delete Shift:=xlToLeft
    Columns("E:E").Select
    Selection.Delete Shift:=xlToLeft
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "Instrument type"
    Range("B1").Select
    ActiveCell.FormulaR1C1 = "ISIN"
    Range("C1").Select
    ActiveCell.FormulaR1C1 = "NAME"
    Range("D1").Select
    ActiveCell.FormulaR1C1 = "Quotation place"
    Range("E1").Select
    ActiveCell.FormulaR1C1 = "Guarantee type"
    Range("F1").Select
    ActiveCell.FormulaR1C1 = "Quantity"
    Range("G1").Select
    ActiveCell.FormulaR1C1 = "Price"
    Range("H1").Select
    ActiveCell.FormulaR1C1 = "EVAL"
    Range("I1").Select
    ActiveCell.FormulaR1C1 = "% TNA"
    Range("J1").Select
    ActiveCell.FormulaR1C1 = "Event"
[B]Je remplace les titres de colonnes par des titres plus explicites[/B]
    ActiveWindow.Zoom = 95
    Columns("F:H").Select
    Selection.NumberFormat = "#,##0.00"
    Range("I7").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=10, Criteria1:="1"
    Range("A1").Select
    Application.ScreenUpdating = False
    With ActiveSheet.PageSetup
        .PrintTitleRows = ""
        .PrintTitleColumns = ""
    End With
    ActiveSheet.PageSetup.PrintArea = ""
    With ActiveSheet.PageSetup
        .LeftHeader = ""
        .CenterHeader = ""
        .RightHeader = "&8&D"
        .LeftFooter = "&8&Z&F"
        .CenterFooter = ""
        .RightFooter = ""
        .LeftMargin = Application.InchesToPoints(0.35)
        .RightMargin = Application.InchesToPoints(0.35)
        .TopMargin = Application.InchesToPoints(0.51)
        .BottomMargin = Application.InchesToPoints(0.51)
        .HeaderMargin = Application.InchesToPoints(0.21)
        .FooterMargin = Application.InchesToPoints(0.21)
        .PrintHeadings = False
        .PrintGridlines = False
        .PrintComments = xlPrintNoComments
        .PrintQuality = 600
        .CenterHorizontally = True
        .CenterVertically = False
        .Orientation = xlLandscape
        .Draft = False
        .PaperSize = xlPaperA4
        .FirstPageNumber = xlAutomatic
        .Order = xlDownThenOver
        .BlackAndWhite = False
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = 2
        .PrintErrors = xlPrintErrorsDisplayed
    End With
    Application.ScreenUpdating = True
End Sub
Je pense que ce code est beaucoup trop long pour le peu d’informations à traiter mais je n’ai appris VBA qu’en manipulant excel…
Je sais aussi utiliser les input box et msg box.
Ce que je ne sais pas faire :
- Création d’un userform
- Lier des cases à cocher d’un userform avec des colonnes
- Et bcp d’autres choses…
Ma réflexion sur ce sujet est la suivante :
Lors du lancement de la macro, lancer un userform en demandant quelles sont les informations à récupérer.
Le userform indique quelles seront les données gardées d’office et laisse le choix par des cases à cocher pour les autres données. En fonction de la sélection, récupérer les n° ou noms des colonnes a garder (ces n° ou noms peuvent être définis au départ puisque le fichier importé sera toujours le même). Sélectionner les colonnes choisies + les colonnes indispensables, inverser la sélection et supprimer.

Pourriez-vous me dire si ma réflexion est juste et surtout si possible, pourriez vous m’aider à mettre au point cette application ?

Je vous remercie d’avoir lu jusque ici et vous remercie par avance de l’aide que vous m’apporterez !!

Cordialement

Thierry
 

Staple1600

XLDnaute Barbatruc
Re : VBA- Choix de colonnes par case à cocher

Bonjour (et bienvenue)


De quel type est ton fichier d'import?

C'est un fichier Excel apparemment (aprés relecture de ton code VBA)


As-tu essayé d'utiliser Données/Données Externes?
 
Dernière édition:

jotiamo

XLDnaute Nouveau
Re : VBA- Choix de colonnes par case à cocher

Bonjour,

il s'agit d'un fichier excel généré par une application en remote control. On peut aussi choisir les colonnes dans cette application mais c'est encore plus contraignant que dans excel... Dès lors le fichier importé est le fichier par défaut.
Je n'ai pas essayé "Données externes" cela aurait il une pertinence dans ce cas-ci?
Merci
 

Staple1600

XLDnaute Barbatruc
Re : VBA- Choix de colonnes par case à cocher

Re

A toi de juger de la pertinence de ma suggestion.

J'ai lu ton problème.

Ma réponse a été "Données externes".


Ce n'est qu'une suggestion.

Pas une solution.

edit: après test je confirme ma réponse
MSQuery permet de choisir les colonnes d'importation
(le tout pouvant être fait sous VBA)

Quand à évaluer la pertinence de mon propos, ca reste toujours de ton ressort.
 
Dernière édition:

Catrice

XLDnaute Barbatruc
Re : VBA- Choix de colonnes par case à cocher

Bonjour,

Voici une petite simplification (à tester) mais on doit encore pouvoir améliorer.
Pour la question concernant l'utilisation d'un UserForm, il faudrait le fichier pour voir ...
Par exemple la suppression des colonnes doit pouvoir etre optimisée.

Sub test()
Columns("AJ:AJ").Delete
Columns("AF:AH").Delete
Columns("AD:AD").Delete
Columns("W:AB").Delete
Columns("N:T").Delete
Columns("L:L").Delete
Columns("I:J").Delete
Columns("E:F").Delete
Columns("A:C").Delete
Je supprime les colonnes de droite à gauche pour éviter qu’elles ne changent de références…
Columns("B:B").Insert
Columns("F:F").Insert
Columns("H:H").Insert
J’insère des colonnes qui vont me permettre de transcodifier des informations Range("B2").Select
ActiveCell.FormulaR1C1 = _
"=VLOOKUP(RC[-1],'CheminDuFichier[ref_tables.xls]Instruments'!C1:C3,3,FALSE)"
Range("B2").AutoFill Destination:=Range("B2:B200")
'Range("B2:B200").Select 'Facultatif
Range("F2").FormulaR1C1 = _
"=VLOOKUP(RC[-1],' CheminDuFichier[ref_tables.xls]quotation'!C1:C3,3,FALSE)"
Range("F2").AutoFill Destination:=Range("F2:F200")
'Range("F2:F200").Select 'Facultatif
Range("H2").FormulaR1C1 = _
"=VLOOKUP(RC[-1],' CheminDuFichier [ref_tables.xls]guarantee'!C1:C3,3,FALSE)"
Range("H2").AutoFill Destination:=Range("H2:H200")
'Range("H2:H200").Select 'Facultatif
Je vais récupérer les informations dans un fichier fermé
Cells.Select
With Range("C2").Font
.Name = "Arial"
.Size = 8
End With
Cells.EntireColumn.AutoFit
'Range("B1").Select 'Facultatif
ActiveWorkbook.BreakLink Name:="CheminDuFichier \ref_tables.xls", Type:=xlExcelLinks
Je romps le lien
Columns("A:A").Delete
Columns("D:E").Delete
Range("A1") = "Instrument type"
Range("B1") = "ISIN"
Range("C1") = "NAME"
Range("D1") = "Quotation place"
Range("E1") = "Guarantee type"
Range("F1") = "Quantity"
Range("G1") = "Price"
Range("H1") = "EVAL"
Range("I1") = "% TNA"
Range("J1") = "Event"
Je remplace les titres de colonnes par des titres plus explicites
ActiveWindow.Zoom = 95
Columns("F:H").NumberFormat = "#,##0.00"
With Range("I7")
.AutoFilter
.AutoFilter Field:=10, Criteria1:="1"
End With
'Range("A1").Select 'Facultatif
Application.ScreenUpdating = False
With ActiveSheet.PageSetup
.RightHeader = "&8&D"
.LeftFooter = "&8&Z&F"
.LeftMargin = Application.InchesToPoints(0.35)
.RightMargin = Application.InchesToPoints(0.35)
.TopMargin = Application.InchesToPoints(0.51)
.BottomMargin = Application.InchesToPoints(0.51)
.HeaderMargin = Application.InchesToPoints(0.21)
.FooterMargin = Application.InchesToPoints(0.21)
.PrintQuality = 600
.CenterHorizontally = True
.Orientation = xlLandscape
.PaperSize = xlPaperA4
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 2
End With
Application.ScreenUpdating = True
End Sub
 
Dernière édition:

jotiamo

XLDnaute Nouveau
Re : VBA- Choix de colonnes par case à cocher

Staple1600 :
En fait j'avais regardé dans données externes mais apparement il faut notifier le fichier de base de référence. Si tel est le cas, cela ne peut pas etre la solution car les fichiers sont différents pour chaque utilisateur et la macro ne pourrait faire référence au fichier en question. Il n'est pas non plus envisageable que tous les utilisateurs utilisent le meme nom de fichier car chacun doit pouvoir travailler avec cette macro sans se soucier si qqn d'autre utilise deja le fichier. De plus en faisant un essai avec un fichier test, le résultat est le suivant : "External table is not in the expected format":confused:
Je vopus posai cette question car je n'ai pas encore eu l'occasion de travailler avec les données externes et ne maitrise aucunement cela.
Cependant, j'aime l'esprit critique et le fait de laisser chercher les autres par eux-memes, c'est ce que je fait depuis toujours mais je n'ai malheureusement pu trouver les infos nécessaires pour ce problème.;)

Catrice :
merci pour ces précisions qui permettent d'alléger le code de quelques lignes superflues!
:)
 

jotiamo

XLDnaute Nouveau
Re : VBA- Choix de colonnes par case à cocher

Le choix des colonnes dans l'autre application est fastidieux et de plus le libellé des colonnes n'est pas évident. D'autre part, un des buts est de pouvoir, à partir d'une fichier standard, extraire différentes informations en fonctions des besoins. L'autre but est le gain de temps, en effet, si il faut passer plus de temps a choisir les colonnes dans un programme que dans excel, cela n'est pas vraiment un avantage.
 

Staple1600

XLDnaute Barbatruc
Re : VBA- Choix de colonnes par case à cocher

Re


Il y un seul fichier source? Il est partagé?

et tes utilisateurs pourront lancer la macro en même temps sur le même fichier?

Les colonnes doivent être forcément effacées (ou peuvent être masquées)

Pour ce est qui de l'utilisation de Données externes
je n'ai pas de message d'erreur
et je peux choisir les colonnes de mon choix
et enregistrer la requete (gain de temps)
 
Dernière édition:

jotiamo

XLDnaute Nouveau
Re : VBA- Choix de colonnes par case à cocher

Non je me suis certainement mal fait comprendre, désolé.
Chaque personne peut exporter a partir du programme un fichier excel qui est différent. Je compte après installer la macro sur chaque poste (peut etre via une macro complémentaire).
Les colonnes doivent etre effacées afin de pouvoir envoyer le fichier allégé vers l'exterieur.
Merci bcp.
 

Staple1600

XLDnaute Barbatruc
Re : VBA- Choix de colonnes par case à cocher

Re

Et l'application n'exporte qu'en *.xls?

Pas en *.csv ou *.txt?
(car dans ce cas le fichier généré serait moins imposant)

En regardant ton code VBA

on peut voir que ton code régle la mise en page

Tu te sers du fichier d'export pour imprimer ?

Ou le fichier exporté sert pour des calculs?

Tu n'aurais pas des extraits de fichiers exemples ("anonymisé") à joindre?
- un fichier source (données brutes)
- et le fichier final escompté

qu'on puisse tester.
 

jotiamo

XLDnaute Nouveau
Re : VBA- Choix de colonnes par case à cocher

Re,

le programme permet aussi l'export en txt et csv (ce qui serait bcp plus facile dans ce cas ci) mais le problème c'ets que lors d'un export dans ces formats, les décimales se perdent...
Je vais rendre un fichier aussi anonyme que possible dès que j'aurai le temps et vous le ferai parvenir.

Le fichier ne doit pas forcément etre imprimé.

Merci
 

Discussions similaires

Réponses
3
Affichages
587

Statistiques des forums

Discussions
312 236
Messages
2 086 479
Membres
103 232
dernier inscrit
logan035