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 :

[VBA]BDD et Excel


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut [VBA]BDD et Excel
    Bonjours,

    Je dois produire des tableaux qui liste toutes les pièces qui il y a dans un
    plan mécanique.
    A partir d'excel, je peux récupérer le nom et des attributs (que je peux
    définir) des pièces grace à une liaison OLE.

    Le problème est qu'il est possible lorsqu'on reparte d'un ancien plan
    mécanique que l'une des piece soit devenue obsolete.
    Donc pour éviter qu'une personne réutilise une piece obsolete, j'ai penser
    qu'il faudrait créer un attribut "référence de la piece" dans le logciciel
    de mecanique pour chaque piece.
    Ceci me permetterait d'aller chercher dans une base de donnée collective la
    reference de la piece et d'en resortir les attributs qui m'interessent
    (obsolete, designation, fabricant, ...)

    En plus, pour les nouveaux composants (qui n'aurait pas encore été validés
    et donc qui ne eseraient pas rentrés dans la base de donnée collective), je
    pensais créer des bases de données personnel pour pouvoir quand même générer
    mes tableaux.

    Il faudrait que chaque personne puisse charger les bases de données des
    autres employés (pour éviter d'avoir à créer plusieure fois le même
    composant)
    Une fois les nouveaux composants validés, il faudrait pouvoir les déplacer
    simplement de la base de donnée perso vers la base de donnée collective.

    => pensez-vous que ce système de gestion est viable ? n'y a t-il pas une
    meilleur solution ?

    Je maitrise assez bien le Vba, pensez-vous qu'Excel soit un logiciel adapté
    pour faire ce genre de choses (n'est pas une usine à gaz ?) : j'ai peur que
    niveau rapidité il soit un peu faiblard. Qu'en pensez-vous ?

    Si Excel est capable de faire efficacement ce genre de choses :
    Quel type de base de donnée faut-il que je crée (SQL, ...) ? Comment faut-il
    que je traite mes bases de données (ajout, supression, recherche,
    modification) ?

    Ma base de donnée devrait comporter au maximum 50 000 composant avec environt une vingtaine d'attribut.

    je ne connais pas grand chose en BDD mais il faut qu'elle tourne sous excel sans logiciels additionel PAYANT

  2. #2
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    Hello!
    Si tu as la suite Office, je pense que tu peux utiliser Access. 50.000 lignes, ça ne lui fait pas peur, surtout que visiblement, tu n'auras jamais de gros traitement à faire dessus.
    Et j'avoue que j'aime bien le système Excel (avec toutes les possibilité offertes par ce tableur) + Access : Chaque utilisateur a son fichier Excel, avec toute une série de formulaires et de fonctionnalités, ses onglets, ses données perso... et un fichier .mdb unique, sur lequel pointent les classeurs Excel des utilisateurs.
    J'ai fait plusieurs applications reposant sur cette architecture, et toutes marchent plutôt pas mal (modestie, quand tu nous tient...).
    L'une d'elle a une vingtaine d'utilisateurs.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    il doit y avoir une license acces 97 qui traine dans les locaux...

    Comment fonctionne exactement ton systeme : il faut créer la BDD avec acces puis avec Excel je peux faire tout ce que je veux (lire/ecrire/rechercher) ?

    Il faut que le systeme fonctionnent a partir de plusieurs postes (qui ont d'excel installés mais pas acces) : est-ce possible ?

    Ne puis-je pas créer ma base de données avec Excel tout simplement (s'affranchir d'acces) ?

    Est-ce que le faite de faire mes requetes à partir d'Excel sur BDD acces ne va pas trop ralentir les processesus ?

  4. #4
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    Oui, c'est exactement ça: depuis le poste qui a Access, tu crées ta base et tes tables , c'est à dire au final un unique fichier MaBase.mdb.
    Ensuite, les utilisateurs n'ont besoin que d'Excel sur leur poste.
    Faire ta base sur Excel, c'est possible, mais ça risque de coincer en multi-utilisateur... De plus, je ne suis pas sûr, mais je crois que 50000 lignes à gérer, pour Excel, c'est un peu chaud.
    Pour ce qui est de la vitesse d'exécution, ça dépend bien sûr des machines que tu vas utiliser, mais personnellement, je trouve ça pas mal du tout.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    Tu as besoin d'acces seulement pour créer la base : après tu peux enlever acces du poste ? puis-je deplacer ma BDD sur autre poste ?

    tu peux me donner le code vba pour :
    1- rechercher des references et en resortir les attributs pour les mettre dans mon tableau excel
    2- deplacer un element d'une BDD vers une autre (en prenant soins de vérifier qu'il n'existe pas deja dans la BDD d'arrivée)
    3- ajouter un nouveau element (en prenant soins de vérifier qu'il n'existe pas deja)
    4- supprimer un element (gerrer les erreurs s'il n'existe pas)
    5- modifier les attributs d'un element

    Comment gere t-on le multi utilisateur ?
    les BDD ne doivent être qu'en lecture seule sauf pour les propriétaires : qu'est-ce qu'il faut que je fasse ?

    remarque : pour la clef primaire, on peut utiliser la reference des pieces

  6. #6
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    Oui, une fois que ton fichier .mdb a été créé, avec la structure des tables, tu n'as plus besoin d'Access. Et ce fichier, tu pourras bien sûr le déplacer, à condition que les fichiers Excel de tes utilisateurs sachent le retrouver: c'est-à-dire que tu devras mettre le chemin d'accès à ton .mdb dans le code VBA des fichiers Excel des utilisateurs (où un moyen de le retrouver...)
    Pour le code, j'ai donné du code "générique" hier sur ce forum pour effectuer n'importe quelle requête SQL sur une base Access, je t'invite à le reprendre.
    Ensuite, ça sera à toi de gérer ce que tu veux faire exactement, je ne peux pas t'aider comme ça. Mais si tu tombes sur des problèmes précis pendant la réalisation, tu pourras t'adresser à nouveau à ce forum...
    Pour les droits, c'est pareil, tu devras gérer, en fonction de l'utilisateur (par le login d'ouverture de la session Windows, par exemple), les fonctions offertes ou non... En masquant les boutons "Modifer" ou "Enregistrer", par exemple.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    merci beaucoup pour toutes ces reponses

  8. #8
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    Alors, un petit Tag "Résolu" ?

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    j'ai essayé ce bout de code mais ADODB.Connection n'est pas reconnu : que dois-je faire ?

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Function ConnexionBase() As ADODB.Connection 
     
        Set ConnexionBase = New ADODB.Connection 
     
        'Définition du pilote de connexion 
        ConnexionBase.Provider = "Microsoft.Jet.Oledb.4.0" 
     
        'Définition de la chaîne de connexion : chemin complet du .mdb 
        ConnectStr = "Z:\BlaBlaBla\MaBaseAccess.mdb" 
        ConnexionBase.ConnectionString = ConnectStr 
     
        'Ouverture de la base de données 
        ConnexionBase.Open "Data Source=" & ConnectStr 
     
    End Function 
     
    Function MakeRequete(Requete As String) As ADODB.Recordset 
        'Debug 
        'WorkSheets("Test").Cells(10, 10).Value = Requete 
        'MsgBox ("Pause") 
     
        Dim cnx As ADODB.Connection 
     
        Set cnx = ConnexionBase() 
        Set MakeRequete = New ADODB.Recordset 
     
        'Exécution de la requête 
        MakeRequete.Open Requete, cnx 
     
    End Function 
     
    sub main()
    Dim Resultat As ADODB.Recordset 
    Dim MaRequete As String 
    MaRequete = " SELECT MAX(" & MaColonne & ") FROM " & MaTable 
    Set Resultat = MakeRequete(MaRequete) 
    end sub

  10. #10
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    Il faut que tu ajoutes, dans les références de ton projet VBA (dans l'éditeur VBA, "Outils"," références", les bobliothèques:
    Microsoft ActiveX Data Objects 2.5 Library
    Microsoft ActiveX Data Objects Recordset 2.5 Library

    Ca devrait aller mieux.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    merci ça marche.

    j'ai un peu du mal à trouver de la doc. Pour l'instant j'essaie de lire dans une BDD :
    - Comment faire pour me sortir dans une feuille excel, le contenu d'une table ?
    - Comment faire pour me sortir tous les attributs de l'element "Toto" (par exemple) et l'inscrire dans une ligne sous excel

  12. #12
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    Oui, effectivement, le code que j'ai envoyé n'est pas très performant, dans le sens ou il recrée une connexion à la base à chaque requête. Cela ne pose pas de problème dans les cas auquel j'ai été confronté, mais cela ralentit beaucoup le traitement lors d'un enchainement de nombreuses requêtes.
    Il peut être préférable de créer la connexion au début du code, et de tout fermer à la fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ConnexionBase.Close
    Set ConnexionBase = Nothing
    Set MonRecordSet = Nothing
    ...etc...
    Pour tout ça, je te propose de regarder le tutoriel de M. Curutchet, sur ce site. Il est très bien fait, tu verras, c'est dedans que j'ai appris presque tout ce que je sais.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    merci pour ton aide, je vais de ce pas regarder ce tuto...

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    rebonjours,

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    Option Explicit
     
    Sub AfficheBDD()
        Dim MaColonne As String
        Dim MaTable As String
        Dim Resultat As ADODB.Recordset
        Dim MaRequete As String
        Dim i As Integer
     
        'vide les cellules
        Cells.ClearContents
     
        MaColonne = "Référence" & ", Valeur" & ", Désignation"
        MaTable = "Essai"
     
        MaRequete = " SELECT " & MaColonne & " FROM " & MaTable
        Set Resultat = MakeRequete(MaRequete)
     
        i = 1
        Cells(i, 1).Value = "Référence"
        Cells(i, 2).Value = "Valeur"
        Cells(i, 3).Value = "Désignation"
     
        MsgBox Resultat.RecordCount
     
        'initialise le pointeur (peut éviter certains bug)
        Resultat.MoveLast
        Resultat.MoveFirst
     
        Do Until (Resultat.EOF)
            i = i + 1
            Cells(i, 1).Value = Resultat("Référence")
            Cells(i, 2).Value = Resultat("Valeur")
            Cells(i, 3).Value = Resultat("Désignation")
            Resultat.MoveNext
        Loop
     
        'Autre méthode
        'Dim Element As Variant
        'For Each Element In Resultat.Fields
        '    i = i + 1
        '    Cells(i, 1).Value = Element
        'Next Element
     
        'Resultat.FindFirst ("Référence = 'Ref1'")
        Resultat.Close
     
    End Sub
     
    Function ConnexionBase(ConnectStr As String) As ADODB.Connection
        Set ConnexionBase = New ADODB.Connection
     
        'Définition du pilote de connexion
        ConnexionBase.Provider = "Microsoft.Jet.Oledb.4.0"
     
        'Définition de la chaîne de connexion : chemin complet du .mdb
        ConnexionBase.ConnectionString = ConnectStr
     
        'Ouverture de la base de données
        ConnexionBase.Open "Data Source=" & ConnectStr
    End Function
     
    Function MakeRequete(Requete As String) As ADODB.Recordset
        Dim cnx As ADODB.Connection
     
        'Ouvre la BDD
        Set cnx = ConnexionBase("c:\echange\bd1.mdb")
     
        'Défini la variable
        Set MakeRequete = New ADODB.Recordset
     
        'Exécute la requête
        MakeRequete.Open Requete, cnx
    End Function
    j'ai une erreur "l'ensemble de lignes ne prends pas en charge les récupérations arrière" sur la ligne :
    Resultat.MoveLast
    => est-ce normale ?

    j'ai -1 qui s'affiche pour la ligne suivante :
    MsgBox Resultat.RecordCount
    => ne devrais-je pas avoir le nombre de lignes dans ma table ?

  15. #15
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    1°) Juste au passage, je t'ai donné le code de la fonction "connexionBase" un peu vite, il initialise 2 fois "connectionString". Mais ce n'est pas bien grave...
    2°) Ca me parait bizarre et dangereux d'utiliser des accents dans le nom des colonnes.
    3°) En général, avant de faire la moindre opération sur le Resultset "Resultat", je vérifie qu'il n'est pas vide. Une méthode est de vérifier qu'on est pas à la fois au début ET à la fin, en fais ant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If Resultat.EOF And Resultat.BOF Then
    ...
    Else
    ...
    End If
    Peut-être que ça te donnera des indices.

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    3°) En général, avant de faire la moindre opération sur le Resultset "Resultat", je vérifie qu'il n'est pas vide. Une méthode est de vérifier qu'on est pas à la fois au début ET à la fin
    => s'il n'y a qu'un element dans la table, la condition n'est-elle pas vrai ?

    ma table n'est pas vide : je ne comprend pas d'où viennent mes erreurs...

  17. #17
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    Non non, cette condition marche bien. Si tu t'en sers sur le résultat de ta requête, qu'est-ce que ça donne?

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    excuse moi j'ai mal intepreté EOF et BOF : ma table n'est pas detectée comme vide ????
    => peut-être que ça vient des accents sur le nom de mes champs ?(je peux pas testé ce soir vu que la personne qui à acces sur son poste est partie)
    Remarque : si j'enleve les lignes avec les erreurs, j'arrive à sortir ma table sous excel.

    j'ai essayé d'écrire dans ma base mais ça marche pas, j'ai le message :
    "le jeu d'enregistrements suivant ne prend pas pas en charge la mise à jour. Il s'agit peut-être d'une limitation du fournisseur ou du type de vérou selectionné"

    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
    21
    22
    23
    Sub AjoutBDD()
        Dim MaConnection As ADODB.Connection
        Dim MonRecordset As ADODB.Recordset
     
        Dim Requete As String
        Dim i As Integer
     
        Set MonRecordset = New ADODB.Recordset
        'MonRecordset.Open Requete, MaConnection
        MonRecordset.Open "Essai", ConnexionBase("c:\echange\bd1.mdb")
     
        MonRecordset.AddNew
     
        MonRecordset("Référence") = "Ref7"
        MonRecordset("Valeur") = "Val7"
        MonRecordset("Désigantion") = "Dés7"
     
        MonRecordset.Update
     
        MonRecordset.Close
        Set MonRecordset = Nothing
     
    End Sub
    Ma clef primaire est le champs "Référence" : n'ai je pas interet à mettre ma clef primaire sur un champs "incrementation automatique" : si oui pourquoi ?

  19. #19
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    Je continue à te décrire comment je fais: pour une insertion, je fabrique la requête SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MaRequete = "INSERT INTO " & MaTable & "(Référence, Valeur, Désignation) VALUES ('" & MaReference & "','" & MaValeur & "','" & MaDesignation & "')"
    Resultat = MakeRequete(MaRequete)
    Vérifie ma syntaxe, je l'ai écrit en direct... Mais je n'ai pas de problème avec cette méthode.

  20. #20
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    merci pour ton aide .
    ma solution fonctionne aussi mais il fallait que je modifie ceci :
    MonRecordset.Open "Essai", ConnexionBase("c:\echange\bd1.mdb"), adOpenDynamic, adLockOptimistic
    => je prefere ta solution car elle peremt d'apprendre le SQL ce qui pourra me servir si un jour je veux faire du PHP.

    Par contre j'ai enlever les accents sur mes champs et j'ai toujours l'erreur sur RecordCount => cette command compte bien le nombre de ligne ? ...aidez-moi

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [VBA]ajout liste excell
    Par Cibou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/01/2006, 17h23
  2. Gestion en vba des fichiers excel en mode multiutilisateurs
    Par kernel57 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/12/2005, 16h06
  3. [Vba] Lire BDD avec Excel
    Par Emcy dans le forum Access
    Réponses: 12
    Dernier message: 09/11/2005, 11h09
  4. [Vba] BDD : Excel + Access + Vba
    Par Emcy dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/11/2005, 10h23
  5. VBA et application Excel
    Par BonyR dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/09/2005, 09h31

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