OVH Cloud OVH Cloud

Question de béotien: ouverture automatique d'un fichier csv

16 réponses
Avatar
EricP
Bonjour,

Systématiquement, un double-clic sur un fichier csv génère l'ouverture
d'Excel (çà, je sais faire) puis il faut faire:
- sélection de la colonne A
- Données / Convertir
- assistant de conversion (3 écrans)

1°) Y a t'il moyen d'automatiser cette séquence de manipulations ?

2°) Dans le cas où l'on a récupéré un tableau, il faut faire:
- sélection des données
- clic sur l'icône Bordures
- choix d'une bordure (au minimum)

Y a t'il moyen, là aussi, d'automatiser cette séquence de manip. ?


J'ai cherché un peu partout: je n'ai pas trouvé de réponse ...

Merci d'avance,

EricP

6 réponses

1 2
Avatar
EricP
Oups! Pour quelqu'un qui n'y connait rien aux macros, je suis gâté!

J'agis ci-dessous pas-à-pas, jusqu'à plus pouvoir ...

Ca y est! Soluce trouvée par Alain Cros, adaptant un code
de Frédéric Sigonneau:

Merci à vous 3


Dans Perso.xls (il faut que tu sois dans visual basic
editor),
J'y suis


tu insères un module de classe
Insertion/Module de classe

et tu le renommes
ExcelPerso (tu affiches les propriétés du module et tu
modifies le nom).
Dans la fenêtre de gauche, qui possèdes 2 onglets Alphabétique et Par

catégories,
à droite de (name): je remplace "Classe(1 ou x)" par "ExcelPerso"
Dedans: tu inscris le code suivant:

Par un copier-coller

Public WithEvents AppXl As Application
'code de F. Sigonneau et A. Cros
Private Fichier$

Private Sub AppXl_WorkbookActivate(ByVal Wb As
Excel.Workbook)
If Right(Wb.Name, 4) = ".csv" Or Right(Wb.Name, 4)
= ".CSV" Then
If Fichier = "" Then
MsgBox "coucou" 'vire ça et mets le nom de ta macro
je remplace coucou par OuvreCSV


Fichier = Wb.Name
End If
End If
End Sub

Private Sub AppXl_WorkbookBeforeClose(ByVal Wb As
Excel.Workbook, Cancel As Boolean)
If Wb.Name = Fichier Then Fichier = ""
End Sub


Jusque là, je n'ai rien compris, mais j'ai fait


Puis, tu vas, toujours dans PERSO.xls, dans le
ThisWorkbook
Où c'est çà ? Peux-tu expliciter à un novice ?


et là tu colles le code suivant:

Dim MonXL As New ExcelPerso

Private Sub Workbook_Open()
Set MonXL.AppXl = Application
End Sub

Voila!


Je sauve comment ce délice de code ?

Cordialement,
Eric

Avatar
Chris MICHEL
Je sais, c'est pas évident, mais je t'avais prévenu que ce
ne serait pas simple!

Dans visual basic editor, dans le petit explorateur de
projet, au dessus du petit dossier modules, il a un
dossier Microsoft Excel Objects. en double-cliquant, tu
feras apparaitre un cerrtain nombre de petits icones
représentant des feuilles. L'un deux, légèrement
différent, se nomme ThisWorkbook. C'est là que tu colles
la fin du code.

Par contre, il va falloir que tu fasses une légère
correction. Dans le code que tu as déja collé dans le
module de classe, il y a une cassure de ligne qui n'a pas
lieu d'être (due au format des messages sur le forum). Il
faut que tu ailles juste avant = ".CSV" et que tu fasses
backspace pour remonter ce bout de code à la ligne du
dessus.

Voila! Tiens-moi au courant,

Chris.
-----Message d'origine-----
Oups! Pour quelqu'un qui n'y connait rien aux macros, je
suis gâté!


J'agis ci-dessous pas-à-pas, jusqu'à plus pouvoir ...

Ca y est! Soluce trouvée par Alain Cros, adaptant un
code


de Frédéric Sigonneau:

Merci à vous 3


Dans Perso.xls (il faut que tu sois dans visual basic
editor),
J'y suis


tu insères un module de classe
Insertion/Module de classe

et tu le renommes
ExcelPerso (tu affiches les propriétés du module et tu
modifies le nom).
Dans la fenêtre de gauche, qui possèdes 2 onglets

Alphabétique et Par

catégories,
à droite de (name): je remplace "Classe(1 ou x)"
par "ExcelPerso"

Dedans: tu inscris le code suivant:

Par un copier-coller

Public WithEvents AppXl As Application
'code de F. Sigonneau et A. Cros
Private Fichier$

