OVH Cloud OVH Cloud

Excel? Access? VB? lequel choisir?

5 réponses
Avatar
Fly
bonjour,


je viens de me trouver au problème suivant :

on me demande dc'ecrire une macro sous excel qui

-recherche dans douze fichiers toutes les lignes dont un champs à
une certaines valeurs (il y a des lignes pour lequels la colonne est vide)
-regarder dans la ligne si une case à une valeur que j'appelerai
Valeur
-si c'est le cas, faire la somme avec les précedentes valeurs.

mais, je voudrais savoir si il y a moyen de faire une sorte de requête
SQL pour selectionner uniquements les lignes qui m'interessent (un petit
milier sur les 48000) que comporte chaque fichiers en moyenne)

Si tel n'est pas le cas, pourrait-on me conseiller avec quel application
le faire ou si je dois la faire moi-même en VB (je suis un assez bon
programmeur).

Merci par avance.

5 réponses

Avatar
Clément Marcotte
Bonjour,

Tu peux dans Excel, utiliser MSQUERY pour créer une requête.
(Données - Données externes - Créer une requête).

Tu peux aussi passer par ADO avec VB ou VBA. (Mais là attends que
Michel Denis Michon passe par ici)

Pour Access, je ne sais pas.

"Fly" a écrit dans le message de
news:bdupce$i3k$
bonjour,


je viens de me trouver au problème suivant :

on me demande dc'ecrire une macro sous excel qui

-recherche dans douze fichiers toutes les lignes dont un
champs à

une certaines valeurs (il y a des lignes pour lequels la colonne est
vide)

-regarder dans la ligne si une case à une valeur que
j'appelerai

Valeur
-si c'est le cas, faire la somme avec les précedentes
valeurs.


mais, je voudrais savoir si il y a moyen de faire une sorte de
requête

SQL pour selectionner uniquements les lignes qui m'interessent (un
petit

milier sur les 48000) que comporte chaque fichiers en moyenne)

Si tel n'est pas le cas, pourrait-on me conseiller avec quel
application

le faire ou si je dois la faire moi-même en VB (je suis un assez bon
programmeur).

Merci par avance.





Avatar
Clément Marcotte
Si tel n'est pas le cas, pourrait-on me conseiller avec quel
application

le faire ou si je dois la faire moi-même en VB (je suis un assez bon
programmeur).


Juste assez bon ? ;-)

Avatar
michdenis
Bonjour Fly,

J'ai retenu une des suggestions de Clément qui est d'utiliser ADO et extraire directement par une requête les informations
sur des fichiers vers un nouveau document excel.

L'exemple qui suit suppose que les données sont situées dans un fichier excel

Dans ta question cependant, tu ne dis pas expressément :
A ) est-ce que tes données sont dans des fichiers Excel ?

B ) Où sont tes fichiers qui doivent faire l'objet d'une requête ?
Tous dans le même répertoire ? Dans une liste que tu connais ?

C ) Pour pouvoir faire "La même requête sur plusieurs fichiers différents , est-ce que la feuille qui contient ces données a
la même structure ? Est-ce que cette feuille a le même nom ?

Si tous tes fichiers excel ont exactement la même structure et le même nom comme onglet de la feuille, il ne te reste plus
qu'à installé la procédure donnée en exemple dans une boucle sur l'ensemble des fichiers.

Pour écrire la requête dans une syntaxe, Tu peux te faire aider par Query ou Access pour la syntaxe !!!


'-----------------------------------------------
Sub MaRequêteAvecADO()

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomFeuille As String, Rg As Range
Dim File As String, C As Integer, Ok As Integer

'Fichier sur lequel se fera la requête :
File = "C:testQuery.xls"

'Nom de la feuille du fichier où sont les données
'Dans la requête, j'utilise la variable.
NomFeuille = "denis"

'Défini la première cellule où seront copiées les
'données des requêtes ADO
With Worksheets("Feuil1")
If .Range("A1") = "" Then
Set Rg = .Range("A1")
Else
Set Rg = .Range("A" & .Range("A65356").End(xlUp).Row)(2)
Ok = 1
End If
End With

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & File & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""

'La requête qui sera exécutée.
Requete = "SELECT * From [" & NomFeuille & "$]"

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic


'Copie les étiquettes du recordset vers Excel
If Ok <> 1 Then
Do
Rg.Offset(, C) = Rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = Rst.Fields.Count
Rg.Offset(1).CopyFromRecordset Rst
Else
Rg.CopyFromRecordset Rst
End If

Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Sub
'-----------------------------------------------


Salutations!



"Fly" a écrit dans le message de news:bdupce$i3k$
bonjour,


je viens de me trouver au problème suivant :

