Excel/VBA : Problème avec la fonction "remplacer" et d'importation de fichier

Philou250

Habitué
Bonjour,

1) Comme indiqué dans le titre j'ai un problème avec la fonction "remplacer" d'Excel. Je voudrais remplacer dans les nombres, les points par des virgules. Le souci est que, quand le nombre a plus de 6 chiffres, au lieu de remplacer le point par une virgule, il met un espace.

En gros Excel fait ça :
486.48 > 486,48 (Le nombre contient moins de 6 chiffres, c'est OK)
486.489 > 486 489 (6 chiffres : il considère que le point est un séparateur de millier)

La question est donc, comment faire pour qu'il remplace juste les points par des virgules au-delà de 6 chiffres ?

2) Le second problème qui me turlupine est que j'aimerais importer un fichier (.DAT) dans la feuille Excel qui est ouverte. Etant donné que l'on doit pouvoir choisir le fichier .DAT que l'on souhaite importer, la fonction "importer des données" ne me convient pas. J'ai essayé également de le faire par le biais "d'ouvrir", mais il me place le fichier dans une autre classeur.

Par exemple, je souhaiterais avoir un commandButton qui ouvre la fenêtre "ouvrir", on choisit le document et qu'Excel place le fichier choisit dans la feuille, ensuite d'autres feuilles dans ce classeur récupèrent les données pour effectuer des calculs. Est ce que c'est réalisable ?

J'espère que j'ai été clair.

Philou250

 

zeb

Modérateur
Salut,

Primo, pour tes petits problèmes d'Excel, tu vas aller lire la doc, ici on traite de choses sérieuses : de programmation :o
(Les gens du t'aideront à mettre en forme tes cellules.)

Secondo, ahhhh, enfin un peu de programmation :)

Pour accéder aux boîtes de dialogue d'Excel, c'est facile : utilise Application.Dialogs().
Evidemment, il faut préciser la boîte (il en existe au moins 250). Essaie avec xlDialogOpen par exemple.

Autre possibilité, utiliser Application.GetOpenFilename, ça peut être plus simple.
 

Philou250

Habitué
Donc si j'ai bien compris je dois taper ça :

Code:
Private Sub CommandButton4_Click()
openfile = Application.Dialogs(xlDialogOpen).Show("*.dat")
End Sub

Ce code m'ouvre bien un fichier, mais Excel me le place dans un autre classeur au lieu de me le mettre dans la feuille qui est censé recevoir le fichier.

Du coup est-il possible d'ouvrir un fichier et de le mettre dans une feuille spécifique dans un classeur ?
 

zeb

Modérateur
Ouvre le fichier .DAT, prends les données qui t'y intéressent et mets-les dans ton classeur, puis referme le fichier .DAT.
Il est où le problème ?
 

Philou250

Habitué
Il faudrait que ce soit "automatique". Car les personnes qui travaillent dessus ne veulent pas faire la manipulation à chaque fois.
 

zeb

Modérateur
Macro qui " Ouvre le fichier .DAT, prend les données qui t'y intéressent et les mette dans ton classeur, puis referme le fichier .DAT. "

Il est où le problème ?

.... ;)
 

Philou250

Habitué
Je n'y avais pas pensé ^^

Donc j'ai fais l'enregistreur de macro qui m'a donné ça :

Code:
Private Sub CommandButton4_Click()
Workbooks.OpenText Filename:= _ "O:\bigblue\01- Suivi Banc mpass\Data\data 2 mgL\070906-01.DAT", Origin:=437 _
, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=True, _ Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1)), _ DecimalSeparator:=".", ThousandsSeparator:=",", TrailingMinusNumbers:= _
True
Worksheets("070906-01_").Activate
    Cells.Select
    Selection.Copy
    Windows("Rapport Multipass 2004 MàJ 2011").Activate
    Range("A1").Select
    ActiveSheet.Paste
    Windows("070906-01").Activate
    ActiveWindow.Close
End Sub

1) Par contre, quand je lance la macro, ça bug. Apparamment ça serait à cause du Cells.select, pourquoi ?

