[RESOLU] Comment lancer excel en mode batch ?

Comment lancer excel en mode batch ? [RESOLU] - VB/VBA/VBS - Programmation

Marsh Posté le 23-05-2006 à 09:13:45    

Bonjour tout le monde,
 
Je vous explique ce que je veux faire :
J'ai des données statistiques qui me sont produites en batch que j'aimerais rentrer dans excel et faire un graphe qui les représente, puis sortir le graphe sur une page html pour publier sur le site web. Et tout ça en mode batch.
 
Alors j'ai réussi à créer un macro sous excel, qui s'exécute au lancement et me permet d'importer les données et le faire le graphe, puis me le sauvegarder dans un fichier .html.
 
Quand je lance excel.exe <fichier> il me lance carrément excel en mode graphique.
 
Alors ma question: comment lancer excel en ligne de commande en mode batch sans ouvrir l'interface graphique ?
 
Merci d'avance de votre aide.


Message édité par mimi278 le 13-06-2006 à 10:22:51
Reply

Marsh Posté le 23-05-2006 à 09:13:45   

Reply

Marsh Posté le 23-05-2006 à 23:01:44    

Excel ne s'utilise pas en « ligne de commande ».
Le seul mode qui peut t'intéresser est l'utilisation de l'OLE Automation qui permet d'instancier un objet Excel.Application et de travailler avec (en mode invisible).
Fais des recherches sur le forum, d'autres ont fait ce genre de chose.


Message édité par tegu le 23-05-2006 à 23:02:04
Reply

Marsh Posté le 30-05-2006 à 00:58:41    

Merci beaucoup Tegu,
 
Depuis ta réponse j'ai pas arrêté de chercher depuis 2 jours dans cette direction mais en vain ...  
J'ai trouvé des bouts de code dans les posts et aussi sur des sites (exceltip) ...qui permettent de faire plein de chose avec les macros excel.
 
Pour ce que je dois faire, j'ai trouvé grosso modo à faire un macro dans ce style
 
sub lanceExcel()
{
dim xlAppl as Object
 
xlAppl = CreateObject("Excel.Application" )
 
... puis open the workbook qui est le fichier .xls
après tout doit bien aller pour moi car j'ai fais un macro qui s'exécute au lancement du .xls
...
}
 
Le problème c'est encore un macro VBA ... comment puis je l'exécuter depuis mon .bat ???
J'ai rien compris et ne sais plus où chercher, car partout on voit "pilolter excel depuis word" ... excel depuis access ....excel and outlook ... mais jamais excel and dos !!!
 
Comment dois je faire, me payer une application VBA pour l'exécuter la macro en l'ouvrant "graphiquement"  ???? ou existe t-il qq chose pour l'exécuter ce macro ...???
 
J'ai aussi vu quelqu'un lancer excel depuis son script perl ... est-ce une bonne solution ?, en tout cas dans mon brouillard je ne vois que ça comme solution. Faut que je me lance dans le download du perl et ... essayer le reste.
 
Please qqu'un veut bien éclaircir ma lanterne ... je suis au bout de mes recherches .. et voyez vous il est 1h ... suis encore depuis .. enfin assise à la recherche ...
 
Thank in advance.


Message édité par mimi278 le 30-05-2006 à 01:06:08
Reply

Marsh Posté le 30-05-2006 à 01:07:54    

bonne nuit


Message édité par mimi278 le 30-05-2006 à 01:08:46
Reply

Marsh Posté le 30-05-2006 à 10:03:27    

Je n'ai pas été clair je crois : tu ne peux pas piloter Excel via des commandes DOS ou lignes de commande.
Si tu veux utiliser OLE pour masquer l'interface d'Excel, regarde du côté du VBScript. C'est en fait un langage d'administration windows ayant une syntaxe semblable à VBA, donc qui permet OLE. Et c'est l'équivalent moderne des lignes de commande DOS.

