Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Importer données fichier fermé

vgendron

XLDnaute Barbatruc
Bonjour !

comme nombre d'entre nous, je souhaite copier coller des données de fichiers fermés vers le fichier actif

mes recherches m'ont amené à ce post:

j'ai adapté le code pour avoir le nombre de lignes de chaque fichier à importer, ainsi que les colonnes
VB:
Sub LireFichierFermé(xChemin, xFichier, xLig)
    On Error GoTo SiErreur
    Dim xTexte_SQL As String
    Dim xOnglet As String
    Dim xPlage As String
    Application.ScreenUpdating = False

    xOnglet = "Feuil1"
    
    'Connexion ADO
        Set Source = CreateObject("ADODB.Connection")
        'Avant XL 2007
            'Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;data source=" & xChemin & "\" & xFichier & ";Extended Properties=""Excel 8.0;HDR=No;"";"
        'Après XL 2007
            'Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & xChemin & "\" & xFichier & ";Extended Properties=""Excel 12.0;HDR=NO;"";"       'IMEX=1";
            Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & xChemin & "\" & xFichier & ";Extended Properties=""Excel 12.0;HDR=NO;IMEX=1"";"       'IMEX=1";
    
    'on prépare la Requette pour avoir la dernière ligne du fichier
    strQuery = "SELECT COUNT(*) FROM [" & xOnglet & "$]"
    Set Requete = Source.Execute(strQuery) 'on execute la requete
    derlign = Requete.Fields(0).Value + 1 'on récupère la dernière ligne
    
        'on peut donc définir les variables
        
        xPlage1 = "A6:B" & derlign
        xPlage2 = "D6:D" & derlign
        
    'Exerce la requete ADO sur les donnée à recopier
        xTexte_SQL = "SELECT * FROM [" & xOnglet & "$" & xPlage1 & "]"
        Set Requete = CreateObject("ADODB.Recordset")
        Set Requete = Source.Execute(xTexte_SQL)
    'Ecriture des données lues dans le fichier en cours
        ActiveSheet.Range("E" & xLig).CopyFromRecordset Requete
        
    'Exerce la requete ADO sur les donnée à recopier
        xTexte_SQL$ = "SELECT * FROM [" & xOnglet & "$" & xPlage2 & "]"
        Set Requete = CreateObject("ADODB.Recordset")
        Set Requete = Source.Execute(xTexte_SQL$)
    'Ecriture des données lues dans le fichier en cours
        ActiveSheet.Range("G" & xLig).CopyFromRecordset Requete
    'Ferme la requete
        Set Requete = Nothing
        Set Source = Nothing
        Application.ScreenUpdating = True
        Exit Sub
SiErreur:
        MsgBox "Pas de feuille ""Feuil1"" dans le fichier " & xFichier, vbExclamation
End Sub

ca fonctionne presque comme je veux: Ca n'importe que les données "numériques", et toutes les données alpha sont ignorées
apparemment l'argument "IMEX" est censé répondre au besoin.. sauf que. bah. ca ne fonctionne pas

sauriez vous m'aiguiller sur ce qui ne va pas?
notes: les fichiers sources sont générés automatiquement en amont==> impossible de modifier quoique ce soit, pas meme le format "standard" des colonnes


Merci
 

Hasco

XLDnaute Barbatruc
Repose en paix
bonjour,

Et bien essayez sans HIMEX !

Je vois dans votre macro, un défaut qui risque à terme d'entrainer des fuites....
Vos objets connexion et recordset ne sont jamais ni fermés, ni détruits, d'ailleurs leurs variables ne sont pas déclarées.
 

vgendron

XLDnaute Barbatruc
Hello Hasco

déjà.. ici.. https://stackoverflow.com/questions/35291171/imex-1-seems-to-have-no-effect
je viens de comprendre pourquoi le IMEX=1 ne fonctionne pas..
en fait.. une évaluation de type est faite sur les 8eres lignes SEULEMENT
si dans les 8 lignes, il ne voit que du numérique.. il considère que toute la colonne est numérique ==> il n'importe donc pas l'alpha
si dans les 8 lignes, il y a de l'alpha==> alors il importe tout en format "texte"
c'est ti pas con !

pour la fermeture,..
cette partie de code en fin de proc ne suffit pas?
VB:
'Ferme la requete
 Set Requete = Nothing
Set Source = Nothing
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Après chaque utilisation de la requête (juste après les .copyfromrecordset) mettez
Code:
Requete.Close
Set Requete = nothing
Finir proprement un travail avant d'en entamer un autre avec ces instruments.

En fin d'utilisation de la connexion (fin de macro ?)
VB:
Source.Close
Set Source = nothing
Set Requete = nothing.

Cordialement
 

vgendron

XLDnaute Barbatruc
Pour completer ce post:, et pour ceux que ca pourrait interresser.

pour "forcer" la requette SQL a importer les alpha et numérique: il "suffit" qu'une des 8 premières lignes contienne du texte
comme dans mes fichiers source, les lignes 4 et 5 contiennent du texte, j'ai modifié les plages
VB:
        xPlage1 = "A6:B" & derlign
        xPlage2 = "D6:D" & derlign

en remplacant par
       
        xPlage1 = "A4:B" & derlign
        xPlage2 = "D4:D" & derlign
puis, suite à l'importation, je supprime les deux lignes 4 et 5 qui ne m'interressent pas

voila :-D
Bonne soirée
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…