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 :

Conception base de données sous excel


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Points : 4
    Points
    4
    Par défaut Conception base de données sous excel
    Bonjour à tous,

    Je suis un lecteur fréquent des forums développez.net, que j'utilise lors de mes bidouillages sur des macros excel. Le problème c'est que je trouve toujours quelqu'un qui a posé la question avant moi, et là, j'ai beau chercher, pas moyen !
    Je cherche à faire tourner une petite macro pour faire une petite base de données sous excel.
    Du coup voici un petit état des lieux :
    Ce qui est fait :
    - Fournir une interface à l'utilisateur pour qu'il entre des données
    - Recopier ces données dans une base de donnée située dans un autre onglet du fichier
    - Rappeler ces données pour divers usages
    Ca marche plutôt pas mal, à part quelques problèmes de version d'excel que je pense avoir résolu avec du Late Binding (j'utilise la macro sur 4 postes : 2x XL2003, 1x XL2007, 1x XL2010)

    Ce que je voudrais faire :
    Le fichier n'est pas adapté à une utilisation multi-utilisateurs, même si elle restera faible (2-3 personnes maxi)
    Aussi, j'ai pensé à une solution : Un fichier par personne, chaque fichier écrivant dans un autre fichier excel servant de base. Pas de conflit car pas d'ouverture.
    Problème, cela me demande de mettre en place des ADO et des connections "jet" pour ne pas ouvrir le fichier, mais cela me semble fastidieux, et j'ai peur que ça me pose d'autres problèmes de compatibilité (il faut initialiser la version de l'application excel dans les paramètres de OLEDB).
    En d'autres termes, est ce vraiment la bonne solution ? N'y a-t-il pas plus simple ? Je commence à manquer de temps, et vos réponses me permettront sûrement de ne pas prendre le mauvais chemin !

    Je cite mes références sur ODBC : http://silkyroad.developpez.com/VBA/ClasseursFermes/ mais est-ce encore d'actualité ?

    Merci d'avance
    Al

  2. #2
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    si tu as la suite office installé sur les postes, tu peux créer la base de données sur access, tu la mets qqp sur le réseau et tout le monde y accède via des record set. Si la base est occupée, tu peux écrire de manière temporaire dans le excel local, réésayer a intervalles régulière et des que c'est libre, tu écris.
    Pour ce qui est de la lecture, ce n'est pas un problème qu'il y ai plusieur users en même temps.
    - La dernière fois que j'ai testé ca fonctionnait !
    - Vous n'avez rien modifié ?
    - Non ! Je suis pas idiot non plus.
    - ....
    - Enfin si, juste le fichier .dll, mais a 4Ko, ca devait pas être important.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Points : 1 562
    Points
    1 562
    Par défaut
    Bonjour,

    Quelques pistes également, issues de mes propres tatonnements ou errements:

    - Tout ce qui est entrées utililsateurs est à mettre dans un fichier non protégé et éventuellement en mode 'partagé' si il n'y pas de risques de téléscopage de champs / feuilles, par exemple en créant une feuille par user (Application.UserName)
    - Vous faites votre traitement VBA sur un fichier dédié, qui vient se servir dans ce(s) fichier(s) data de manière automtique au chargement

    Bonne journée
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    ce qui est domage c'est de poser la question après avoir commencé le développement car il me sêmble important de se posser la question de la mutualisaton avant!

    J'ai annimmé pluseurs discution? Qui reprennent lagestion d'un projrt excel via ado.

    Je t'invite a les parcourir, je te donne le premier lien et t'inte a lire les autre en te connectant au profile du demandeur!

    http://www.developpez.net/forums/d14...espace-commun/

  5. #5
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Citation Envoyé par Aldi_ Voir le message
    Bonjour à tous,

    Ca marche plutôt pas mal, à part quelques problèmes de version d'excel que je pense avoir résolu avec du Late Binding (j'utilise la macro sur 4 postes : 2x XL2003, 1x XL2007, 1x XL2010)

    Aussi, j'ai pensé à une solution : Un fichier par personne, chaque fichier écrivant dans un autre fichier excel servant de base. Pas de conflit car pas d'ouverture.
    Problème, cela me demande de mettre en place des ADO et des connections "jet" pour ne pas ouvrir le fichier, mais cela me semble fastidieux, et j'ai peur que ça me pose d'autres problèmes de compatibilité.
    Merci d'avance
    Al
    Là, tu as déjà un problème. Le moteur JET n'est pas compatible avec les fichiers OpenXML d'Office (Excel) 2007 et suivants:

    http://msdn.microsoft.com/en-us/libr...ffice.14).aspx


    J'ai lu à quelque part que le nouveau moteur ACE est rétro-compatible avec Office 2003 et avant, mais je ne suis pas en mesure de vérifier.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  6. #6
    Invité
    Invité(e)
    Par défaut
    non mai ça ça marche très bien et pas besoin de tripatouiller les librairie!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Set Cnx = CreateObject("ADODB.Connection")
        With Cnx
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
        End With

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Salut à tous !

    Merci pour vos réponses ! Évidement, si j'avais le choix, j'aurais de préférence utilisé Access qui est fait pour ça. Le problème avec Access est plutôt que je ne l'ai pas à disposition.
    Du coup, je me suis lancé dans le ADO !
    La connexion marche sur un classeur xlsx ainsi que les INSERT.
    Cependant, j'aurais souhaité utiliser des commandes du type SELECT FROM WHERE afin de faire des recherches via des recordset, et les recordsets m'amènent toujours à une erreur "BOF ou EOF est à true".
    Pourtant, quand je checke l'objet RecordSet, il semble avoir trouver le bon nombre d'items, mais la Value vaut invariablement "BOF ou EOF est égal à True ou l'enregistrement actuel a été supprimé. L'opération demandée nécessite un enregistrement actuel.", ce qui m'empêche d'accéder à toute autre opération, et notamment les différents champs renvoyés.

    Donc, ma question : qqun voit-il une erreur sur mon code pour le RecordSet ?

    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
     
    Sub Recherche(Cn As ADODB.Connection, Fichier As String)
     
        Dim Rst As ADODB.Recordset
     
        Set Rst = New ADODB.Recordset
     
        Rst.Open "SELECT Colonne3 FROM [Structure$] WHERE Colonne2='NomTest'", Cn, adOpenKeyset, adLockOptimistic
        Tbl = Rst.GetRows
     
    ' Ci dessous qq tests pour voir ce qui fonctionne 
        Rst(0).Value = "Donnée test"
        Rst.Update
     
     
        Set Rst = Nothing
    Merci !

  8. #8
    Invité
    Invité(e)
    Par défaut
    bonjour,
    donne un nom a ta FROM (frm) par exemple!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     "SELECT frm.Colonne3 FROM [Structure$]  as frm  WHERE frm.Colonne2='NomTest';"

    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
    20
    Sub Recherche(Cn As ADODB.Connection, Fichier As String)
     
        Dim Rst As ADODB.Recordset
     
        Set Rst = New ADODB.Recordset
     
        Rst.Open "SELECT frm.Colonne3 FROM [Structure$]  as frm  WHERE frm.Colonne2='NomTest';", Cn, adOpenKeyset, adLockOptimistic
    if Rst.eof=false then
        Tbl = Rst.GetRows
    'rst.MoveFirst 'Retourne au premier enregistrement
    'rst.MoveNext 'Vas à l'enregistrement suivant
    'rst.Move (150) 'Vas à l'enregistrement 150
    'rst.MoveLast 'Vas au derier enregistrement
    rst.Requery 'Réexécute la requête
    ' Ci dessous qq tests pour voir ce qui fonctionne 
        Rst(0).Value = "Donnée test" 'ici tu vas avoir une erreur car  GetRows place eof et bof a true
        Rst.Update
     
     end if
        Set Rst = Nothing
    Dernière modification par Invité ; 07/11/2014 à 12h56.

  9. #9
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Salut rdurupt

    J'ai testé ta solution, et l'erreur persiste...
    Par ailleurs, je ne comprends pas ce qui change entre la version que tu proposes et celle d'avant

  10. #10
    Invité
    Invité(e)
    Par défaut
    déjà je nomme la requête car sous excel dans certain cas ça bug si on ne le fait pas!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT frm.Colonne3 FROM [Structure$]  as frm  WHERE frm.Colonne2='NomTest';"
    d'autre part je test si la requête retourne des valeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if Rst.eof=false then
    end if
    ensuite je réactualise la requête car GetRows place le recorset à la fin (EOF=BOF=TRUE)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Tbl = Rst.GetRows
    rst.Requery 'Réexécute la requête
    si non il n'y a pas de différence!

  11. #11
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Ok !
    C'est juste la raison du frm qui me manquait
    Du coup, plus d'erreur en effet, mais comme le RecordSet ne met pas le BOF=EOF à Faux, ça ne rentre pas dans la boucle forcement...ce qui m'empêche d'exploiter la requete

  12. #12
    Invité
    Invité(e)
    Par défaut
    nonononononon

    non tu ne teste que le EOF!

  13. #13
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    En effet, tout juste, le BOF = FAUX et l'EOF = VRAI
    Du coup, on rentre pas dans la boucle, et j'ai toujours les "BOF ou EOF est égal à True ou l'enregistrement actuel a été supprimé. L'opération demandée nécessite un enregistrement actuel." pour Rst(0).Value...
    Je ne vois pas où tu veux en venir...

  14. #14
    Invité
    Invité(e)
    Par défaut
    test juste ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Rst.Open "SELECT frm.Colonne3 FROM [Structure$]  as frm  WHERE frm.Colonne2='NomTest';", Cn, adOpenKeyset, adLockOptimistic
    if Rst.eof=false then
      Rst(0).Value = "Donnée test"
        Rst.Update
    end if

  15. #15
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Resultat :
    1ere ligne ok
    2e ligne Rst.EOF = VRAI donc Go to End if
    Fin de l'exécution

  16. #16
    Invité
    Invité(e)
    Par défaut
    la il faut voire si 'NomTest' existe bien dans le champ Colonne2 de ton fichier EXCEL????????

  17. #17
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Je confirme, NomTest y existe bien en 5 exemplaires

  18. #18
    Invité
    Invité(e)
    Par défaut
    attention à 'NomTest' et ' NomTest ' ce qui change tout! double click sur la cellule et regarte le début du text et la fin en appuyant sur la touche [Fin] du clavier

  19. #19
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Non l'entrée est correcte, vue que je l'ai insérée à l'aide de INSERT

  20. #20
    Invité
    Invité(e)
    Par défaut
    autre test.

    il faut bien que l'on trouve!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Rst.Open "SELECT frm.Colonne3, frm.Colonne2 FROM [Structure$]  as frm ;" ' WHERE frm.Colonne2='NomTest';", Cn, adOpenKeyset, adLockOptimistic
    if Rst.eof=false then
      Rst("Colonne2").Value = "Donnée test"
        Rst.Update
    end if
    Rst.close
    Rst.Open "SELECT frm.Colonne3 FROM [Structure$]  as frm WHERE frm.Colonne2='Donnée test';", Cn, adOpenKeyset, adLockOptimistic
    if Rst.eof=false then
      Rst(0).Value = "Donnée test"
        Rst.Update
    end if
    Rst.close

Discussions similaires

  1. [XL-2002] Base de donnés sous Excel
    Par sergio_gr66 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/05/2009, 15h33
  2. programmation base de données sous excel
    Par carosempe dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/01/2008, 16h06
  3. base de données sous excel 2002
    Par Cécile31 dans le forum Excel
    Réponses: 1
    Dernier message: 30/10/2007, 17h03
  4. Petite base de donnée sous excel
    Par Denti-fritz dans le forum Excel
    Réponses: 2
    Dernier message: 22/06/2007, 16h21
  5. base de donnée sous excel: effacer les données
    Par eseb777 dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 03/05/2007, 09h32

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