Reply

Marsh Posté le 30-05-2006 à 10:08:32    

Merci Tegu,
 
Et VBScript, comme tu dis est un langage d'administration de window, on peut le lancer depuis un .bat ou pas ? Excuse moi si ma question était idiote.
 
Si oui je vais me lancer dans la recherche du VBScript.
Merci encore.

Reply

Marsh Posté le 30-05-2006 à 10:26:56    

Tu peux lancer le script de manière autonome, comme un .bat.
Windows le reconnaît comme un exécutable (sauf désactivation explicite pour raison de sécurité).
Tu dois aussi pouvoir le lancer à partir d'un .bat (via start ?) mais c'est de l'extrapolation là.

Reply

Marsh Posté le 30-05-2006 à 10:34:16    

OK OK merci beaucoup, t'es bien sympa de répondre.
 
Je vais essayer de me lancer dans le VBScript (ça ne doit pas être très différent de VBA !).
 
Après je vais aussi lancer ce script depuis un .bat.
Je fais ça parce ce que ma procédure de batch l'exige, mon batch exécute une certaine routine (QACPP pour info) et génère des données qui doivent être ensuite traitées (par script awk) puis charger dans excel pour générer un graphique, qui ensuite doit être envoyé automatiquement par outlook.
 
Comme ça le chef en arrivant le matin au bureau il a son joli petit graphe !!!
 
Merci beaucoup pour ton aide, je reviens pour informer de mon avancement.

Reply

Marsh Posté le 30-05-2006 à 10:41:42    

Oh j'ai oublié de demander ...
Pour VBScript il faut avoir l'application VB installé ou pas ? C.a.d il faut l'acheter c'est ça ?
Ou c'est par défaut dans window ? Je suis en XP. Y a t-il une différenciation entre les différentes versions window ?

Reply

Marsh Posté le 30-05-2006 à 10:44:24    

