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 :

Mise à jour de base de données


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 3
    Par défaut Mise à jour de base de données
    Bonjour

    Je fais des extractions excel d'un logiciel de l'éducation nationale.
    Avec un autre classeur, je souhaite synthétiser les données de cette extraction par l'intermédiaire de TCD et autres requêtes.

    Mon problème est que lors d'une nouvelle extraction, et donc "écrasement" de mon fichier de base de donnée, le deuxième classeur ne reconnait plus sa source ! Il n'aime pas se faire remplacer la première ligne !

    Après pas mal de temps, à lire les aides ou à fréquenter d'autres forums, j'en suis venu à vouloir passer par du VBE qui ouvrirait mon extraction, copierait à partir de la 2° ligne, ouvrirait ma base de données, collerait les données, et fermerait les deux classeurs ! ouf !

    J'y arrive presque(enfin, je crois), mais j'ai encore quelques petits problèmes.
    La première fois, cela marche bien (sauf pour la fermeture des fichiers!)
    La deuxième fois, il bloque sur le collage des données(je pense que c'est parce que le fichier n'est pas enregistré et/ou fermé !)
    C'est la ligne "activesheet.paste" !

    Voici ma macro : (j'avoue qu'il y a pas mal de vieilles lignes que j'ai essayé !)

    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
    Sub MaJExBadeDo()
    '
    ' MaJExBadeDo Macro
    ' Macro enregistrée le 09/12/2009 par secretariat2
    '
     
     
    Dim source As String
    Dim base As String
     
    source = "C:\extract.xls"
    base = "C:\badedo.xls"
     
    ' ouvrir l'extraction SCONET
    Workbooks.Open Filename:=source
    ' rendre Excel visible
    ' objExcel.Visible = False
     
    ' Copier de la ligne 2 à 2500
    Rows("2:2500").Select
    Selection.Copy
     
    ' ouvrir la base de données
    Workbooks.Open Filename:=base
    ' rendre Excel visible
    ' objExcel.Visible = True
     
    ' Coller les 2500 lignes dans la base
    Rows("2:2500").Select
    ActiveSheet.Paste
    ' Workbooks("badedo.xls").Close SaveChanges:=True
    ' Fermer les fichiers
    Workbooks.Close
     
    ' Workbooks.Close Filename:=source
     
    ' Workbooks("extract.xls").Close SaveChanges:=True
    ' Workbooks("badedo.xls").Close SaveChanges:=True
    ' fermer les documents Excel
    ' objExcel.Quit
     
    ' libérer la mémoire
    Set objExcel = Nothing
    End Sub
    J'espère ne pas avoir été trop compliqué !

    Merci

  2. #2
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Bonjour,
    Bienvenu sur le forum très jolie mise en forme mais la prochaine fois pour éviter de te fatiguer
    Regarde ici
    http://www.developpez.net/forums/d57...ation-boutons/

    une question
    Quel est l'erreur ?

    Pour la fermeture il faut préciser quel workbook
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    workbooks("extract").close true
    true pour enregistrer, false pour ne pas enregistrer rien pour laisser le choix a lutilisateur.

    sinon je te propose d'intancer tes classeur a leur ouverture
    (je tape a la voler il faudra peut être corriger la frappe)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    dim wbsource as workbook
    dim wbdest as workbook
    Dim source As String
    Dim base As String
     
    set wbsource=Workbooks.Open(Filename:=source)
    set wbdest =Workbooks.Open(Filename:=base )
     
    'en une ligne si ca fonctionne
    wbsource.worksheets(1).rows("2:2500").copy wbdest.worksheets(1).rows("2") 
    wbsource.close false
    wbdest.close true

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 3
    Par défaut Merci
    Merci à toi

    J'étais prêt à abandonner; et à passer à de la vrai programmation, mais je vais persévérer un petit peu plus !

    Même si je pense qu'excel-query-... me promet encore de belles crises de nerfs !

    Donc, ta réponse fonctionne bien !

    Deux questions, que veut dire "intancer"
    Que sont les "(1)" derrière les woorksheets ?

    A+

  4. #4
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    ouch difficile
    instancier pas intancer

    en autodidacte voici ma définition

    Je créé un objet classeur
    cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set wbdest =Workbooks.Open(Filename:=base )
    Signifie que j'ouvre le classeur destination et que wbdest va représenter (pointer vers) ce classeur.
    Du coup je peux aussi bien utiliser wbset que workbokks("leClasseur")

    edit : qu'entends tu par de la "vrai programmation" ?

    rq : on met Set pour les objet rien pour les variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim wbsource as workbook
    set wbsource =Workbooks.Open(Filename:=source)
    dim a as long
    a=1544


    Pour le numéro
    Worksheets représente la collection de toutes les feuills (worksheet) sans le s
    le numéro signifie que je prend la première de la collection Worksheets .
    J'aurais pu utiliser le nom de l'onglet et demander la feuille nommé Feuil1 dans la collection worksheets
    Si tu n'est pas familier des objet collection, etc... ben fait comme moi essaye de suivre lit des tutos un jour les choses se mettont en place dans ta tête


    Ps : si quelqu'un peux me corriger, comme dit dans ce domaine je suis autodidacte et je n'en fait que depuis quelque mois par intermitence

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    791
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 791
    Par défaut
    Avis d'une autodidacte débutante

    l'avantage de worksheets(#) par rapport a worksheets("nom") c'est qu'on est pas obligé de connaitre le nom qu'aura l'onglet à l'avance. J'ai trouvé ca plus simple d'etre sure de l'emplacement ou j'insere mon onglet (par exemple a la fin ou en premiere position :p) que du nom qu'il aura (si par exemple quelqu'un d'autre a bossé sur le fichier avant et déja créé le nom, ou si c'est juste un nom temporaire genre Sheet1 qui va avoir un n° variable selon le nbre d'onglet qu'on a déja créé dans la session)

  6. #6
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Autre solution pour parler d'un onglet est d'utiliser le codename
    qui lui ne dépend ni de la position ni du nom de longlet vu par lutilisateur sur excel. Il est donc plus difficile a modifier. Dans l'éditeur de macro c'est le nom qui n'est pas entre parenthèse dans l'arbre du projet.
    Mais je crois que l'on séloigne un peu là

    Et si c'est pour avoir ton onglet juste après l'insertion tu peux l'intencier ce qui évite tout souci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Cours pt-05]Moteur de mise à jour de base de données
    Par Papy Turbo dans le forum Sondages et Débats
    Réponses: 38
    Dernier message: 29/10/2007, 19h02
  2. Mise à Jour Champ Base de Donnée
    Par arjo54 dans le forum IHM
    Réponses: 0
    Dernier message: 10/10/2007, 15h38
  3. [MySQL] Mise à jour dynamique base de données
    Par Lili72430 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/09/2007, 12h36
  4. Requête de mise à jour - Ouverture base de données
    Par ade94 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 31/05/2007, 16h50
  5. Problème de mise à jour de base de données
    Par poirier dans le forum ASP
    Réponses: 2
    Dernier message: 26/05/2004, 11h38

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