Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1871 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [EXCEL] mise à jour d'un contenu ODBC pendant la nuit

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[EXCEL] mise à jour d'un contenu ODBC pendant la nuit

n°2341710
jojozekil
Woohoo !
Posté le 19-11-2019 à 08:10:49  profilanswer
 

Bonjour,
 
Là où je travaille notre ERP est limité au niveau du reporting. On a développé un petit fichier sous Excel 2016 qui se connecte (en lecture seule) via un connecteur ODBC à la base de données Oracle de l'ERP et nous permet un traitement derrière.
 
C'est presque propre, c'est efficace et très rapide à modifier.
 
Là où ça se corse c'est au niveau de l'automatisation de la mise à jour.
 
J'ai créé un script .VBS que j'exécute à heure fixe pendant la nuit :
1- il ouvre un fichier intermédiaire (batch.xlsm)
2- il lance la macro de mise à jour du contenu de batch.xlsm : on ouvre le vrai fichier excel et on lance la mise à jour via l'ODBC
3- il ferme les fichiers en les enregistrant
 
Le problème c'est que la mise à jour via ODBC est une tâche qui s'exécute en arrière plan. Et le fichier se referme avant que la mise à jour ne soit effective.
 
J'ai essayé de mettre une pause ou de lancer un autre script plus tard pour fermer le fichier. J'ai aussi décoché l'option de mises à jour ODBC en arrière plan, mais rien n'y fait.
 
Je passe par un fichier intermédiaire car j'ai plusieurs fichiers à mettre à jour. Je centralise les modifications dans ce fichier intermédiaire.
 
Quelqu'un pour me filer un coup de main ?
 
Merci d'avance !
 
Mon script vbs

Code :
  1. Option Explicit
  2.   REM On Error Resume Next
  3. ExempleMacroExcel
  4. Sub ExempleMacroExcel()
  5.   Dim ApplicationExcel
  6.   Dim ClasseurExcel
  7.   Set ApplicationExcel = CreateObject("Excel.Application" )
  8.   Set ClasseurExcel = ApplicationExcel.Workbooks.Open("C:\Users\jojo\Desktop\batch.xlsm" )
  9.  
  10.   ApplicationExcel.Visible = True   'les actions seront visibles. Pour tout lancer en arrière-plan, remplacer True par False
  11.   WScript.Sleep 2*60*1000
  12.   ApplicationExcel.Run "LancerBatchQuotidien" 'va lancer la macro "LancerBatch"
  13.   WScript.Sleep 5*60*1000
  14.   ApplicationExcel.Run "batch.xlsm!FermerBatchQuotidien" 'va lancer la macro "Fermer Batch"
  15. End Sub


 
Mes macros

Code :
  1. Sub LancerBatchQuotidien()
  2.     Application.DisplayAlerts = False
  3.     'Workbooks.Open Filename:="M:\Fichier de debit de Stock\10 -ETAT-STOCK-TECHNIX.xlsm"
  4.     Workbooks.Open Filename:="C:\Users\jojo\Desktop\10 -ETAT-STOCK-TECHNIX.xlsm"
  5.     Application.Run "'10 -ETAT-STOCK-TECHNIX.xlsm'!MajOdbc()"
  6.     Workbooks("batch.xlsm" ).Close SaveChanges:=False
  7. End Sub
  8. Sub FermerBatchQuotidien()
  9.     Application.DisplayAlerts = False
  10.     Workbooks("10 -ETAT-STOCK-TECHNIX.xlsm" ).Close SaveChanges:=True
  11.     Application.DisplayAlerts = True
  12.     Application.Quit
  13. End Sub


---------------
Le topic de mon feedback ici - Je suis rarement connecté le WE - Mes ventes sont également sur d'autres sites/forums
mood
Publicité
Posté le 19-11-2019 à 08:10:49  profilanswer
 

n°2341921
jojozekil
Woohoo !
Posté le 21-11-2019 à 12:26:26  profilanswer
 

Finalement j'ai réussi. Voilà le code pour ceux que ça intéresserait :
 