exemple (sans le graphique, là tu vas en chier, c'est la tanée à faire en script) :
 

Code :
  1. Option Explicit
  2. ' Titre : DS2XLS
  3. ' Auteur : MagicBuzz
  4. ' Version : 1.0
  5. ' Date : 10-05-2006
  6. '
  7. ' Script VBS qui génère un document Excel à partir d'un extract "ToXml()" d'un Objet DataSet de .NET
  8. ' Ce script est censé fonctionner sur n'importe quelle version de Windows, et n'importe quelle version d'Excel
  9. ' Bon, rien n'est garanti non plus hein...
  10. ' Constantes
  11. ' Ces GUID génériques ont l'avantage d'être idetiques pour toutes les versions
  12. ' Il faut alors faire confiance à Microsoft pour ne pas changer la structure des objets d'une version à l'autre
  13. Const EXCEL_GUID = "Excel.Application"
  14. Const MSXML_GUID = "MSXML.DOMDocument"
  15. ' Méthodes
  16. Sub Main()
  17.     ' Excel objects
  18.     Dim xls
  19.     Dim wkb
  20.     Dim sht
  21.    
  22.     ' DOM objects
  23.     Dim dom
  24.     Dim declaration
  25.     Dim table
  26.     Dim colonne
  27.     Dim ligne
  28.    
  29.     ' Common variables
  30.     Dim args
  31.     Dim filename
  32.     Dim tabName
  33.     Dim arrColonnes()
  34.    
  35.     ' Compteurs
  36.     Dim i
  37.     Dim j
  38.    
  39.     ' On récupère le nom du fichier XML à traîter
  40.     Set args = WScript.Arguments
  41.    
  42.     If args.Count <> 1 Then
  43.         MsgBox("Nombre d'arguments incorrects : 1 attendu" )
  44.         Exit Sub
  45.     End If
  46.     filename = args(0)
  47.    
  48.     ' Création d'une instance d'Excel
  49.     Set xls = CreateObject(EXCEL_GUID)
  50.     ' On ne l'affiche pas
  51.     'xls.Visible = True
  52.    
  53.     ' Ajout d'un espace de travail (par défaut, Excel s'ouvre vide)
  54.     Set wkb = xls.Workbooks.Add()
  55.    
  56.     ' L'espace de travail contient de base 3 sheets. On en vire deux et on renomme la dernière
  57.     ' En effet, un espace de travail doit au moins toujours contenir une feuille...
  58.     For i = wkb.WorkSheets.Count To 2 Step -1
  59.         wkb.WorkSheets(i).Delete
  60.     Next
  61.     wkb.WorkSheets(1).Name = "tmpSheet"
  62.    
  63.     ' Ouverture du document XML contenant les données du dataset à sauvegarder
  64.     Set dom = CreateObject(MSXML_GUID)
  65.     dom.Load filename
  66.    
  67.     ' Recherche du tag de description des DataTables
  68.     Set declaration = dom.DocumentElement.SelectNodes("xs:schema/xs:element/xs:complexType/xs:choice/xs:element" )
  69.    
  70.     ' C'est parti !
  71.     For Each table In declaration
  72.         tabName = GetAttributeByName(table, "name" )
  73.         Set sht = wkb.WorkSheets.Add()
  74.         sht.Name = tabName
  75.         ReDim arrColonnes(1)
  76.         i = 0
  77.         For Each colonne In table.SelectNodes("xs:complexType/xs:sequence/xs:element" )
  78.             i = i + 1
  79.             ReDim Preserve arrColonnes(i)
  80.             ' En-tête
  81.             arrColonnes(i) = GetAttributeByName(colonne, "name" )
  82.             sht.Cells(1, i).Value = GetAttributeByName(colonne, "name" )
  83.             sht.Cells(1, i).Interior.ColorIndex = 36
  84.             sht.Cells(1, i).Font.Bold = True
  85.             ' Formattage du type de la colonne
  86.             Select Case GetAttributeByName(colonne, "type" )
  87.                 Case "xs:string"
  88.                     sht.Columns(i).NumberFormat = "@"
  89.                 Case "xs:decimal"
  90.                     sht.Columns(i).NumberFormat = "0.00"
  91.                 Case Else
  92.                     ' Ouais, ben désolé, moi je me sert que de string et decimal...
  93.                     sht.Columns(i).Interior.ColorIndex = 3
  94.                     MsgBox("Type inconnu : " & GetAttributeByName(colonne, "type" ))
  95.             End Select
  96.         Next
  97.        
  98.         ' Maintenant, on parcours l'ensemble des éléments correspondant au datatable en cours de lecture
  99.         j = 1
  100.         For Each ligne In dom.DocumentElement.SelectNodes(tabName)
  101.             j = j + 1
  102.             For i = 1 To UBound(arrColonnes)
  103.                 ' On recopie bêtement le contenu du tag portant le nom de la colonne désirée
  104.                 sht.Cells(j, i).Value = ligne.SelectSingleNode(arrColonnes(i)).Text
  105.             Next
  106.         Next
  107.        
  108.         ' Ca c'est pour faire joli (si faire se peut)
  109.         sht.Columns.EntireColumn.AutoFit
  110.     Next
  111.    
  112.     ' Vous vous rappelez de la sheet renommée ? Ben on la zigouille maintenant
  113.     wkb.WorkSheets("tmpSheet" ).Delete
  114.    
  115.     ' On indique qu'on ferme l'espace de travail en enregistrant le document (une popup d'enregistrement apparaît)
  116. '    wkb.Close(true)
  117.    
  118.     ' On quitte Excel
  119. '    xls.Quit
  120.     xls.Visible = True
  121. End Sub
  122. Function GetAttributeByName(node, attributeName)
  123.     ' Impossible d'utiliser les collections nommées en VBS. Du coup on fait avec les moyens du bords...
  124.     Dim tmpRet
  125.     Dim att
  126.     tmpRet = ""
  127.     For Each att in node.attributes
  128.         If att.Name = attributeName Then
  129.             tmpRet = att.Value
  130.             Exit For
  131.         End If
  132.     Next
  133.    
  134.     GetAttributeByName = tmpRet
  135. End Function
  136. ' Démarrage du programme
  137. Call Main()


 
J'utilise ce petit script depuis une application en C# afin de faire un extract sous Excel de données stockées dans un fichier XML au format "dataset", quelle que soit la version d'Excel.
 

Reply

Marsh Posté le 30-05-2006 à 10:44:24   

Reply

Marsh Posté le 30-05-2006 à 10:45:17    

Sinon, les programmes VBS et JS peuvent être exécutés directement sous Windows depuis Windows 95 avec Internet Explorer 4 (ou NT 4 avec IE 4 / Option Pack 4)
 
Depuis une ligne de commande, tu peux le démarrer avec l'une de ses commandes :
 


-- REM Marche sous Win2K3 et WinXP. Pas sur que ça marche avec les versions antérieures
start toto.vbs
 
-- Marche dans tous les cas, mais tu dois être sur que l'intepréteur de scripts est bien wscript (ça peut aussi être wscript, qui utilise l'interface windows et non console)
cscript toto.vbs


