Problème avec Excel

Problème avec Excel - VB/VBA/VBS - Programmation

Marsh Posté le 23-06-2006 à 15:01:02    

Hello à tous!!
 
Mon problème est le suivant:
 
J'importe des données excel provenant de plusieurs classeurs sur un "méta-classeur" (on dira ça comme ça), pour cela, j'utilise sous excel la fonction d'import de données. Malheureusement lors de cette même importation j'ai des champs qui ne sont tout bonnements pas importés.
Si je poste dans cette section, c'est que les champs incriminés dans le problème, font l'objet de traitement par des macros. Cependant ils sont présents "physiquement" dans mes petits classeurs, sur une feuille de données.
 
Quelqu'un voit-il une solution à mon pb???

Reply

Marsh Posté le 23-06-2006 à 15:01:02   

Reply

Marsh Posté le 23-06-2006 à 15:03:43    

les macros en question, elles travaillent de quelle manière sur tes champs ?
n'est-ce pas une histoire de valeur stockée en dur qui fait tout foirer ?

Reply

Marsh Posté le 23-06-2006 à 15:15:47    

Ben ces valeurs sont récupérées sur un masque de saisie, j'ai 3 champs que l'on rempli (numériquement), après on valide l'enregistrement et les données sont foutues dans la feuille qui fait office de base temp.
Cependant il y a un 4° champ qui lui revient progressivement à zéro en fonction des chiffres tapées dans les 3 autres champs numériques.
 
edit: J'espère être assez clair


Message édité par nexius26 le 23-06-2006 à 15:16:23
Reply

Marsh Posté le 23-06-2006 à 16:35:48    

as tu fait copie avec lin tout symplement

Reply

Marsh Posté le 23-06-2006 à 16:41:08    

plein de faute de frappe  excuse  je recommence
 
as tu fais apres copie de ton fichier  edition collagespecial avec liaison
 
cela evitera peu etre une macro inutile

Reply

Marsh Posté le 23-06-2006 à 17:44:41    

Ben il se trouve qu'en changeant de PC (et aussi de version d'office) je trouve mes données qui sont ignorées sur le pc qui doit en principe recueillir tout le bordel.
@ vicray
 Ta solution semble intéressante mais il faudrait que je crée une autre macro car mon "meta-classeur va chercher 17 fichiers excel qui sont mis à jour hebdomadairement et si sur chaque feuille faut faire la copie avec liaison (je n'y avais pas du tout pensé), ça va être long et super pénible et on veut justement que ça soit rapide et automatique...
Donc je vais laisser tel quel mais sur une autre version office.
 
Tot cas merci à tou :jap:

Reply

Marsh Posté le 23-06-2006 à 18:05:19    

Pour la lecture des données il existe ExecuteExcel4Macro(argument) qui permet de lire des données dans des classeurs excel fermés

Reply

Marsh Posté le 23-06-2006 à 18:16:04    

Ouais j'avais essayé pendant un petit moment avec cette fonction, j'avais retrouvé des vieux post sur le forum mais j'y arrivais pas...
Et en fait il y a tellement de données qu'un macro c'est trop long comparé à cette requête qui me ramène tout en 20 secondes.
A terme je vais avoir 17classeurs*20champs*X000données=bcp d'infos trop lourdes pour ce pauvre excel

Reply

Marsh Posté le 24-06-2006 à 01:20:32    

Benchmark sur la lecture de 6 valeurs dans 200 fichiers
 
           ExecuteExcel4Macro             1.6 s
           ADO  Requête Sql               11.5 s      
           VBA "conventionnel "        242.0 s

Message cité 1 fois
Message édité par kiki29 le 24-06-2006 à 05:02:07
Reply

Marsh Posté le 27-06-2006 à 10:09:26    

kiki29 a écrit :

Benchmark sur la lecture de 6 valeurs dans 200 fichiers
 
           ExecuteExcel4Macro             1.6 s
           ADO  Requête Sql               11.5 s      
           VBA "conventionnel "        242.0 s


 
arf!!!!
 
Le problème c'est que j'ai passé un petit moment sur cette fonction et que j'ai rien capté! (mais rien)
 
et puis bon ma solution n'est que 7 fois plus lente....... :sweat:  :sweat:  
 
aurais tu des fois un petit bout de code avec quelques commentaires pour réessayer de comprendre cette fonction??
 