Code :
  1. Option Explicit
  2.   REM On Error Resume Next
  3. ExempleMacroExcel
  4. Sub ExempleMacroExcel()
  5.   Dim ApplicationExcel
  6.   Dim ClasseurExcel
  7.   Set ApplicationExcel = CreateObject("Excel.Application" )
  8.   Set ClasseurExcel = ApplicationExcel.Workbooks.Open("C:\Users\jojo\Desktop\batch.xlsm" )
  9.  
  10.   ApplicationExcel.Visible = True   'les actions seront visibles. Pour tout lancer en arrière-plan, remplacer True par False
  11.   WScript.Sleep 120000 ' Temps de sleep en millisecondes 120000 = 120 secondes = 2 minutes
  12.   ApplicationExcel.Run "MajOdbc" 'va lancer la macro "MajOdbc"
  13.   WScript.Sleep 240000 ' Temps de sleep en millisecondes 240000 = 240 secondes = 4 minutes
  14.   ApplicationExcel.DisplayAlerts = False ' on supprime les messages d'alerte sous Excel pour que l'enregistrement ne demande pas de confirmation
  15.   ClasseurExcel.Save ' on enregistre le document
  16.   ClasseurExcel.Close True ' on ferme le document
  17.   ApplicationExcel.DisplayAlerts = True ' on réactive les alertes sous Excel pour ne pas avoir d'ennuis par la suite...
  18.   ApplicationExcel.Quit ' on quitte Excel
  19. End Sub


---------------
Le topic de mon feedback ici - Je suis rarement connecté le WE - Mes ventes sont également sur d'autres sites/forums
n°2342049
rufo
Pas me confondre avec Lycos!
Posté le 24-11-2019 à 10:24:01  profilanswer
 

C'est un peu crade comme solution quand même. Si l'un des 2 scripts dépasse la tempo, tu l'as dans l'os. Tu pourrais faire que lorsqu'un script de traitement débute, il écrit dans un fichier temporaire. Le script qui attend va lire toutes les x secondes le fichier. Dès qu'il n'existe plus, il peut passer à l'étape suivante. C'est une sorte de sémaphore. Je ne sais pas si ça existe en VBA ce type d'objet mais si oui, ça serait mieux que ma solution. ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2342066
jojozekil
Woohoo !
Posté le 25-11-2019 à 11:47:55  profilanswer
 

Merci pour ta réponse Rufo
 
Je sais que c'est pas le top, mais je ne sais pas comment faire autrement.
 
En réalité la première temporisation est inutile, car vbs attend que le fichier soit ouvert pour poursuivre.
 
La base de mon problème c'est que je n'ai aucune information qui me prévient lorsque la mise à jour via l'ODBC se termine.  C'est un process qui se lance en parallèle à Excel et qui vit sa vie de son côté. J'ai mesuré qu'il fallait une à deux minutes pour que mes mises à jour se fassent. Vu que ça tourne la nuit je vais lui laisser 30 minutes comme ça je suis très large.
 
Ça n'empêche pas que si quelqu'un a laissé ouvert le fichier sur le réseau, il va s'ouvrir en lecture seule et je ne le saurais pas...
 
Après au pire mes informations ne seront pas actualisées automatiquement de nuit, je pourrais toujours le faire manuellement. Ça aide à fluidifier les choses, mais si ça ne se fait pas il n'y aura pas de conséquences dramatiques.
 
Mais bon, si tant qu'à faire je peux faire un truc vraiment au poil...


Message édité par jojozekil le 25-11-2019 à 11:59:00

---------------
Le topic de mon feedback ici - Je suis rarement connecté le WE - Mes ventes sont également sur d'autres sites/forums

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [EXCEL] mise à jour d'un contenu ODBC pendant la nuit

 

Sujets relatifs
Macro pour copier un tableau avec mot cle de word vers excel et dispatExcel VBA : fonction indiquant #value au démarrage
Exporter une feuille excel vers un nouveau classeur en filtrantJQuery: sélectionner sur un contenu
VBA Excel, TextBox qui ne fonctionne pas.Macro Excel à executer sur une cellule selectionné
Erreur code Formulaire de saisie excelafficher contenu d'un dossier FTP sur une page
Script qui récupère données fichier Excel vers documentExport mails dans Excel
Plus de sujets relatifs à : [EXCEL] mise à jour d'un contenu ODBC pendant la nuit


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR