4
Bonjour, J'ai une table saisie_données qui regroupe toutes les saisies (code_article, date, entrées, sorties) et une requete qui appelle les données en fonction du critère code_article. L'objectif est d'avoir un état qui affiche les entrées, les sorties et un champ calculé qui affiche le résultat 'stock= stock_début + [entrées]-[sorties] ceci à chaque ligne de l'état. Avec la requete select je parviens à réunir les données mais le problème est d'avoir le champ calculer 'stock' Voici les formules appropriées (Source Microsoft). Bien entendu il faut les adapter à votre situation. Pour les recevoir, il faut d'abord créer 2 champs de type texte dans le pied de formulaire. =Somme(nz([UnitésCommandées])-nz([UnitésReçues])) =Somme(nz([UnitésReçues])-nz([PerteUnités])-nz([UnitésVendues])) Imaginons que vous désiriez importer non pas une seule feuille Excel, mais toutes les feuilles d'un classeur. Comment faire ? Astuce aimablement envoyée par Ludovic. Si vous désirez plus d'explications concernant l'importation simple d'une feuilles Excel, c'est par ici. Mode d'emploi : - Dans la base de données Access dans laquelle vous désirez importer l'ensemble de toutes les feuilles de calcul d'un

Requêtes VBA

Embed Size (px)

Citation preview

Page 1: Requêtes VBA

Bonjour, J'ai une table saisie_données qui regroupe toutes les saisies (code_article, date, entrées, sorties) et une requete qui appelle les données en fonction du critère code_article. L'objectif est d'avoir un état qui affiche les entrées, les sorties et un champ calculé qui affiche le résultat 'stock= stock_début + [entrées]-[sorties] ceci à chaque ligne de l'état. Avec la requete select je parviens à réunir les données mais le problème est d'avoir le champ calculer 'stock'

Voici les formules appropriées (Source Microsoft). Bien entendu il faut les adapter à votre situation.

Pour les recevoir, il faut d'abord créer 2 champs de type texte dans le pied de formulaire.

=Somme(nz([UnitésCommandées])-nz([UnitésReçues])) =Somme(nz([UnitésReçues])-nz([PerteUnités])-nz([UnitésVendues]))

Imaginons que vous désiriez importer non pas une seule feuille Excel, mais toutes les feuilles d'un classeur. Comment faire ?Astuce aimablement envoyée par Ludovic.

Si vous désirez plus d'explications concernant l'importation simple d'une feuilles Excel, c'est par ici.

Mode d'emploi :

- Dans la base de données Access dans laquelle vous désirez importer l'ensemble de toutes les feuilles de calcul d'un fichier Excel, écrivez le code suivant dans un module VBA, et exécutez le. Le fichier Excel s'appelle ici C:\TOTO.XLS. Il faut bien évidemment l'adapter à votre situation.

Sub ImportationGlobale  Dim appXl As Excel.Application  Dim intNbFeuille As Integer  Dim intIndex As Integer  Dim avarTabFeuille() As Variant

Page 2: Requêtes VBA

  Dim WorkSheet As Excel.WorkSheet  Dim tdf As TableDef  Set appXl = CreateObject("Excel.Application")  intNbFeuille = 1

  'OUVRE LE FICHIER .XLS ET TROUVE LERS DIFFERENTES FEUILLES  With appXl    .Workbooks.Open "C:\toto.xls"    ReDim avarTabFeuille(.Worksheets.Count)    For Each WorkSheet In .Worksheets      avarTabFeuille(intNbFeuille) = WorkSheet.name      intNbFeuille = intNbFeuille + 1    Next    .Quit  End With  Set appXl = Nothing

  'CREE UNE TABLE LINKEE POUR CHACUNES DES FEUILLES TROUVEES  For intIndex = 1 To UBound(avarTabFeuille)    fEntrer = False    Set tdf = CurrentDb.CreateTableDef(avarTabFeuille(intIndex))    tdf.Connect = "Excel 5.0;DATABASE=" & Result    tdf.SourceTableName = avarTabFeuille(intIndex) & "$"    CurrentDb.TableDefs.Append tdf    CurrentDb.TableDefs.Refresh  NextEnd Sub

1. Re : Importer 100 fichiers excel dans 1 table Access

bonsoir

Juste pour le Fun, voici une procédure qui boucle sur tous les classeurs d'un répertoire sans les ouvrir et transfert les données de la Feuil1 vers une table Access (Table1).

L'exemple suppose que Tous les onglets portent le même nom.Les classeurs sont structurés comme une vraie base (pas de données éparpillées) et de structure identique à la base Access (nombre de colonne et type de données adaptés:date,texte,numerique...etc...)

la procédure nécessite d'activer la référence Microsoft ActiveX Data Objects x.x Library

Code :

Sub tranfertFeuilleClasseursFermes_VersAccess()Dim Cn As New ADODB.Connection

Page 3: Requêtes VBA

Dim oProdRS As New ADODB.Recordset, oRS As ADODB.RecordsetDim oConn As ADODB.ConnectionDim j As IntegerDim Fichier As String, Repertoire As String '------------------------------------------------------'Connection à la Base AccessSet oConn = New ADODB.ConnectionoConn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _"Data Source= 'C:\maBase.mdb';"

'les données seront placés dans Table1Set oRS = New ADODB.RecordsetoRS.Open "Select * from Table1", oConn, adOpenKeyset, adLockOptimistic'------------------------------------------------------ 'Boucle sur les classeurs Excel du répertoire cibleRepertoire = "C:\Documents and Settings\mimi\dossier\general\excel\Nomdossier"Fichier = Dir(Repertoire & "\*.xls")

Do While Fichier <> ""    'Connection au classeur Excel    Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _    "Data Source=" & Repertoire & "\" & Fichier & ";" & _    "Extended Properties=""Excel 8.0;"""        'requête pour extraire les données de la Feuil1    oProdRS.Open "SELECT * FROM [Feuil1$]", Cn, adOpenStatic        ' --- Transfert des données dans la base ---    Do While Not (oProdRS.EOF)        oRS.addNew            For j = 0 To oRS.Fields.Count - 1            oRS.Fields(j) = oProdRS.Fields(j).Value            Next j        oRS.Update        oProdRS.moveNext   

Loop    '-------------------------------------------        oProdRS.Close    'Fermeture de la connection au classeur Excel    Cn.CloseFichier = DirLoop

oRS.CloseSet oRS = Nothing'Fermeture de la connection AccessoConn.CloseSet oConn = NothingEnd Sub

Page 4: Requêtes VBA

SELECT Tonnages.Client, Sum(Tonnages.Volume) AS SommeDeVolume,

Tonnages.numAnnee,convDate(Tonnages.numAnnee,[SemaineACalculer]) AS

dateconvertieFROM Tonnages

WHERE Tonnages.tDate>=DateAdd("ww",-4,dateconvertie) And ( Tonnages.tDate<dateconvertie)

GROUP BY Tonnages.Client, Tonnages.tDate, Tonnages.numAnnee;