2) Sinon y aurait t'il un moyen de remplacer le chemin "O:\bigblue\01- Suivi Banc mpass\Data\data 2 mgL\070906-01.DAT" par un chemin nom déterminé pour pouvoir choisir le fichier que l'on souhaite prendre ?

 

zeb

Modérateur
lol

Bon, on va commencer par la fin. Concernant le point 2. relis mon premier message, jusqu'à la fin !!!!!

Ensuite, il est où ton bouton ButtonCommand4 ?
Réponds-moi qu'il est dans une feuille du classeur Rapport Multipass 2004 MàJ 2011... :O .. :D

Bon, alors l'enregistreur de macro est gentil, mais il programme plus salement que toi - sauf que toi, tu as une excuse, tu es novice.
Alors on va le corriger. Pas le novice, n'aies crainte, le code de l'enregistreur.

Tout d'abord, on ne va plus JAMAIS considérer le moindre objet actif ou sélectionner. On va explicitement les nommer. Tu vas voir, ça va tout changer.
Ensuite, on ne va rien sélectionner sans en avoir besoin.
Enfin, on va respecter les données de l'utilisateur. Ce qui nous interdit de copier quoi que ce soit dans le presse-papier. (Imagine que tu aies fais une macro en Excel et une autre en Word pour tes utilisateurs. Si les deux fonctionnent en même temps et se servent du presse-papier comme variable temp'. T'imagine le bordel ??? :pt1cable: )

Regarde :

Code:
'// Pas bon

'// Tu sélectionnes toutes les cellules (de quelle feuille ?)
Cells.Select

'// Tu copies la sélection dans le presse-papier
Selection.Copy

'// Tu choisis une autre fenêtre (!) que tu actives
Windows("Rapport Multipass 2004 MàJ 2011").Activate

'// Tu choisis une cellule de la feuille active (et si entre temps elle a changé ?)
Range("A1").Select

'// Tu colles dans la feuille active
ActiveSheet.Paste

Code:
'// BON (ou presque)

' // Soit les feuilles de départ et d'arrivée.

Dim wb_Data    As Workbook
Dim ws_Data    As Worksheet
Dim ws_Rapport As Worksheet

Set wb_Data    = Workbooks.OpenText(Filename:="O:\bigblue\01- Suivi Banc mpass\Data\data 2 mgL\070906-01.DAT", .....)
Set ws_Data    = wb_Data.Worksheets(1) ' // Facile, il ne devrait y en avoir qu'une.
Set ws_Rapport = Me '// ça, ça vaut si le bouton est dans la feuille vers lquelle tu veux copier.

ws_Data.Copy Destination:=ws_Rapport.Range("A1")

Bon, c'est pas mal, sauf que les ingénieurs de Microsoft n'ont pas fini le boulot. Le modèle objet du VBA/Excel est inachevé. Ainsi, la méthode OpenText() ne renvoie pas le classeur ouvert. Pauv's types.
Donc la ligne 9 est boguée. Donc, on va ruser. Quand on ouvre un fichier dans un nouveau classeur Excel, il est le dernier des classeurs ouverts. Ainsi :
Code:
Workbooks.OpenText Filename:="O:\bigblue\01- Suivi Banc mpass\Data\data 2 mgL\070906-01.DAT", .....
Set wb_Data = Workbooks(Workbooks.Count)
 

Philou250

Habitué
Mon ButtonCommand4 est bien dans la feuille qui est sencée recevoir le fichier.

Donc j'ai écrit ça : (Si j'ai bien compris)

Code:
Private Sub CommandButton4_Click()
Dim wb_Data As Workbook
Dim ws_Data As Worksheet
Dim ws_Rapport As Worksheet
set wb_Data =Workbooks.OpenText Filename:="O:\bigblue\01- Suivi Banc mpass\Data\data 2 mgL\070906-01.DAT"
Set ws_Data = wb_Data.Worksheets(1)
Set ws_Rapport = Me
ws_Data.Copy Destination:=ws_Rapport.Range("A1")
End Sub