Thx Kiki29 je crois que tu est vraiment le pro de l'import Excel-> access sur HFR  :sol:

Reply

Marsh Posté le 27-06-2006 à 10:09:26   

Reply

Marsh Posté le 27-06-2006 à 14:24:36    

hello
 
parfois de faire des macro ne fais que alourdi le fichier et la memoire  alors (meme si c'est un peu long) je  pense que copie avec lien (a condition de ne pas modifier le nom n'y le format des fichiers sources ),fais 1 fois et chose que je pratique au boulot ,tableaux graphique ecttt  avec un trenteine voir plus de lien via reseau ne pose pas de soucis de mise a jour...
 
a+

Reply

Marsh Posté le 27-06-2006 à 16:46:49    

voir post du 15/05 à 21:13
http://forum.hardware.fr/hardwaref [...] 0232-1.htm

Message cité 1 fois
Message édité par kiki29 le 27-06-2006 à 16:47:44
Reply

Marsh Posté le 27-06-2006 à 18:16:21    


 
[mode coupe du monde on]
 
Thx, si la france perd je regarderai ton code et je te tiens au jus pour te dire si je comprends
 
[mode coupe du monde off]


Message édité par nexius26 le 27-06-2006 à 18:17:36
Reply

Marsh Posté le 29-06-2006 à 11:46:51    

Bon alors j'ai regardé et j'ai réussi à faire la fonction.
 
Résultat: c'est trop long, j'ai importé (que) 20 000 il ma fallu 20 minutes, c'est pas possible je dois etre amené à en recevoir quasi hedomadairement 39000 lignes * 65 colonnes et des brouettes
 
Pour ceux à qui ca plait ils peuvent calculer le temps nécessaire, c'est assez colossal

Reply

Marsh Posté le 29-06-2006 à 11:51:40    

et  si l'importation était automatisée via une commande shell, pendant la nuit ?

Reply

Marsh Posté le 29-06-2006 à 12:05:49    

Ca va devoir tourner sur un PC portable....alors no serveur, c'est pas moi qui décide. Et puis je suis pas sur que la nuit suffise!!!
 
Donc les requêtes me semblent très bien


Message édité par nexius26 le 29-06-2006 à 12:06:41
Reply

Marsh Posté le 29-06-2006 à 16:23:19    

Par curiosité j'ai créé un fichier Excel de 65 colonnes x 39000 lignes  
contenant des nombres et qui pèse autour de 16 Mo
J'ai fait un test en utilisant Delphi7 + Composant Lisant/Ecrivant  
des fichiers Excel natifs. Delphi permet de créer des exé autonomes.
 
La lecture des données du fichier Excel vers une grille prend 17 s  
par contre la retranscription de la grille vers un fichier Excel est trop lente
mais cette grille peut être sauvée en texte tabulé ( en 8 s )  
et le réimport de texte tabulé dans Excel ne pose aucun problème

Reply

Marsh Posté le 29-06-2006 à 17:30:19    

kiki29 a écrit :

Par curiosité j'ai créé un fichier Excel de 65 colonnes x 39000 lignes  
contenant des nombres et qui pèse autour de 16 Mo
J'ai fait un test en utilisant Delphi7 + Composant Lisant/Ecrivant  
des fichiers Excel natifs. Delphi permet de créer des exé autonomes.
 
La lecture des données du fichier Excel vers une grille prend 17 s  
par contre la retranscription de la grille vers un fichier Excel est trop lente
mais cette grille peut être sauvée en texte tabulé ( en 8 s )  
et le réimport de texte tabulé dans Excel ne pose aucun problème


 
Ben moi au final j'ai 39000 lignes divisées dans 18 fichiers Excel, et la rapatriement prend un temps énorme
 
Parce que ma macro est une macro sous excel donc là je comprends pas trop le delphi et puis je comprends plus rien jusqu'à la fin (si je comprends que c'est visiblement plus court). Parce que niveau prog je suis pas allé loin, me suis arrété au VB VBA

Reply

Marsh Posté le 29-06-2006 à 19:46:51    

l'exe lit maintenant n fichiers, si cela t'intéresse je peux te zipper cet exe pour voir et te laisser juge. Prends contact en MP

Message cité 1 fois
Message édité par kiki29 le 06-01-2007 à 06:43:49
Reply

Marsh Posté le 30-06-2006 à 01:51:26    

