Se connecter avec
S'enregistrer | Connectez-vous

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

Dernière réponse : dans Programmation

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

Lassé par la pub ? Créez un compte
Expert Programmation

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 Monde de Windows 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.
zeb a édité ce message

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

  1. Private Sub CommandButton4_Click()
  2. openfile = Application.Dialogs(xlDialogOpen).Show("*.dat")
  3. 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 ?
Philou250 a édité ce message
Expert Programmation

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 ?

.... ;) 

Je n'y avais pas pensé ^^

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

  1. Private Sub CommandButton4_Click()
  2. Workbooks.OpenText Filename:= _ "O:\bigblue\01- Suivi Banc mpass\Data\data 2 mgL\070906-01.DAT", Origin:=437 _
  3. , StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
  4. ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=True, _ Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1)), _ DecimalSeparator:=".", ThousandsSeparator:=",", TrailingMinusNumbers:= _
  5. True
  6. Worksheets("070906-01_").Activate
  7. Cells.Select
  8. Selection.Copy
  9. Windows("Rapport Multipass 2004 MàJ 2011").Activate
  10. Range("A1").Select
  11. ActiveSheet.Paste
  12. Windows("070906-01").Activate
  13. ActiveWindow.Close
  14. 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 ?

Philou250 a édité ce message
Expert Programmation

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 :

  1. '// Pas bon
  2.  
  3. '// Tu sélectionnes toutes les cellules (de quelle feuille ?)
  4. Cells.Select
  5.  
  6. '// Tu copies la sélection dans le presse-papier
  7. Selection.Copy
  8.  
  9. '// Tu choisis une autre fenêtre (!) que tu actives
  10. Windows("Rapport Multipass 2004 MàJ 2011").Activate
  11.  
  12. '// Tu choisis une cellule de la feuille active (et si entre temps elle a changé ?)
  13. Range("A1").Select
  14.  
  15. '// Tu colles dans la feuille active
  16. ActiveSheet.Paste


  1. '// BON (ou presque)
  2.  
  3. ' // Soit les feuilles de départ et d'arrivée.
  4.  
  5. Dim wb_Data As Workbook
  6. Dim ws_Data As Worksheet
  7. Dim ws_Rapport As Worksheet
  8.  
  9. Set wb_Data = Workbooks.OpenText(Filename:="O:\bigblue\01- Suivi Banc mpass\Data\data 2 mgL\070906-01.DAT", .....)
  10. Set ws_Data = wb_Data.Worksheets(1) ' // Facile, il ne devrait y en avoir qu'une.
  11. Set ws_Rapport = Me '// ça, ça vaut si le bouton est dans la feuille vers lquelle tu veux copier.
  12.  
  13. 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 :
  1. Workbooks.OpenText Filename:="O:\bigblue\01- Suivi Banc mpass\Data\data 2 mgL\070906-01.DAT", .....
  2. Set wb_Data = Workbooks(Workbooks.Count)
zeb a édité ce message

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

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

  1. Private Sub CommandButton4_Click()
  2. Dim wb_Data As Workbook
  3. Dim ws_Data As Worksheet
  4. Dim ws_Rapport As Worksheet
  5. set wb_Data =Workbooks.OpenText Filename:="O:\bigblue\01- Suivi Banc mpass\Data\data 2 mgL\070906-01.DAT"
  6. Set ws_Data = wb_Data.Worksheets(1)
  7. Set ws_Rapport = Me
  8. ws_Data.Copy Destination:=ws_Rapport.Range("A1")
  9. 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 :

  1. Dim wb_Data As Workbook
  2. Dim ws_Data As Worksheet
  3. Dim ws_Rapport As Worksheet
  4. openfile = Application.Dialogs(xlDialogOpen).Show("*.dat")
  5. Set wb_Data = Workbooks(Workbooks.Count)
  6. Set ws_Data = wb_Data.Worksheets(1)
  7. Set ws_Rapport = Me
  8. ws_Data.Copy
  9. ws_Rapport.range("A1").pastespecial
  10. 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.
Philou250 a édité ce message
Expert Programmation

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à :??:  )

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

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

  1. Dim wb_Data As Workbook
  2. Dim ws_Data As Worksheet
  3. Dim ws_Rapport As Worksheet
  4. openfile = Application.Dialogs(xlDialogOpen).Show("*.dat")
  5. Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
  6. TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
  7. Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
  8. :=Array(1, 1), DecimalSeparator:=".", TrailingMinusNumbers:=True
  9.  
  10. Set wb_Data = Workbooks(Workbooks.Count)
  11. Set ws_Data = wb_Data.Worksheets(1)
  12. Set ws_Rapport = Me
  13. ws_Data.Cells.Copy ws_Rapport.Range("A1")
  14. wb_Data.Close savechanges:=False 'Ferme le workbook qui contient les données brutes
  15. ws_Data.Activate 'Affiche le workbook qui traite les données
  16. endsub


Normalement tu devrais moins râler :D 
Philou250 a édité ce message
Expert Programmation

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
  1. ' Pas bon :(
  2. ActiveWindow.Close savechanges:=False
par
  1. ' Ok !
  2. 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 :
  1. ' Pas bon :(
  2. Windows("Rapport Multipass 2004 MàJ 2011.xlsm").Activate
  3.  
  4. ' Ok !
  5. ws_Data.Activate


Et voilà !
Lassé par la pub ? Créez un compte