Pb d'import de données txt dans excel avec VBA. [VBA Excel] [Résolu] - VB/VBA/VBS - Programmation
Marsh Posté le 09-12-2004 à 10:26:57
Lorsque je vérifie les AddIns présents pour Excel sur les différents ordinateurs avec la fonction ci-dessous:
Code :
|
J'ai une différence d'AddIns.
Les AddIns suivants sont présents sur les ordis pour lesquels mon appli marche et absents sur les ordis qui ne peuvent pas faire fonctionner mon appli:
- ACCLINK.XLA
- XLQUERY.XLA
- XLODBC.XLA
- UPDTLINK.XLA
Apparemment, mon problème viendrait de cette absence de macros complémentaire. Y a t'il un moyen de vérifier si elles sont présentes et de lancer une installation dans le cas d'une absence.
Merci de vos réponses
Marsh Posté le 09-12-2004 à 13:13:57
Bon, apparemment, mon problème n'a pas l'air d'emballer les foules...
J'ai installé les macros complémentaires (XLQUERY.XLA et XLODBC.XLA)sur l'ordi qui ne veut pas exécuter ma macro d'importation d'importation de données texte.
Voici une partie du code d'importation où le problème (erreur 1004) se situe:
Code :
|
avec
Code :
|
Ma macro marche sur les ordis ayant EXCEL2000 mais pas sur EXCEL97, même avec les macros complémentaires installées.
Comment faire pour que ma macro soit utilisable sur office97 et office2000 ?
Je suis à cours d'idées et vous remercie de vos propositions.
Marsh Posté le 10-12-2004 à 10:14:19
Toujours dans mon problème, je suis sur Excel version 2000, apparemment pas complètement installé, mes macros ne peuvent même pas afficher une boîte de dialogue dans laquelle se trouve "chr(10)" qui est un saut de ligne.
Y a t'il quelqu'un qui sait pourquoi ? Apparemment, il n'a pas la librairie d'interprétation de cette fonction, quelle est cette librairie ou macro complémentaire ?
Un coup de pouce serait vraiment sympa. Merci.
Marsh Posté le 10-12-2004 à 11:06:28
tu veut dire qu'un simple :
MsgBox "xxx" & Chr(10) & "yyy"
ne marche pas ? quel est le message d'erreur ?
ca me semble etonnant si c'est le cas, a mon avis une réinstalle de Excel serait nécessaire.
Marsh Posté le 10-12-2004 à 11:31:12
je croit en plus que ta "connectionstring" n'est pas bonne, ca n'est pas juste le nom de fichier a mettre mais tout un tas de parametres.
Jette un coup d'oeil ici :
http://www.dotnet-fr.org/sections. [...] e&artid=59
Marsh Posté le 10-12-2004 à 13:43:56
Merci pour l'info.
J'ai essayé mais vba n'accepte pas "OleDbConnection", ce doit être du .Net... Je ne comprends pas pourquoi Excel97 bloque sur ma macro d'ouverture de fichier texte:
Code :
|
Excel bloque sur
Code :
|
et met une erreur d'exécution '1004'. J'ai pourtant compléter l'installation en mettant msquery...
Marsh Posté le 10-12-2004 à 13:57:49
la connection ne doit pas etre un nom de fichier mais une "connectionstring" comme celle-ci :
"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=c:\txtFilesFolder\;Extensions=asc,csv,tab,txt;"
tu trouvera ca ici :
http://www.connectionstrings.com/
Marsh Posté le 10-12-2004 à 14:39:01
Je n'ai pas du comprendre la philosophie de la connection à des données externes. J'ai fait ca:
Code :
|
et il bloque sur la ligne "With ActiveSheet", toujours avec l'erreur 1004.
J'ai des bouquins d'Excel 97 mais ceux-ci ne parlent pas de connectionString...
Marsh Posté le 12-12-2004 à 19:03:23
Je sèche vraiment sur ce problème.
Y a t'il quelqu'un qui a déjà réalisé une importation de données d'un fichier texte sous Excel97?
Merci, vraiment.
Marsh Posté le 14-12-2004 à 10:36:04
Toujours avec mes problèmes, je relance la discussion.
Sous NT4 et Excel 97 SR-2, je ne peux pas lancer ma macro d'importation de fichier texte mais également utiliser les fonctions "Chr(10)", "Right()" et "Left()".
Je pense que les deux problèmes sont liés mais je n'arrive pas à les résoudre.
Merci de vos réponses.
Marsh Posté le 14-12-2004 à 12:33:57
quels sont les characteres de separation utilisés dans ton fichier texte a importer ? si ca se trouve ,une simple importation suffirait...
Marsh Posté le 14-12-2004 à 12:50:41
Le carctère de séparation est le ";". Le fichier est construit de la façon suivante:
Code :
|
J'ai une macro d'importation du fichier texte qui marche sous EXCEL2000, pas tous et je ne sais pas pourquoi et sous EXCEL2002.
Je l'ai construite à partir de l'enregistreur de macro et je l'ai adaptée.
Elle ne marche pas sous EXCEL97, et je ne peux pas utiliser l'enregistreur car EXCEL ne permet pas d'importer un fichier (Menu "Données", "Données externes", "Importer un fichier Texte" ).
Je viens de voir une petite appli de @+Thierry sur ce site http://www.excel-downloads.com/htm [...] _44174.htm.
Apparemment, l'importation est vraiment différente pour EXCEL97.
Je suis en train de voir si je peux adapter sa macro pour le séparateur ";".
Marsh Posté le 14-12-2004 à 13:55:09
J'ai un gros problème. J'ai essayé d'adapté la macro trouvée et réalisée par @+Thierry (merci à lui) et voici ce que cela donne:
Code :
|
Mais lorsque je la lance, Excel ne veut même pas commencer d'exécuter la macro et reste bloqué sur la fonction "Mid". Il doit manquer une librairie pour Excel, et c'est sur tous les postes pareil.
Comment faire à part une réinstalle de tous les postes ?
Marsh Posté le 14-12-2004 à 13:59:58
Ben la fonction Mid est une fonction de VBA, même avec aucune librairie elle fonctionnera, vu qu'elle fait partie du langage...
Marsh Posté le 14-12-2004 à 14:04:43
la fonction mid comme la fonction chr ne marchent pas et je ne sais pas pourquoi ? Ca me bloque toutes mes macros...
Marsh Posté le 14-12-2004 à 14:07:42
Ah... Peut-être qu'il faut quand-même rajouter une référence, genre à VBA...
Marsh Posté le 14-12-2004 à 14:14:39
Dans "Outils" ==> "Références" ?
J'ai Visual Basic for Application de coché et d'autres trucs mais il existe 2 VBAProject non cochés. C'est peut être là que viens mon problème.
Et quel est le moyen de vérifier si le poste à bien les références nécessaires à l'exécution de l'appli ?
Marsh Posté le 14-12-2004 à 14:22:26
Normalement seul Visual Basic for Application est nécessaire...
Marsh Posté le 14-12-2004 à 14:29:25
Cette référence est cochée mais mon appli ne fonctionne pas. Ne faut il pas une autre librairie. Je viens de remarquer que la fonction Time ne fonctionne également pas...
Marsh Posté le 14-12-2004 à 15:15:16
si tes characteres de separation sont des ";" alors ton fichier doit etre importé en tant que fichier CSV ( ce que EXCEL97 est incapable de faire ... )
Marsh Posté le 14-12-2004 à 15:44:53
Merci Gargamail.
J'ai regardé mes références et j'ai Microsoft Excel 8.0 Object Library au lieu de 9.0. De même pour Office.
Pour mon import de fichier texte, j'arrive à ouvrir un fichier txt (avec séparateur ";" ) en tant que nouveau classeur sans problème de mise en forme.
Je devrai donc passer par l'ouverture du fichier texte en tant que classeur, copier ce qui se trouve sur la seule feuille et coller dans mon classeur.
Je me résigne à faire cela pour contourner les problèmes.
Marsh Posté le 14-12-2004 à 15:46:07
Si t'as 8.0 dans tes références, c'est juste que t'as une version plus ancienne de gargamail. Maintenant ça ne devrait rien changer au schmilblick...
Marsh Posté le 14-12-2004 à 15:51:47
Oui, tout à fait, d'où mon incompréhension grandissante sur les lois de fonctionnement d'Excel et des compatibilité des différentes versions Office et Windows.
Marsh Posté le 14-12-2004 à 18:47:54
1 - est ce que MID est bien dans ton "explorateur d'objets" ?
2 - est ce que tu as l'aide pour les parametres qui s'affiche quand tu tape mid ?
PS : essaye avec MID$
Marsh Posté le 15-12-2004 à 08:52:43
gargamail a écrit : 1 - est ce que MID est bien dans ton "explorateur d'objets" ? |
Mid et Mid$ sont bien dans mon explorateur d'objet en tant que membre de la classe String. (Left, Right et Time qui me posent également problème n'y sont pas)
gargamail a écrit : |
Je n'ai pas d'aide pour les paramètres qui apparaît lorsque je tape Mid ou Mid$.
De plus, lorsque je lance la macro depuis VBE, il me dit qu'il y a une "Erreur de compilation : Projet ou bibliothèque introuvable."
PS: que c'est il passé hier soir, impossible de se connecter au forum...
Marsh Posté le 15-12-2004 à 09:41:31
Je suis en train de modifier ma macro d'insertion de données texte. La macro essaie une insertion "classique" et si cela ne marche pas (on error goto...) je fais une ouverture du fichier texte par excel.
Je récupère le fichier avec ce code :
Code :
|
Mais lorsque je veux ouvrir le fichier avec ce code :
Code :
|
Je ne peux pas utiliser de .Path et de .Name à une variable String.
Faut il que je récupère à la main le nom du fichier et son chemin ou y a t'il un autre moyen de le récupérer à l'aide d'une fonction ?
Il me semble que GetOpenFilename ne peut renvoyer que des variables String...
Marsh Posté le 15-12-2004 à 12:25:44
la fonction GetOpenFileName te renvoie le nom du fichier , chemin y compris ( "C:\Program Files\A.txt" par exemple )
Tu n'a pas nécessité de faire un ChDir ni d'ajouter la propriété NAME avec le nomFichier renvoyé, utilise simplement :
Code :
|
Marsh Posté le 15-12-2004 à 13:12:07
Je te remercie, j'ai utilisé ce que tu m'as donné.
Ma macro fonctionne mais je suis obligé de chercher le nom du fichier texte ouvert car si je copie les données du fichier texte (ouvert par Excel), si je ferme ce fichier et si ensuite je colle les données sur mon appli, les données ne gardent pas le même format et des chiffres sont remplacés par des rectangles.
Les données importées doivent avoir un poids trop grand (jusqu'à une taille de 2Mo pour les fichiers texte).
Par contre, si je copie et si je colle les données ensuite et enfin je ferme le fichier Excel intermédiaire, il n'y a aucun problème.
Il a donc fallu que je trouve le nom du fichier pour fermer le classeur correspondant.
Je vais mettre ma macro sur le forum pour ceux qui veulent.
Merci à ceux qui m'ont aidé.
Marsh Posté le 15-12-2004 à 13:45:34
Donc voici ma macro d'importation de données d'un fichier txt qui marche d'Office97 installé sur NT4 (là où il y avait un problème) à OfficeXP sur Windows XP.
L'importation est toutefois plus longue en passant par un classeur intermédiaire.
Sub ImportDonnees()
'Variable stockant le nom du classeur
Dim nomClasseur As String
nomClasseur = ActiveWorkbook.Name
'Variable stockant le nom de la feuille où devront se trouver les données à importer
Dim feuilImport As String
feuilImport = "mafeuille"
'Variable stockant le nom du fichier à ouvrir
Dim fichier As String
'Retour possible pour choisir de nouveau un fichier
choixFichierTexte:
'Choix d'un fichier texte
fichier = Application.GetOpenFilename("Text Files (*.txt), *.txt" )
'Si aucun fichier est choisi
If Left(fichier, 4) = "Faux" Then
GoTo pasDeFichierTexte
End If
'Variables de lancement du traitement
Dim message As Integer
'Boite de dialogue de lancement du traitement
message = MsgBox("Vous êtes sur le point d'importer le fichier :" & Chr(10) & Chr(10) & fichier & Chr(10) & Chr(10) & "Le traitement peut prendre quelques secondes et laissera votre écran fixe." & Chr(10) & Chr(10) & "Pour importer ces données, appuyez sur " & Chr(34) & "OK" & Chr(34) & ", pour l'interrompre sur " & Chr(34) & "Annuler" & Chr(34) & ".", 1 + 64 + 256, "Importation de données" )
'Si "Annuler" de la boîte de dialogue a été cliqué, on interromp le traitement
If message = 2 Then
Exit Sub
End If
'Suppression des données se trouvant sur la feuille où devront se trouver les données
Worksheets(feuilImport).Select
Cells.Select
Selection.Delete Shift:=xlUp
Range("A1" ).Select
'Enlève l'apparition de boîte de dialogue
Application.DisplayAlerts = False
'Déclaration de variable
Dim fichier1 As String
'Ajout d'un élément texte au nom du fichier pour pouvoir exécuter la requête sur le fichier texte de données
fichier1 = "TEXT;" & fichier & ";"
'Formatage des données pour une bonne insertion des données dans les cellules
On Error GoTo ouvrirTexte
With ActiveSheet.QueryTables.Add(Connection:=fichier1, Destination:=Range("A1" ))
.FieldNames = True
....
End With
Resume
retourouvrirTexte:
'Sélection d'une cellule
Range("A1" ).Select
'Rétablit l'apparition de boîte de dialogue
Application.DisplayAlerts = True
'Avertissement pour l'utilisateur
MsgBox "Les données textes ont été importées.", vbOKOnly & vbInformation, "Importation des données"
Exit Sub
'Récupération de l'erreur de non sélection d'un fichier texte à ouvrir
pasDeFichierTexte:
'Variables de d'avertissement de la non sélection du fichier texte
Dim messageFichier As Integer
'Boite de dialogue de lancement du traitement
messageFichier = MsgBox("Vous n'avez pas sélectionner de fichier texte à ouvrir !" & Chr(10) & Chr(10) & "Voulez-vous importer des données de la banque HYDRO ?" & Chr(10) & Chr(10) & "Pour importer ces données, appuyez sur " & Chr(34) & "OK" & Chr(34) & ", pour l'interrompre sur " & Chr(34) & "Annuler" & Chr(34) & ".", 1 + 64 + 256, "Importation de données de la banque HYDRO" )
'Si "Annuler a été choisi, on interromp le traitement
If messageFichier = 2 Then
Exit Sub
End If
'Retour à la boîte de sélection de fichier texte
GoTo choixFichierTexte
ouvrirTexte:
'Variable stockant le nom du fichier
Dim nomFichier As String
'Variable compteur de lettre
Dim lettre As Integer
'Récupération du nom du fichier
Do While Left(Right(fichier, lettre), 1) <> "\"
nomFichier = Right(fichier, lettre)
lettre = lettre + 1
Loop
'Ouverture du fichier texte par Excel avec la mise en forme nécessaire
Workbooks.OpenText FileName:=fichier, Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier _
:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:= _
True, Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array( _
1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, _
1), Array(9, 1), Array(10, 1))
'Sélection des données et copie
Cells.Select
Selection.Copy
'Sélection du classeur, de la feuille et collage des données
Workbooks(nomClasseur).Activate
Worksheets(feuilImport).Select
Cells.Select
ActiveSheet.Paste
'Fermeture du classeur intermédiaire
Workbooks(nomFichier).Close
'Retour au traitement des données
GoTo retourouvrirTexte
End Sub
Marsh Posté le 08-12-2004 à 18:31:37
Salut tout le monde,
Je suis en train de réaliser une appli sur Excel et VBA pour gérer des données résultant d'une extraction d'une grosse base de données (plutôt très vieille).
Les données récupérées sont au format texte. J'ai réalisé une macro qui m'importe le ou les fichiers texte sans problème.
Je l'ai exécutée sur plusieurs PC, pas de problème mais vient un jour où je la lance sur un PC sur lequel je n'ai pas fait d'importation de fichier texte "à la main".
L'AddIns nécessaire à l'importation n'a donc pas été installé et je voudrais que mon appli puisse détecter si l'AddIns est installé et l'installer.
Le problème est que je ne connais pas le nom de cet AddIns. La fonction qui bogue est
et je pense que l'AddIns qui me manque est soit XLQUERY.xla, soit XLODBC.xla.
Or, j'ai fais une recherche d'un fichier xlodbc et xlquery sans succès.
Y a t'il quelqu'un qui a été confronté au problème ou qui connaît la solution ?
Merci de vos réponses.
edit: sujet résolu
Message édité par Manu la Science le 15-12-2004 à 13:48:02
---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...