Suite et Fin ?
Sur un test Delphi+Composant Excel sur 18 fichiers Excel ( environ 20 Mo) de données
avec un paramétrage réglé par défaut à 65 Colonnes x 4000 Lignes pour chaque fichier,  
ce qui fait 72000 Lignes à lire, et 45374 rééllement utiles  
et enregistrées dans un fichier en texte tabulé  
en environ 32 s pour 13 Mo

Message cité 1 fois
Message édité par kiki29 le 01-07-2006 à 04:00:47
Reply

Marsh Posté le 01-07-2006 à 01:52:51    

Mon exe tourne correctement qq soit le nb de colonnes ou lignes des n fichiers Excel ( nb colonnes et lignes peuvent varier d'un fichier à l'autre)  
cela dans un temps correct sans charger le systeme.  
Ici effectivement la solution VBA ne semble pas la bonne vu le volume de données , le composant que j'ai utilisé n'existe pas pour VB6.
 
Test sur 18 fichiers (20 mo)  au final  45368 lignes (2974965 cellules) traités en 22s
Il n'y plus qu'a importer le fichier texte tabulé résultant dans Excel
 
Un exé autonome est dispo si tu veux le tester en situation réelle ?
l'installation est minimaliste il suffit de placer l'exé dans un dossier, les qqs parametres nécessaires sont sauvés au même niveau dans un fichier ini ,rien n'est inscrit dans la base de registre.

Message cité 1 fois
Message édité par kiki29 le 01-07-2006 à 15:24:31
Reply

Marsh Posté le 01-07-2006 à 18:11:09    

kiki29 a écrit :

l'exe lit maintenant n fichiers, si cela t'intéresse je peux te zipper cet exe pour voir et te laisser juge. Prends contact à phlh29@wanadoo.fr


 
Oui ça m'intéresse, je vais prendre contact
 

kiki29 a écrit :

Suite et Fin ?
Sur un test Delphi+Composant Excel sur 18 fichiers Excel ( environ 20 Mo) de données
avec un paramétrage réglé par défaut à 65 Colonnes x 4000 Lignes pour chaque fichier,  
ce qui fait 72000 Lignes à lire, et 45374 rééllement utiles  
et enregistrées dans un fichier en texte tabulé  
en environ 32 s pour 13 Mo


 
La seule vraiable qui change dans l'import c'est le nombre de lignes qui s'incrémentent, le nombre de colonnes reste inchangé
 

kiki29 a écrit :

Mon exe tourne correctement qq soit le nb de colonnes ou lignes des n fichiers Excel ( nb colonnes et lignes peuvent varier d'un fichier à l'autre)  
cela dans un temps correct sans charger le systeme.  
Ici effectivement la solution VBA ne semble pas la bonne vu le volume de données , le composant que j'ai utilisé n'existe pas pour VB6.
 
Test sur 18 fichiers (20 mo)  au final  45368 lignes (2974965 cellules) traités en 22s
Il n'y plus qu'a importer le fichier texte tabulé résultant dans Excel
 
Un exé autonome est dispo si tu veux le tester en situation réelle ?
l'installation est minimaliste il suffit de placer l'exé dans un dossier, les qqs parametres nécessaires sont sauvés au même niveau dans un fichier ini ,rien n'est inscrit dans la base de registre.


 
Pfiouuuuu..... :heink:  
Oui ok ça me semble jouable, donc je vais prendre contact avec toi pour récupérer l'exé et je testerai ça lundi, je te tiens au jus,
 
petit hors sujet: tu pourrais presque faire un tuto pour l'export Excel-->Excel  
 
bon week end  :hello:

Reply

Marsh Posté le 19-07-2006 à 07:05:08    

l'exé autonome ( Xls2Tab ) est téléchargeable sur http://www.fobec.com/CMS/blog.php?_id=7
Il supprime les caractères indésirables : espaces debut/fin,espaces surnuméraires,caractères non imprimables, chr(160) etc. et génère un fichier texte tabulé final et/ou Excel ( réparti sur plusieurs feuilles si Nb Lignes > 65536 )


Message édité par kiki29 le 18-07-2010 à 15:50:49
Reply

Marsh Posté le 20-07-2006 à 11:01:44    

Version XL ( sans suppression des caractères indésirables )
Outils | References Cocher Microsoft ActiveX Data Objects 2.x Library
 
Adapter les 4 variables au contexte d'utilisation