Message édité par Arjuna le 30-05-2006 à 10:49:57
Reply

Marsh Posté le 30-05-2006 à 15:48:14    

TOP COOOOOOOOOOOOOOLLLLLLLLLLL .... Merci les mecs, milles bises
 
Alors maintenant je peux piloter mon excel depuis DOS .bat ... de 2 manières :
- soit par VBScript (merci Arjuna)
=> cscript piloteExcel.vbs
 
- soit par Perl (merci le post de specis)
=> perl piloteExcel.pl
 
Comme dans mon excel, j'ai fais la macro qui s'exécute à l'ouverture du fichier excel, je n'emballe pas du code de traitement excel dans le script qui suit.
 
piloteExcel.vbs
 
>>>
Const EXCEL_GUID = "Excel.Application"
 
' Méthodes
Sub Main()
 ' Excel objects
 Dim wkb
     
 ' Création d'une instance d'Excel
 Set xls = CreateObject(EXCEL_GUID)
 
 ' On ne l'affiche pas
 'xls.Visible = True
 
 ' Ajout d'un espace de travail (par défaut, Excel s'ouvre vide)
 Set wkb = xls.Workbooks.Open("C:\\MyExcel.xls" )
 
 ' On indique qu'on ferme l'espace de travail en enregistrant le document (une popup d'enregistrement apparaît)
 wkb.Close(true)
 
 ' On quitte Excel
 xls.Quit
 xls.Visible = True
End Sub
 
' Démarrage du programme
Call Main()  
 
>>>
 
Et voici le code de piloteExcel.pl
 
>>>>
 
#!/usr/bin/perl -w
#Prototypes
sub main;
sub excelmacro;
 
###############################################################################
# MAIN ROUTINE
###############################################################################
 
# Launching the main routine;
&main;
 
sub main
{
    # Executing the main routine
    excelmacro;
 }
 
sub excelmacro{  
  print "Macro\n";  
  #my ($num) = @_;  
  use Win32::OLE qw(in with);  
  use Win32::OLE::Const 'Microsoft Excel';  
  $Win32::OLE::Warn = 3;                                # die on errors...  
  my $Excel = Win32::OLE->GetActiveObject('Excel.Application')  
      || Win32::OLE->new('Excel.Application', 'Quit');   # get already active Excel  
                                                     # application or open new  
  $filename = "MyExcel.xls";  
        print "$filename\n";  
        my $Book = $Excel->Workbooks->Open("Q:\\Batch\\$filename" );  
 
        print "run update_query\n";
  #je met en commentaire car mon macro s'execute à l'ouverture de MyExcel.xls
  #$Excel->Run("nom macro" );  
  $Book->Close;  
 }# end macro
 