Private Sub AppXl_WorkbookActivate(ByVal Wb As
Excel.Workbook)
If Right(Wb.Name, 4) = ".csv" Or Right(Wb.Name, 4)
= ".CSV" Then
If Fichier = "" Then
MsgBox "coucou" 'vire ça et mets le nom de ta
macro


je remplace coucou par
OuvreCSV


Fichier = Wb.Name
End If
End If
End Sub

Private Sub AppXl_WorkbookBeforeClose(ByVal Wb As
Excel.Workbook, Cancel As Boolean)
If Wb.Name = Fichier Then Fichier = ""
End Sub


Jusque là, je n'ai rien compris, mais j'ai fait


Puis, tu vas, toujours dans PERSO.xls, dans le
ThisWorkbook
Où c'est çà ? Peux-tu expliciter à un novice ?


et là tu colles le code suivant:

Dim MonXL As New ExcelPerso

Private Sub Workbook_Open()
Set MonXL.AppXl = Application
End Sub

Voila!


Je sauve comment ce délice de code ?

Cordialement,
Eric

.




Avatar
EricP
Bonjour,

J'ai l'impression d'avoir respecté à la lettre ta prescription, mais çà
ne fonctionne pas.

Un double-clic sur le fichier essai_eric.csv:
- ouvre XL (j'ai pas tout perdu!),
- ouvre Microsoft Visual basic - PERSO.XLS - [Classe1(Code)], avec le
code suivant :
Public WithEvents AppXl As Application
'code de F. Sigonneau et A. Cros
Private Fichier$

Private Sub AppXl_WorkbookActivate(ByVal Wb As
Excel.Workbook)
If Right(Wb.Name, 4) = ".csv" Or Right(Wb.Name, 4) = ".CSV" Then
If Fichier = "" Then
MsgBox "OuvreCSV"
Fichier = Wb.Name
End If
End If
End Sub

Private Sub AppXl_WorkbookBeforeClose(ByVal Wb As
Excel.Workbook, Cancel As Boolean)
If Wb.Name = Fichier Then Fichier = ""
End Sub

[Pour info, le curseur est positionné à droite de la ligne:
Private Sub AppXl_WorkbookActivate(ByVal Wb As]


- Affiche un message (pop-up) Microsoft Visual Basic:
Erreur de compilation:
Attendu: nom de type

- Lorsque je valide ce message (je n'ai pas le choix ...), et que je
ferme l'éditeur VB, je découvre la feuille essai_eric.csv ouverte

si je demande l'exécution de ma macro OuvreCSV, je génère la même
séquence que ci-dessus.

Serait-ce donc dans ma macro qu'il y a une bourde ?
A tout hasard, la voici:
Sub OuvreCSV()
'
' OuvreCSV Macro
' Macro enregistrée le 11/02/2004 par touqip
'
' Touche de raccourci du clavier: Ctrl+o
'
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"),
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
Range("A1").Select
Selection.CurrentRegion.Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
Columns("A:A").EntireColumn.AutoFit
Range("A1").Select
End Sub

Elle est sensé convertir les données, faire le bordurage, et optimiser
la largeur des colonnes


Désolé pour la taille du post, et bon courage!
Cordialement,
Eric

PS: je n'avais jamais vu XL sous cet angle-là. Impressionnant!
Avatar
Chris MICHEL
salut!

On peut dire que ce truc nous donne du fil à retordre!!

Ton premier problème est simple: c'est encore une histoire
de casse de ligne. Il ne faut pas passer à la ligne après
byval wb as (là où le curseur se positionne), ilfaut donc
que tu ramènes la ligne de code suivante dans la ligne du
dessus.

Ensuite, il ne faut pas mettre msgbox "OuvreCsv" mais
OuvreCsv tout simplement. Je t'explique: msgbox est une
fonction simple de visual basic afficant un petit message
dans une boite de dialogue. Beaucoup de gens sur le forum
l'utilise comme un petit moyen de test (tu lances ta macro
et tu vois si le petit message s'affiche, ce qui veut dire
qu'a priori, le fichier fait ce que tu veux). ce petit
msgbox est là pour indiquer ou mettre le code lançant ta
macro.

Quant au bug de ta macro il est dû au fait qu'Excel essaie
d'abord de compiler la classe qui bugge avant de lancer la
macro. Ca devrait donc s'arranger si tu corriges ton
module de classe.

Chris.
-----Message d'origine-----
Bonjour,

J'ai l'impression d'avoir respecté à la lettre ta
prescription, mais çà

ne fonctionne pas.

Un double-clic sur le fichier essai_eric.csv:
- ouvre XL (j'ai pas tout perdu!),
- ouvre Microsoft Visual basic - PERSO.XLS - [Classe1
(Code)], avec le

code suivant :
Public WithEvents AppXl As Application
'code de F. Sigonneau et A. Cros
Private Fichier$

Private Sub AppXl_WorkbookActivate(ByVal Wb As
Excel.Workbook)
If Right(Wb.Name, 4) = ".csv" Or Right(Wb.Name, 4)
= ".CSV" Then

If Fichier = "" Then
MsgBox "OuvreCSV"
Fichier = Wb.Name
End If
End If
End Sub

Private Sub AppXl_WorkbookBeforeClose(ByVal Wb As
Excel.Workbook, Cancel As Boolean)
If Wb.Name = Fichier Then Fichier = ""
End Sub

[Pour info, le curseur est positionné à droite de la
ligne:

Private Sub AppXl_WorkbookActivate(ByVal Wb As]


- Affiche un message (pop-up) Microsoft Visual Basic:
Erreur de compilation:
Attendu: nom de type

- Lorsque je valide ce message (je n'ai pas le
choix ...), et que je

ferme l'éditeur VB, je découvre la feuille essai_eric.csv
ouverte


si je demande l'exécution de ma macro OuvreCSV, je génère
la même

séquence que ci-dessus.

Serait-ce donc dans ma macro qu'il y a une bourde ?
A tout hasard, la voici:
Sub OuvreCSV()
'
' OuvreCSV Macro
' Macro enregistrée le 11/02/2004 par touqip
'
' Touche de raccourci du clavier: Ctrl+o
'
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"),
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote,
ConsecutiveDelimiter:úlse,

Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse,
Other:úlse,

FieldInfo _
:=Array(Array(1, 1), Array(2, 1)),
TrailingMinusNumbers:=True

Range("A1").Select
Selection.CurrentRegion.Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
Columns("A:A").EntireColumn.AutoFit
Range("A1").Select
End Sub

Elle est sensé convertir les données, faire le bordurage,
et optimiser

la largeur des colonnes


Désolé pour la taille du post, et bon courage!
Cordialement,
Eric

PS: je n'avais jamais vu XL sous cet angle-là.
Impressionnant!


.



Avatar
EricP
Salut!
Toujours fidèle au poste? J'apprécie beaucoup.

Donc, j'ai supprimé le casse de ligne et remplacé
msgbox "OuvreCSV" par OuvreCSV

Maintenant, le double-clic sur le fichier csv génère un message:
erreur de compilation
type défini par l'utilisateur non défini

et, dans le ThisWorkbook de VBAProject(PERSO.XLS), le texte
"MonXL As New ExcelPerso" de la 1ère instruction est en surtbrillance

On ne doit plus être loin du but, mais j'ai encore besoin de ton aide.

Cordialement,
Eric
Avatar
Chris MICHEL
C'est que j'y ai passé du temps sur ce truc, j'ai envie
que ça marche!!

Bon, à mon avis, c'est que le module de classe ne porte
pas le bon nom. Sans aller trop loin dans les principes de
programmation (je ne suis pas informaticien, je ne veux
pas dire d'anerie), le module de classe sert à définir un
nouveau type d'objet (ExcelPerso) qui a des fonctions qui
lui sont spécifiques. Ensuite, le code déclare que le
fichier que tu ouvres est un Excelperso pour pouvoir
utiliser les dites foncions spécifiques. si ta classe ne
porte pas le même nom que le truc que tu déclares dans ton
code, Excel ne comprend pas ce que tu déclares et plante
(à la relecture, ce que je viens d'écrire n'est pas d'une
clarté hallucinante mais bon...).

Vérifie bien donc que le nom de ton module de classe est
ExcelPerso et pas classe1 ou je ne sais quoi.

Pour plus de simplicité, voici mon mail au boulot:
christophe.michel @ metro.fr
(supprime les espaces dans l'adresse ci-dessus).

Chris.

-----Message d'origine-----
Salut!
Toujours fidèle au poste? J'apprécie beaucoup.

Donc, j'ai supprimé le casse de ligne et remplacé
msgbox "OuvreCSV" par OuvreCSV

Maintenant, le double-clic sur le fichier csv génère un
message:

erreur de compilation
type défini par l'utilisateur non défini

et, dans le ThisWorkbook de VBAProject(PERSO.XLS), le
texte

"MonXL As New ExcelPerso" de la 1ère instruction est en
surtbrillance


On ne doit plus être loin du but, mais j'ai encore besoin
de ton aide.


Cordialement,
Eric

.



1 2