on me demande dc'ecrire une macro sous excel qui

-recherche dans douze fichiers toutes les lignes dont un champs à
une certaines valeurs (il y a des lignes pour lequels la colonne est vide)
-regarder dans la ligne si une case à une valeur que j'appelerai
Valeur
-si c'est le cas, faire la somme avec les précedentes valeurs.

mais, je voudrais savoir si il y a moyen de faire une sorte de requête
SQL pour selectionner uniquements les lignes qui m'interessent (un petit
milier sur les 48000) que comporte chaque fichiers en moyenne)

Si tel n'est pas le cas, pourrait-on me conseiller avec quel application
le faire ou si je dois la faire moi-même en VB (je suis un assez bon
programmeur).

Merci par avance.
Avatar
Fly
michdenis a écrit dans le message :

Bonjour Fly,

J'ai retenu une des suggestions de Clément qui est d'utiliser ADO et
extraire directement par une requête les informations

sur des fichiers vers un nouveau document excel.

L'exemple qui suit suppose que les données sont situées dans un fichier
excel


Dans ta question cependant, tu ne dis pas expressément :
A ) est-ce que tes données sont dans des fichiers Excel ?


oui : toutes les données sont dans excel

B ) Où sont tes fichiers qui doivent faire l'objet d'une requête ?
Tous dans le même répertoire ? Dans une liste que tu connais ?


tous dans le même repertoire et avec la liste de noms de fichiers qui est
connue



C ) Pour pouvoir faire "La même requête sur plusieurs fichiers différents
, est-ce que la feuille qui contient ces données a

la même structure ? Est-ce que cette feuille a le même nom ?


la structure est identique avec les noms de feuille identique

Si tous tes fichiers excel ont exactement la même structure et le même nom
comme onglet de la feuille, il ne te reste plus

qu'à installé la procédure donnée en exemple dans une boucle sur
l'ensemble des fichiers.


Pour écrire la requête dans une syntaxe, Tu peux te faire aider par Query
ou Access pour la syntaxe !!!



'-----------------------------------------------
Sub MaRequêteAvecADO()

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomFeuille As String, Rg As Range
Dim File As String, C As Integer, Ok As Integer

'Fichier sur lequel se fera la requête :
File = "C:testQuery.xls"

'Nom de la feuille du fichier où sont les données
'Dans la requête, j'utilise la variable.
NomFeuille = "denis"

'Défini la première cellule où seront copiées les
'données des requêtes ADO
With Worksheets("Feuil1")
If .Range("A1") = "" Then
Set Rg = .Range("A1")
Else
Set Rg = .Range("A" & .Range("A65356").End(xlUp).Row)(2)
Ok = 1
End If
End With

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & File & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""

'La requête qui sera exécutée.
Requete = "SELECT * From [" & NomFeuille & "$]"

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic


'Copie les étiquettes du recordset vers Excel
If Ok <> 1 Then
Do
Rg.Offset(, C) = Rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = Rst.Fields.Count
Rg.Offset(1).CopyFromRecordset Rst
Else
Rg.CopyFromRecordset Rst
End If

Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Sub
'-----------------------------------------------


Salutations!




merci

"Fly" a écrit dans le message de
news:bdupce$i3k$

bonjour,


je viens de me trouver au problème suivant :

on me demande dc'ecrire une macro sous excel qui

-recherche dans douze fichiers toutes les lignes dont un champs à
une certaines valeurs (il y a des lignes pour lequels la colonne est vide)
-regarder dans la ligne si une case à une valeur que j'appelerai
Valeur
-si c'est le cas, faire la somme avec les précedentes valeurs.

mais, je voudrais savoir si il y a moyen de faire une sorte de requête
SQL pour selectionner uniquements les lignes qui m'interessent (un petit
milier sur les 48000) que comporte chaque fichiers en moyenne)

Si tel n'est pas le cas, pourrait-on me conseiller avec quel
application

le faire ou si je dois la faire moi-même en VB (je suis un assez bon
programmeur).

Merci par avance.






Avatar
michdenis
Bonjour Fly,

Voici la procédure qui récupérera les données pour tous les fichiers
d'un même répertoire. Cela suppose que tous ces fichiers possèdent
une feuille ayant le même nom sur laquelle se retrouve la même structure
des données.

Pour adapter cette procédure à ton projet, tu dois définir :

A ) Le Chemin de ton répertoire
B ) Le nom de l'onglet de la feuille où sont les données
C ) Il te reste à écrire la requête pour extraire les données.

Tu dois ajouter à ton fichier excel, la bibliothèque suivante :
"Microsoft Activex Data Objects 2.0 Librairy