Mais quand je l'éxecute, Excel buterais sur le "Filename" et le "Destination" (Ils sont affiché en jaune après avoir cliqué sur debug).
(Peut être que ça ne marche pas car j'ai Microsoft Office 2007 et peut être que le VBA est différent entre les versions)

Du coup en spammant le bouton F1, j'ai essayé de comprendre quelques trucs et en essayant de remplacer le "Filename" et le "Destination" j'ai écrit ça :

Code:
Dim wb_Data As Workbook
Dim ws_Data As Worksheet
Dim ws_Rapport As Worksheet
openfile = Application.Dialogs(xlDialogOpen).Show("*.dat")
Set wb_Data = Workbooks(Workbooks.Count)
Set ws_Data = wb_Data.Worksheets(1)
Set ws_Rapport = Me
ws_Data.Copy
ws_Rapport.range("A1").pastespecial
End Sub

Evidemment ça ne marche pas ^^, il m'ouvre bien le fichier que je veux mais il ne me le place pas dans la bonne feuille, cependant il me copie le code VBA dans cette feuille ! Je suppose que c'est à cause du "PasteSpecial" mais je ne sais pas comment le remplacer.
 

zeb

Modérateur
Du bon et du mauvais.

Tu as lu mon message précédent jusqu'au bout ?????
Remplace la ligne 9 de mon code (c'est à la ligne 5 du tien) par les deux lignes ensuite proposées.

Quand ws_Data contiendra quelque chose, on pourra utilise Copy Destination:=

ET ARRETE DE CHERCHER A UTILISER LE PRESSE-PAPIER !!!!!!
(ça se voit que je m'énerve là :??: )
 

zeb

Modérateur
Je t'en prie.
Ose publier ton code, que ça serve à tout le monde.
(En espérant qu'il n'y reste rien de susceptible de m'énerver.... :D )
 

Philou250

Habitué
Si, tu vas râler si je le poste, nan je ne suis pas buté et borné ^^ si j'utilise le "copy&paste".
Je le poste quand même ? :whistle:
 

Philou250

Habitué
([Edit] Avec modifs demandées dans le message suivant)

Finalement je viens de réussir sans le Copy&Paste, donc voilà le code :

Code:
Dim wb_Data As Workbook
Dim ws_Data As Worksheet
Dim ws_Rapport As Worksheet
openfile = Application.Dialogs(xlDialogOpen).Show("*.dat")
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
            Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
            :=Array(1, 1), DecimalSeparator:=".", TrailingMinusNumbers:=True

Set wb_Data = Workbooks(Workbooks.Count)
Set ws_Data = wb_Data.Worksheets(1)
Set ws_Rapport = Me
ws_Data.Cells.Copy ws_Rapport.Range("A1") 
wb_Data.Close savechanges:=False 'Ferme le workbook qui contient les données brutes
ws_Data.Activate 'Affiche le workbook qui traite les données
endsub

Normalement tu devrais moins râler :D
 

zeb

Modérateur
Surtout ne JAMAIS utiliser les Windows. Il s'agit des vues sur un même classeur.
Ainsi, peux-tu voir un même classeur plusieurs fois dans une même session Excel.

Or tu ne cherches pas à fermer la fenêtre active sur tel classeur, mais bel et bien le classeur lui-même.

Alors tu vas remplacer
Code:
' Pas bon :(
ActiveWindow.Close savechanges:=False
par
Code:
' Ok !
wb_Data.Close savechanges:=False

Et la fenêtre qui traite les données est dans la variable ws_Rapport, alors on ne se fie pas au titre d'une fenêtre, mais à notre variable, s'il faut activer explicitement cette feuille :
Code:
' Pas bon :(
Windows("Rapport Multipass 2004 MàJ 2011.xlsm").Activate

' Ok !
ws_Data.Activate

Et voilà !
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 128
Messages
6 717 846
Membres
1 586 373
Dernier membre
https://forum.tomshardwar
Partager cette page
Haut