Const Dossier As String = "C:\Transfert\Test\"
Const NomFeuille As String = "Test"
Const FichierRch As String = "Prod ## ## ##.xls"
Const Plage As String = "A1:BM5000"



Option Explicit
 
Dim NbFichiers As Integer
Const Dossier As String = "C:\Faq\FaqVba\Exemples\LectureDonnees\Ado\ADO\Test"
Const NomFeuille As String = "Feuil1"
Const Plage As String = "C6:G26"
Const FichierRch As String = "Classeur*.xls"
 
Sub LireDatas_Tst()
Dim NomFichier As String, Tableau As Variant
Dim Debut As Variant, r As Long
Dim i As Long, NumeroLigne As Long
 
    Application.StatusBar = ""
    Debut = Time()
 
    ShFichiers.Cells.Clear
    ListeFichiers Dossier
 
    Application.ScreenUpdating = False
    ShDatas.Cells.Clear
    NumeroLigne = 1: r = 1
    For i = 1 To NbFichiers
        NomFichier = Dossier & "\" & ShFichiers.Range("A" & NumeroLigne)
        LireDonnéesADO NomFichier, NomFeuille, Plage, Tableau
        With ShDatas
            .Range("A" & r, .Cells(r + UBound(Tableau, 1) - 1, _
                                   UBound(Tableau, 2))).Value = Tableau
            r = .Range("A65536" ).End(xlUp).Row + 1
        End With
        NumeroLigne = NumeroLigne + 1
        Application.StatusBar = i & " / " & NbFichiers
    Next
 
    ShDatas.Select
    Cells.Select
    Selection.Columns.AutoFit
    Range("C1" ).Select
 
    Application.StatusBar = "Terminé : " & Format((Time() - Debut) * 100000, "0.00" )
 
    Application.ScreenUpdating = True
End Sub
 
Private Sub ListeFichiers(ByVal NomDossierSource As String)
Dim NomFichier As String, TabFichiers() As String
Dim r As Long, i As Long
 
    If Right(NomDossierSource, 1) <> "\" Then _
       NomDossierSource = NomDossierSource & "\"
    NomFichier = Dir(NomDossierSource)
 
    Erase TabFichiers
    ShFichiers.Cells.Clear
    NbFichiers = 0
 
    Do While Len(NomFichier) > 0
        If UCase(NomFichier) Like UCase(FichierRch) Then
            NbFichiers = NbFichiers + 1
            ReDim Preserve TabFichiers(1 To NbFichiers)
            TabFichiers(NbFichiers) = NomFichier
        End If
        NomFichier = Dir()
    Loop
 
    r = 1
    If NbFichiers > 0 Then
        For i = 1 To UBound(TabFichiers)
            ShFichiers.Cells(r, 1) = TabFichiers(i)
            r = r + 1
        Next
    End If
End Sub
 
Sub LireDonnéesADO(ByVal Fichier As String, ByVal Feuille As String, _
                   ByVal Plage As String, ByRef TableauDatas As Variant)
Dim Conn As ADODB.Connection, Cmd As ADODB.Command
Dim Rs As ADODB.Recordset
Dim Ligne As Long, Colonne As Integer
 
    Set Conn = New ADODB.Connection
    Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
              "Data Source=" & Fichier & ";" & _
              "Extended Properties=""Excel 8.0;HDR=No;"";"
 
    Set Cmd = New ADODB.Command
    Cmd.ActiveConnection = Conn
    Cmd.CommandText = "SELECT * from `" & Feuille & "$" & Plage & "`"
 
    Set Rs = New ADODB.Recordset
    Rs.Open Cmd, , adOpenKeyset, adLockOptimistic
    ReDim TableauDatas(1 To Rs.RecordCount, 1 To Rs.Fields.Count)
 
    Rs.MoveFirst
    Do While Not Rs.EOF
        For Ligne = 1 To Rs.RecordCount
            For Colonne = 0 To Rs.Fields.Count - 1
                TableauDatas(Ligne, Colonne + 1) = Rs.Fields(Colonne).Value
            Next
            Rs.MoveNext
        Next
    Loop
 
    Conn.Close
    Set Rs = Nothing
    Set Cmd = Nothing
    Set Conn = Nothing
End Sub


Message édité par kiki29 le 10-03-2008 à 20:57:48
Reply

Marsh Posté le 21-07-2006 à 09:36:09    

Thanks mais le petit exé est vraiment super, je lui reste fidèle

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed