Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/12/2011, 10h51   #1
Futur Membre du Club
 
Inscription : mars 2004
Messages : 50
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : mars 2004
Messages : 50
Points : 15
Points : 15
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 :
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 :
Citation:
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 ?
Cyborg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 09h58   #2
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

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

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 864
Points : 1 864
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 ?
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 11h56   #3
Futur Membre du Club
 
Inscription : mars 2004
Messages : 50
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : mars 2004
Messages : 50
Points : 15
Points : 15
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 :
1
2
3
4
5
6
7
8
|    TENSION    |
| V_MIN | V_MAX |
|   0   |   5   |
|   1   |   4   |
|   1   |   6   |
|   2   |   3   |
|   2   |   4   |
...
Code :
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 :
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.
Cyborg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 14h43   #4
Membre chevronné
 
Inscription : octobre 2006
Messages : 541
Détails du profil
Informations personnelles :
Localisation : France, Ardèche (Rhône Alpes)

Informations forums :
Inscription : octobre 2006
Messages : 541
Points : 760
Points : 760
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 :
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
__________________
Michel_M
Michel_M est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/12/2011, 16h54   #5
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

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

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 864
Points : 1 864
Je ne savais pas qu'on pouvait faire ça. Franchement, ça m'aurait sauvé la mise plus d'une fois. Merci Michel_M !
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 08h16   #6
Futur Membre du Club
 
Inscription : mars 2004
Messages : 50
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : mars 2004
Messages : 50
Points : 15
Points : 15
Citation:
Envoyé par Michel_M Voir le message
Code :
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.
Cyborg est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h46.


 
 
 
 
Partenaires

Hébergement Web