>>>>
 
 
J'ai testé les 2 cas et ça marche nicken ... TROP CONTENT !!!!!!
 
BISES encore à tout ceux qui m'ont aidé.
Merci Tegu pour m'avoir mis sur cette voie.
Bye.

Reply

Marsh Posté le 06-06-2006 à 10:45:12    

oulala moi j'ai un probleme similaire.. mais je ne suis pas developpeur, j'ai essayé de copier le pilot_excel.vbs mais il fé que dalle..  
 
moi mon pb c qu'il faudrait que j'execute une macro XLA sur un fichier CVS donné, et generer au format HTML le resultat
 
quelqu'un peut m'aider ? :$

Reply

Marsh Posté le 06-06-2006 à 10:51:06    

Bien sûr qu'il marche et "il fé que dalle ..." si tu n'as pas de macro dans le fichier excel qui s'exécute à l'ouverture du fichier !
 
Alors après la ligne d'ouverture du fichier excel il faut ajouter l'exécution de la macro si tu n'as pas de macro qui s'exécute automatiquement à l'ouverture :
 
 
xls.Run("LaMacro" )
 
Voilà.

Reply

Marsh Posté le 06-06-2006 à 11:03:33    

:p je profite de tes connaissances...  
 
et pour sauvegarder le tout en HTML aurais tu la ligne qui va bien ?
 
MErci  encore !!

Reply

Marsh Posté le 06-06-2006 à 11:33:21    

[quotemsg=1381876,15,179949]:p je profite de tes connaissances...  
 
Ca coûte cher ça !
 
Moi je connais rien en excel donc pour faire qqchose je fais enregistrer un macro, comme ça j'ai mon bout de code après.
 
Donc rien que pour toi !!! j'ai fais enristrer un macro qui sauvegarde en .html ...
 
Sub html()
'
' html Macro
' Macro enregistrée le 06/06/2006 '
 
'
    ActiveWorkbook.SaveAs Filename:= _
        "C:\Documents and Settings\toto\Mes documents\Classeur1.htm", FileFormat:= _
        xlHtml, ReadOnlyRecommended:=False, CreateBackup:=False
End Sub
 
Bien sur si c'est pas ActiveWorkbook tu mets le nom de ton book.
 
Voili voilou

Reply

Marsh Posté le 06-06-2006 à 15:41:26    

bas je m'en sors pas :  
 
la macro sous excel se lance via le mot "RAO" dans macro>lancer
je lance ca cscript .....vbs
ca me rend la main quasi direct :S
 
Const EXCEL_GUID = "Excel.Application"
 
' Méthodes
Sub Main()
 ' Excel objects
 Dim wkb
     
 ' Création d'une instance d'Excel
 Set xls = CreateObject(EXCEL_GUID)
 
 ' On ne l'affiche pas
' xls.Visible = True
 
 ' Ajout d'un espace de travail (par défaut, Excel s'ouvre vide)
 Set wkb = xls.Workbooks.Open("D:\\M3A7X001_IFSU771J_2006-01-06.csv" )
 
'  Ici il faut coller les trucs a executer...
xls.Run("RAO" )
ActiveWorkbook.SaveAs Filename= "D:\\les_RAO.htm", FileFormat= xlHtml, ReadOnlyRecommended=False, CreateBackup=False  
 ' On indique qu'on ferme l'espace de travail en enregistrant le document (une popup d'enregistrement apparaît)
 wkb.Close(true)
 
 ' On quitte Excel
 xls.Quit
 xls.Visible = True
End Sub  
 

Reply

Marsh Posté le 06-06-2006 à 15:46:40    

Mais ... tu fais exprès ou koi ?
 
Ta macro de sauvegarde en html, selon moi qui ne connais rien, est dans une macro  comme je te montre.
 