'-----------------------------------------------
Sub MaRequêteAvecADO()

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomFeuille As String, Rg As Range
Dim File As String, C As Integer, Ok As Integer
Dim Chemin As String

NomFeuille = "denis" 'A déterminer
Chemin = "C:Data" 'à déterminer

'La requête qui sera exécutée ' `a déterminer
Requete = "SELECT * From [" & NomFeuille & "$]"

'Récupérer dans un tableau, la liste des
'fichiers excel du répertoire.

File = Dir(Chemin & "*.xls")
Do While File <> ""
'Défini la première cellule où seront copiées les
'données des requêtes ADO
With Worksheets("Feuil1")
If .Range("A1") = "" Then
Set Rg = .Range("A1")
Else
Set Rg = .Range("A" & .Range("A65356").End(xlUp).Row)(2)
Ok = 1
End If
End With

'établir la connection avec le fichier...
Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & File & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

'Copie les étiquettes du recordset vers Excel
If Ok <> 1 Then
Do
Rg.Offset(, C) = Rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = Rst.Fields.Count
Rg.Offset(1).CopyFromRecordset Rst
Else
Rg.CopyFromRecordset Rst
End If
File = Dir()
Rst.Close: Conn.Close
Loop
Set Rst = Nothing: Set Conn = Nothing
Set Rg = Nothing
End Sub
'-----------------------------------------------


Salutations



"Fly" a écrit dans le message de news:be0l5p$bhd$

michdenis a écrit dans le message :

Bonjour Fly,

J'ai retenu une des suggestions de Clément qui est d'utiliser ADO et
extraire directement par une requête les informations

sur des fichiers vers un nouveau document excel.

L'exemple qui suit suppose que les données sont situées dans un fichier
excel


Dans ta question cependant, tu ne dis pas expressément :
A ) est-ce que tes données sont dans des fichiers Excel ?


oui : toutes les données sont dans excel

B ) Où sont tes fichiers qui doivent faire l'objet d'une requête ?
Tous dans le même répertoire ? Dans une liste que tu connais ?


tous dans le même repertoire et avec la liste de noms de fichiers qui est
connue



C ) Pour pouvoir faire "La même requête sur plusieurs fichiers différents
, est-ce que la feuille qui contient ces données a

la même structure ? Est-ce que cette feuille a le même nom ?


la structure est identique avec les noms de feuille identique

Si tous tes fichiers excel ont exactement la même structure et le même nom
comme onglet de la feuille, il ne te reste plus

qu'à installé la procédure donnée en exemple dans une boucle sur
l'ensemble des fichiers.


Pour écrire la requête dans une syntaxe, Tu peux te faire aider par Query
ou Access pour la syntaxe !!!



'-----------------------------------------------
Sub MaRequêteAvecADO()

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomFeuille As String, Rg As Range
Dim File As String, C As Integer, Ok As Integer

'Fichier sur lequel se fera la requête :
File = "C:testQuery.xls"

'Nom de la feuille du fichier où sont les données
'Dans la requête, j'utilise la variable.
NomFeuille = "denis"

'Défini la première cellule où seront copiées les
'données des requêtes ADO
With Worksheets("Feuil1")
If .Range("A1") = "" Then
Set Rg = .Range("A1")
Else
Set Rg = .Range("A" & .Range("A65356").End(xlUp).Row)(2)
Ok = 1
End If
End With

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & File & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""

'La requête qui sera exécutée.
Requete = "SELECT * From [" & NomFeuille & "$]"

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic


'Copie les étiquettes du recordset vers Excel
If Ok <> 1 Then
Do
Rg.Offset(, C) = Rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = Rst.Fields.Count
Rg.Offset(1).CopyFromRecordset Rst
Else
Rg.CopyFromRecordset Rst
End If

Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Sub
'-----------------------------------------------


Salutations!




merci

"Fly" a écrit dans le message de
news:bdupce$i3k$

bonjour,


je viens de me trouver au problème suivant :

on me demande dc'ecrire une macro sous excel qui

-recherche dans douze fichiers toutes les lignes dont un champs à
une certaines valeurs (il y a des lignes pour lequels la colonne est vide)
-regarder dans la ligne si une case à une valeur que j'appelerai
Valeur
-si c'est le cas, faire la somme avec les précedentes valeurs.

mais, je voudrais savoir si il y a moyen de faire une sorte de requête
SQL pour selectionner uniquements les lignes qui m'interessent (un petit
milier sur les 48000) que comporte chaque fichiers en moyenne)

Si tel n'est pas le cas, pourrait-on me conseiller avec quel
application

le faire ou si je dois la faire moi-même en VB (je suis un assez bon
programmeur).

Merci par avance.