Extraire des données sans ouvrir le fichier

car le fichier est partagé sur unréseau, et les tableaux empêchent le partage des classeurs,

fg2b, j'ai un bug ici :

image

Bonjour de nouveau,

Et j'allais justement poser la question de comment faire avec un lien dans une cellule

Pour comprendre le processus,, je vous conseille de décomposer.

1/ Vous chargez, de manière classique, dans PQ la zone nommée (CheminFichier)
Vous modifiez manuellement le code Excel.CurrentWorkbook(){[Name="CheminFichier"]}[Content] en ajoutant à la fin {0}[Column1]
(cela revient à dire à PQ de lire la colonne 1 de l'enregistrement 0)

A ce stade le chargement de l'information se fait via une seule ligne de code : Excel.CurrentWorkbook(){[Name="CheminFichier"]}[Content]{0}[Column1]

2/ Cette ligne de code peut avantageusement remplacer le chemin fichier lors du chargement du fichier externe.
==> Excel.Workbook(File.Contents(Excel.CurrentWorkbook(){[Name="CheminFichier"]}[Content]{0}[Column1]), null, true)

J'ai modifié la requette en ne prenant plus en compte le tableau mais la feuille. Il vous reste à modifier de nouveau la source

Valentin, les données sont tjrs dans un tableau structuré, en essayant de convertir en plage, les requettes ne fonctionnent plus

Comme ceci cela devrait fonctionner pour la tableau entré

Si vous parlez du tablau sortie, non c'est impossible.

233.xlsx (34.18 Ko)

merci valentin ça marche parfaitement

bonne journée

Imad
fg2b, j'ai un bug ici :
C'est normal
Ta requete est "SELECT * FROM [" & Feuille & Cellule & "] where [B3] ='Maintenance' " '
Le B3 pose probleme.

Ce n'est pas comme ca que ca fonctionne comme indiqué dans mon post
F1 represnte la colonne A F2 la B F3 la C .
Donc si tu veux que ca fonctionne , si 'maintenance' est dans ta deuxieme colonne il faut
req = "SELECT * FROM [" & Feuille & Cellule & "] where [F2] ='Maintenance' " '
F est le rang de ta colonne

21Formatic

Je n'aurais pas vu cela comme ça ! Pourquoi F pour représenter les colonnes?

F pour Field

Cdlt
F pour Field

Ah oui, ça se tient :)

merci fg2b, je l'ai ajusté, ça marche à merveille.

merci bcp

Salut Valentin,

j'ai une question sur les champs suivants :

image

comment les remplir ? car je veux utiliser cette méthode sur d'autres classeurs.

merci bcp

C'est la fonctionnalité "Supprimer les autres colonnes"

En gros tu sélectionnes les colonnes que tu souhaites conservées. Et ensuite tu surprimes les autres via cette fonctionnalité :

image

Bonjour FG2b,

j'espere que vous allez bien,

ma macro bug si le fichier source est ouvert !

est-il possible d'ajuter cela svp

Sub extractionsql()
    'Sheets("FE").Range("A6:AF90000").Delete
    Dim Source As ADODB.Connection
    Dim Rst As ADODB.Recordset
    Dim ADOCommand As ADODB.Command
    Dim Fichier As String, Cellule As String, Feuille As String

    Feuille = "FE-CAPA jusque 2019$" 'n'oubliez pas d'ajouter $ au nom de la feuille d'ou on exrait les données

    'Chemin complet du classeur fermé
    Fichier = "L:\Qualité\Qualité API\01 - Tableaux de Suivi Qualité Pharma\05 - FE - CAPA\FE-CAPA nouvelle version.xlsx"

    Set Source = New ADODB.Connection          'activer les Microsoft activeX Dataobjects 2.5 librairy
    Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & Fichier & ";Extended Properties=""Excel 12.0;HDR=No;"";"

    'Adresse de la cellule contenant la donnée à récupérer
    Cellule = "g6:Al90000" ' contient  les données sur la feuil IDF citée plus haut

    Set ADOCommand = New ADODB.Command
    With ADOCommand
        .ActiveConnection = Source
    End With

    req = "SELECT * FROM [" & Feuille & Cellule & "]" 'where [F2] ='Maintenance' " ' A1:C100 sont les colonnes selectionnées de IDF.  F1 represnte la colonne A F2 la B F3 la C .

    Set Rst = New ADODB.Recordset
        Rst.Open req, Source, adOpenStatic, adLockReadOnly 'ça bug ici

   'Sheets("FE").Range("b" & Range("B65536").End(xlUp).Row + 1).CopyFromRecordset Rst

    Sheets("FE").Range("b3000").CopyFromRecordset Rst
    Source.Close
    Set Source = Nothing
    Set Rst = Nothing
    Set ADOCommand = Nothing

End Sub

merci d'avance

Bonjour,

Tu peux tester si le fichier est ouvert. S'il est ouvert tu ne fais rien et s'il est fermé tu procedes a ton extraction

Sub extractionsql()

'a mettre en haut de ta macro avant les Dim

Fichier = "L:\Qualité\Qualité API\01 - Tableaux de Suivi Qualité Pharma\05 - FE - CAPA\FE-CAPA nouvelle version.xlsx"

If IsFileOpen(Fichier) Then GoTo fin:

en bas de ta macro tu rajoute fin :

fin :

End Sub

Il ne reste plus qu'a definir la fonction IsOpenFile (merci google)

Function IsFileOpen(filename As String) As Boolean

Dim filenum As Integer, Errnum As Integer

On Error Resume Next

filenum = FreeFile()

Open filename For Input Lock Read As #filenum
Close filenum

Errnum = Err

On Error GoTo 0

Select Case Errnum
Case 0
IsFileOpen = False
Case 70
IsFileOpen = True
End Select

End Function

Cdlt

Un grand merci FG2B,

ça fonctionne à merveille

Rechercher des sujets similaires à "extraire donnees ouvrir fichier"