Soit tu ajoute la ligne dans ta macro RAO soit tu fais une macro global qui appelle ta macro RAO et la macro d'enregistrement.
Tu restes sous excel et exécute tes macros jusqu'à satisfaction et fais en sorte qu'il y a une macro global à exécuter dans VBs ou alors tu exécute dans VBs successivement tes macros précédemment testées ....
 
Bon essaies de bien bosser!

Reply

Marsh Posté le 06-06-2006 à 15:51:25    

mimi278 > j'ai rien compris, mais ça doit être ça :D chuis trop dans le pâté pour décoder ;)

Reply

Marsh Posté le 06-06-2006 à 15:59:31    

Arjuna a écrit :

mimi278 > j'ai rien compris, mais ça doit être ça :D chuis trop dans le pâté pour décoder ;)


 
T'as trop bu ?
 
Mais c'est toi ou Ghost... qui a des pbs ?
 
Je m'explique mieux :
 
Alors pour faire ce que je veux faire en VBA, je commence par aller dans macro et créer une nouvelle macro ... ensuite je commence ma série d'action ... comme par exemple "importer les données" le fichier .cvs (sais pas ce que c'est comme fichier moi) puis faire les traitements sur ce fichier ... puis cliquer sur save as ...fichier.html puis j'arrêtre l'enregistrement de la macro.
Après tout ça tu as la macro qui va bien, essaies d'exécuter ce macro pour voir si ça te convient. Une fois que c'est bon, tu l'exécutes depuis le script VB.
 
Voilà je peux pas expliquer mieux que ça et y a pas plus simple à faire je pense.
Bye

Reply

Marsh Posté le 06-06-2006 à 16:49:34    

moi j'ai pas de problème.
je sais exactement ce que tu as dit (juste que c clair comme un combat de nègres dans un tunel)
je faisais des macros excel que tu jouais encore avec ton caca :o :p
 
ps: et moi je passe pas par l'enregistreur de macro, ça génère un code tout pourri qui met en valeur des méthodes qui sont souvent bien plusbridées que la solution propre. on va dire que ça dépanne au début, mais sans plus :)
 
(genre, toujours bosser sur la selection en cours... rien de tel pour faire rammer un PC pendant deux heures quand une macro correctement écrite dure 10 ms :D)


Message édité par Arjuna le 06-06-2006 à 16:51:22
Reply

Marsh Posté le 06-06-2006 à 16:53:36    

lol j'y arrive po
en fait ct le sub qui faisait que le code etait pas lancé
j'ai donc viré au début et à la fin :)  
le probleme à présent :
pilot_excel.vbs(18, 1) Microsoft Office Excel: Impossible de t
rouver la macro 'RAO'.
pourtant quand je lance excel, que je charge mon cvs et que je fais ALT+F8, je tape bien RAO ...
et dans VBeditor, il s'agit d'un "module" Module1
j'ai essayé tout un tas de combinaisons san succes...
 
y a pas un bon editeur de code VBS ? pour debugger + facilement ??

Reply

Marsh Posté le 06-06-2006 à 17:00:56    

Dans excel tu peux cliquer sur l'éditeur VBA  Outils/Macros/Visual Basic Editor là tu as accès à tes macros ..
 
Sinon regards bien si ta macro est bien dans le fichier excel que tu ouvres ?
Le module1 dont tu parles se trouve bien dans xxx.xls que tu ouvres dans VBs ?

Reply

Marsh Posté le 06-06-2006 à 17:03:57    

c est une macro complementaire, elle existe pour tout fichier ouvert
elle est pas liée à mon fichier, enconre moins là ou c est un CVS...

Reply

Marsh Posté le 06-06-2006 à 17:05:45    

Bon là ca dépasse "mes compétences", faut être que tu crées un autre post pour ton pb.
Bon courage

Reply

Marsh Posté le 06-06-2006 à 17:06:15    

merci :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed