IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Requete SQL en VBA sur "Sélection" d'un feuille de données ? [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 76
    Par défaut
    Bonjour à tous,

    Je travaille actuellement sur plusieurs fichiers Excel, récupérant des données à droite et à gauche, principalement par requêtes SQL, pour éviter d'ouvrir les fichiers Excel. Voici en gros un modèle de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Dim conn as New ADODB.Connection
    Dim rs as new Recordset
     
    With conn
      .Provider = "Microsoft.ACE.OLEDB.12.0"
      .ConnectionString = "Data Source=" & chemin_fichier_excel_2007 & ";" & _
                          "Extended Properties=""Excel 12.0;HDR=Yes;"""
      .Open
    End With
     
    With rs
      .ActiveConnection = conn
      .CursorType = adOpenForwardOnly
    End With
     
    requete_sql = "SELECT * FROM MaTable"
    rs.Open requete_sql
    ActiveSheet.Range("A1").CopyFromRecordset rs
    rs.Close
    Cela fonctionne parfaitement ... tant que mes fichiers Excel ont une unique ligne de titres (ou aucune en passant "HDR=No").

    En revanche, ces fichiers Excel ayant d'autres utilités que de servir de base de données, il arrive qu'ils aient la structure de titres suivante (voir pire) :
    |    TENSION    |
    | V_MIN | V_MAX |
    |   0   |   5   |
    ...
    Et évidemment, dans ce cas, ça ne fonctionne pas, puisque les seules colonnes retenues pour les requêtes sont celles ayant un titre fourni en 1ère ligne.

    Pour le moment, les 2 solutions que j'ai mis en oeuvre sont :
    - Copier les données dans un fichier temporaire, réaliser mes requêtes dessus, puis détruire le fichier ;
    - Utiliser une tout autre méthode (récupération des données dans un tableau, ajout dans une collection avec une clé) si le seul intérêt est de copier des infos à partir d'une clé donnée.

    J'ai appris récemment qu'en définissant des zones d'impression par exemple, de nouvelles tables sont "créées" dans le fichier Excel (elles apparaissent dans la liste des tables). Mais là, je ne maitrise plus du tout le sujet : je ne sais pas dans quelle mesure on peut y accéder, ni sous quelles conditions.

    Ma question est donc la suivante :
    Est-il possible d'exécuter, sans certaines conditions, des requêtes sur des morceaux d'une feuille de données ?
    Merci d'avance pour toute information.
    Et n'hésitez pas aussi à me préciser aussi si cela vous semble impossible.

    Cela n'inspire personne ?

    Notez que si vous savez faire ce genre de chose à partir des fonctions Excel, je suis preneur aussi. Je me débrouillerai ensuite avec l'enregistreur de Macro.

    Une idée ? Quelqu'un ?

  2. #2
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    Je ne crois pas qu'on puisse faire du SQL directement dans une feuille. Tu as essayé en mettant le chemin du fichier actif dans ta connexion (après l'avoir sauvé) ?

    L'idée du fichier temporaire peut être une solution bien sûr. Mais je pense que tu peux faire ça directement dans Excel si les requêtes que tu voulais faire n'étaient pas très compliquées, soit en formules, soit en macro.

    Tu as des exemples de ce que tu voulais faire ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 76
    Par défaut
    Citation Envoyé par ZebreLoup Voir le message
    Tu as des exemples de ce que tu voulais faire ?
    Une petite requête sur mes données en exemple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    |    TENSION    |
    | V_MIN | V_MAX |
    |   0   |   5   |
    |   1   |   4   |
    |   1   |   6   |
    |   2   |   3   |
    |   2   |   4   |
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT V_min FROM MaTable GROUP BY V_min HAVING SUM(V_max) > 8
    Voilà un exemple qui te convient ?

    Citation Envoyé par ZebreLoup Voir le message
    soit en formules, soit en macro.
    Actuellement, si je dois récupérer des données dans une partie d'une feuille, j'utilise une collection d'objets perso, indéxé par une clé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set obj_personne = New Personne
    obj_personne.nom = "DUPONT"
    obj_personne.prenom = "Martin"
    obj_personne.age = "38"
    ma_collection.Add obj_personne, obj_personne.nom
    Set obj_personne = Nothing
    Après quoi je remplis un tableau ligne par ligne. Il me suffit de fournir le nom de référence pour le récupérer et ainsi copier les bonnes infos de ma table.

    Mais adios les requêtes complexes.

    Non, je voulais plutôt profiter du fait qu'on trouve des tables supplémentaires dans un fichier Excel (une fois qu'il est ouvert je crois), par exemple si on définit une zone d'impression (je crois). Mais j'ai pas eu le temps de tester cette piste.

    Donc si quelqu'un a déjà testé, j'suis preneur.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Par défaut
    Bonjour,
    excusez l'incruste
    Tu peux utiliser une autre méthode que "matable" avec le nom d'onglet et la plage à copier
    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    onglet="feuil1"
    plage= "A3:B1000"
    Texte_SQL = "SELECT * FROM [" & onglet & "$" & plage & "];"
    la dernière ligne (ici 1000) peut ^tre supérieure à la dernière ligne réelle

  5. #5
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    Je ne savais pas qu'on pouvait faire ça. Franchement, ça m'aurait sauvé la mise plus d'une fois. Merci Michel_M !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 76
    Par défaut
    Citation Envoyé par Michel_M Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    onglet="feuil1"
    plage= "A3:B1000"
    Texte_SQL = "SELECT * FROM [" & onglet & "$" & plage & "];"
    Que dire de plus, si ce n'est "Merci" !!

    Citation Envoyé par Michel_M Voir le message
    la dernière ligne (ici 1000) peut être supérieure à la dernière ligne réelle
    C'est vrai que si on n'ouvre pas le fichier, impossible d'aller compter les lignes. Je n'y avais pas pensé.

    Citation Envoyé par Michel_M Voir le message
    excusez l'incruste
    Ben tu vois, sur le coup, t'es tout excusé !!
    Merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb de syntaxe SQL en VBA sur la sélection d'une date
    Par rch05 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 18/09/2010, 17h58
  2. Requete fichier .js VBA EXCEL REALTIME FX QUOTES
    Par tiuse75016 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 29/05/2010, 18h51
  3. [Excel/VBA] Requete SQL avec clause sur une suite de Cellule
    Par Myogtha dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 21/02/2007, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo