Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Changer du VBA en VBS

28 réponses
Avatar
vswildcat
Bonjour,

Après avoir torturer Excel en long en large et en travers, je passe au
"vraies" base de données (c...gnos pour ne pas le citer)

J'ai besoin de faire un script qui va enregistrer un fichier en excel (avec
la date du jour), à un endroit précis, puis l'envoyer par mail.

Je sais faire ça dans Excel, donc, en VBA, mais, afin de ne pas avoir à lire
des pages et des pages de documentation, je me demandais s'il était possible
de "convertir" (automatiquement s'entend) du VBA en VBS ?

Je sais, question de feignasse... Je vais me mettre au VBS, mais si je
pouvais avoir un peu d'aide pour démarrer...

A tout hasard, je vous donne ma macro en VBA :

Private Sub CommandButton1_Click()

Dim LaDate As String
Dim NomClasseur As String

LaDate = Format(Date, "ddmmyyyy")
NomClasseur = LaDate & ".xls"

ActiveWorkbook.SaveAs Filename:= _
"C:\Mes Documents\TESTS\fic1_" & NomClasseur _
, FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False

ActiveWorkbook.SendMail "blabla@crétin.fr", "test envoi mail"
ActiveWorkbook.Close False

End Sub

J'ai installé un petit plug-in qui évite le warning Outlook, donc, ça
fonctionne.

Sauf que je ne peux pas conserver ça en VBA puisqu'il faut que la macro
(donc le script) tourne avant d'enregistrer le fichier en Excel (puisqu'il
faut que la date soit dans le nom du fichier). C'est possible dans l'outil de
base de données, mais évidement, il ne comprend que le "vrai" script VB, pas
le VBA...

J'espère que mon message est clair, et qu'une (ou plusieures) âme charitable
pourra m'aider.

Vswildcat

10 réponses

1 2 3
Avatar
Stephane
J'espère que mon message est clair, et qu'une (ou plusieures) âme charitable
pourra m'aider.

Vswildcat



Charitable je ne sais pas mais c'est un juste reout des choses que j'ai
pu apprendre ici et ailleurs au fil du temps. Ce sont des bouts de
programme qui pourront t'aider

Stephane

Pour ODBC:
Set odbc = CreateObject("ADODB.Connection")
odbc.open "UID=toto;PWD=toto;DSNÚtabase;"
Set resultat = odbc.execute("SELECT * ...")

'EXCEL
Set oXL = WScript.CreateObject("EXCEL.application")
oXL.Workbooks.Open(FIC_ORIGINE)
'oXL.Visible = True
'oXL.screenupdating=True
oXL.Visible = False
oXL.screenupdating = False
oXL.Sheets(1).Select
oXL.Cells(NumL,NumC).Value = FormatDateTime(Date, 1)
oXL.cells(1,1).select
oXL.ActiveWorkbook.SaveAs nomFic
oXL.ActiveWorkbook.close

'Fichiers
For each oFile In oSubFolder.Files
If InStr(UCase(oFile.Name), "RAL_") > 0 Then
nomFic = oFile.path
oFile.delete

Avatar
Stephane
J'oubliai pour la messagerie va voir Blat il fait ca très bien.

arg = fPARAM&" -to -server smtp.toto.fr -f_
-subject ""coucou "" -attach contenu.xls"
Set shell = CreateObject("WScript.Shell")
retour = shell.Run("Blat "&arg,8,True) 'Attend la fin de l'envoie du
'mail, Affiche la fenêtre dans son état actuel. La fenêtre active reste
'active.


sinon avec Outlook c'est du genre:
Set oEmail = CreateObject("CDO.Message") 'Utilise oEmail.From =
""
oEmail.Subject = objet
oEmail.Textbody = "blabla"
oEmail.Subject = objet
'oEmail.AddAttachment pj
oEmail.To = sMAILEXP & ";" & adrEmail
oEmail.Send


Voilà t'as plus qu'à bosser.
Avatar
Stephane
J'oubliai pour la messagerie va voir Blat il fait ca très bien.

arg = fPARAM&" -to -server smtp.toto.fr -f
-subject ""coucou "" -attach contenu.xls"
Set shell = CreateObject("WScript.Shell")
retour = shell.Run("Blat "&arg,8,True) 'Attend la fin de l'envoie du
'mail, Affiche la fenêtre dans son état actuel. La fenêtre active reste
'active.


sinon avec Outlook c'est du genre:
Set oEmail = CreateObject("CDO.Message") 'Utilise oEmail.From ""
oEmail.Subject = objet
oEmail.Textbody = "blabla"
oEmail.Subject = objet
'oEmail.AddAttachment pj
oEmail.To = sMAILEXP & ";" & adrEmail
oEmail.Send


Voilà t'as plus qu'à bosser.
J'avais oublié un '_' sur la première ligne de code

Stephane
Avatar
vswildcat
C'est un début :-)

Pour ODBC: à priori pas besoin, j'utilise le scheduler (programmateur de
tâches 'intégré') de l'Application pour déclencher et créer mon rapport (en
.imr).
Le scheduler va jusqu'à l'enregistrement en Excel (en .xls)

Pour EXCEL :
Dans l'idéal, j'aimerai carrément me passer d'Excel...

J'aimerai pouvoir mettre le script directement dans l'Application avec
laquelle je genère mes rapports.

On m'a donner un exemple de fichier en .bat, avec ces lignes de codes :

-------------------------------------------------------

set FileDate=%date:~11,4%%date:~8,2%%date:~5,2%
rename c:temptotto.xls totto_%FileDate%.xls

-------------------------------------------------------

Autant le deuxième ligne ça va, autant la première... Si on pouvait la
décoder pour moi... J'aimerai comprendre, afin de pouvoir réutiliser ensuite.

Après, il ne me restera plus qu'à trouver comment programmer l'envoi par
mail :
J'ai trouvé ça (merci scraper) :

----------------------------------------------------------
Option Explicit

Dim objMail

Set objMail = CreateObject("CDO.Message")

objMail.From = ""
objMail.To = ""
objMail.Subject = "test"
objMail.Textbody = "coucou"
objMail.AddAttachment "Chemin_complet_de_ta_PJ"
objMail.Send

Set objMail=Nothing
wscript.quit

----------------------------------------------------------

Mais :

- Comme je ne comprend pas la moitié du code, je ne sais pas comment "lier"
ces deux scripts

- J'ai un souci au niveau du nom de la pièce jointe puisqu'il va changer
tous les jours (je suppose qu'il doit être possible d'utiliser
totto_%FileDate%.xls qui a été créé auparavant...)

- Ensuite, il ne me restera plus qu'à trouver où enregistrer ce .bat pour
qu'il fonctionne (au fait, .bat, c'est quoi ?)

Voilà, j'espère que ça peut aider... à m'aider :-)

En tout cas merci pour ces quelques exemple de lignes de code, elles
pourraient effectivement m'être utiles.

Vswildcat



J'espère que mon message est clair, et qu'une (ou plusieures) âme charitable
pourra m'aider.

Vswildcat



Charitable je ne sais pas mais c'est un juste reout des choses que j'ai
pu apprendre ici et ailleurs au fil du temps. Ce sont des bouts de
programme qui pourront t'aider

Stephane

Pour ODBC:
Set odbc = CreateObject("ADODB.Connection")
odbc.open "UID=toto;PWD=toto;DSNÚtabase;"
Set resultat = odbc.execute("SELECT * ...")

'EXCEL
Set oXL = WScript.CreateObject("EXCEL.application")
oXL.Workbooks.Open(FIC_ORIGINE)
'oXL.Visible = True
'oXL.screenupdating=True
oXL.Visible = False
oXL.screenupdating = False
oXL.Sheets(1).Select
oXL.Cells(NumL,NumC).Value = FormatDateTime(Date, 1)
oXL.cells(1,1).select
oXL.ActiveWorkbook.SaveAs nomFic
oXL.ActiveWorkbook.close

'Fichiers
For each oFile In oSubFolder.Files
If InStr(UCase(oFile.Name), "RAL_") > 0 Then
nomFic = oFile.path
oFile.delete




Avatar
Jacques Barathon [MS]
"vswildcat" wrote in message
news:
...
On m'a donner un exemple de fichier en .bat, avec ces lignes de codes :

-------------------------------------------------------

set FileDate=%date:~11,4%%date:~8,2%%date:~5,2%
rename c:temptotto.xls totto_%FileDate%.xls

-------------------------------------------------------

Autant le deuxième ligne ça va, autant la première... Si on pouvait la
décoder pour moi... J'aimerai comprendre, afin de pouvoir réutiliser
ensuite.


Tape "set /?" dans une invite de commande pour avoir l'aide de la commande
set. Il y est notamment question de la syntaxe utilisée dans cette ligne.

...
- Ensuite, il ne me restera plus qu'à trouver où enregistrer ce .bat pour
qu'il fonctionne (au fait, .bat, c'est quoi ?)


Euh, tu veux savoir ce que veut dire BAT? C'est une abrévation pour Batch,
qui lui-même vient de l'expression Batch Job utilisée en exploitation
informatique pour désigner les traitements par lot. L'extension .BAT est
utilisée depuis l'époque du DOS pour décrire les fichiers de commandes à
exécuter par lot, c'est-à-dire de manière groupée (on dirait des "scripts"
de nos jours).

Donc, un fichier .BAT est un script qui sera exécuté par l'interpréteur de
commandes standard. Sous DOS (inclus Windows 9x/Me), il s'agit de
command.com. Sous Windows NT/2000/2003/XP/Vista, il s'agit de cmd.exe. Avec
cmd.exe une autre extension est utilisée: .cmd. A très peu de choses près il
s'agit du même type de fichier.

Maintenant, à toi de voir si ton application supporte l'exécution de
fichiers .BAT. Le contraire me surprendrait car il s'agit vraiment du niveau
zéro du scripting système et certainement le plus utilisé encore de nos
jours tant il est à la fois simple et rapide à mettre en oeuvre et
extrêmement versatile grâce à son accès immédiat à n'importe quel exécutable
disponible sur le système.

Jacques

Avatar
jbongran
vswildcat wrote:
C'est un début :-)

Pour ODBC: à priori pas besoin, j'utilise le scheduler (programmateur
de tâches 'intégré') de l'Application pour déclencher et créer mon
rapport (en .imr).
Le scheduler va jusqu'à l'enregistrement en Excel (en .xls)

Pour EXCEL :
Dans l'idéal, j'aimerai carrément me passer d'Excel...

J'aimerai pouvoir mettre le script directement dans l'Application avec
laquelle je genère mes rapports.

On m'a donner un exemple de fichier en .bat, avec ces lignes de codes
:

-------------------------------------------------------

set FileDate=%date:~11,4%%date:~8,2%%date:~5,2%
rename c:temptotto.xls totto_%FileDate%.xls

-------------------------------------------------------

Autant le deuxième ligne ça va, autant la première... Si on pouvait la
décoder pour moi... J'aimerai comprendre, afin de pouvoir réutiliser
ensuite.

Après, il ne me restera plus qu'à trouver comment programmer l'envoi
par mail :
J'ai trouvé ça (merci scraper) :

----------------------------------------------------------
Option Explicit

Dim objMail

Set objMail = CreateObject("CDO.Message")

objMail.From = ""
objMail.To = ""
objMail.Subject = "test"
objMail.Textbody = "coucou"
objMail.AddAttachment "Chemin_complet_de_ta_PJ"
objMail.Send

Set objMail=Nothing
wscript.quit

----------------------------------------------------------

Mais :

- Comme je ne comprend pas la moitié du code, je ne sais pas comment
"lier" ces deux scripts

- J'ai un souci au niveau du nom de la pièce jointe puisqu'il va
changer tous les jours (je suppose qu'il doit être possible d'utiliser
totto_%FileDate%.xls qui a été créé auparavant...)

- Ensuite, il ne me restera plus qu'à trouver où enregistrer ce .bat
pour qu'il fonctionne (au fait, .bat, c'est quoi ?)

Voilà, j'espère que ça peut aider... à m'aider :-)

En tout cas merci pour ces quelques exemple de lignes de code, elles
pourraient effectivement m'être utiles.

Vswildcat



J'espère que mon message est clair, et qu'une (ou plusieures) âme
charitable pourra m'aider.

Vswildcat



Charitable je ne sais pas mais c'est un juste reout des choses que
j'ai pu apprendre ici et ailleurs au fil du temps. Ce sont des bouts
de programme qui pourront t'aider

Stephane

Pour ODBC:
Set odbc = CreateObject("ADODB.Connection")
odbc.open "UID=toto;PWD=toto;DSNÚtabase;"
Set resultat = odbc.execute("SELECT * ...")

'EXCEL
Set oXL = WScript.CreateObject("EXCEL.application")
oXL.Workbooks.Open(FIC_ORIGINE)
'oXL.Visible = True
'oXL.screenupdating=True
oXL.Visible = False
oXL.screenupdating = False
oXL.Sheets(1).Select
oXL.Cells(NumL,NumC).Value = FormatDateTime(Date, 1)
oXL.cells(1,1).select
oXL.ActiveWorkbook.SaveAs nomFic
oXL.ActiveWorkbook.close

'Fichiers
For each oFile In oSubFolder.Files
If InStr(UCase(oFile.Name), "RAL_") > 0 Then
nomFic = oFile.path
oFile.delete



En vbscript, le cumul des deux, à davoir renommer le rapport généré et
l'envoyer par mail:
Option Explicit
' Ne pas laisser la ligne suivante en commentaire une fois la mise au point
terminée
' On Error Resume Next
Dim Rapports_Path, Rapport_Name, Rapport_New_Name
Dim fs, dtT, dtToday
Rapports_Path = "D:test"
Rapport_Name = "toto.xls"

dtT = Date()
dtToday = Year(dtT) & Right("0" & Month(dtT), 2) & Right("0" & Day(dtT), 2)
Rapport_New_Name = Rapports_Path & dtToday & "_toto.xls"
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.FileExists(Rapport_New_Name) Then fs.DeleteFile Rapport_New_Name, True
fs.MoveFile Rapports_Path & Rapport_Name, Rapport_New_Name
Set fs = Nothing

If Err.Number = 0 Then
Dim objMail
Set objMail = CreateObject("CDO.Message")
objMail.From = ""
objMail.To = ""
objMail.Subject = "test"
objMail.Textbody = "coucou"
objMail.AddAttachment Rapport_New_Name
objMail.Send
Set objMail=Nothing
Else
WScript.Echo "Description: " & Err.Description & _
" Source: " & Err.Source & _
" N°: " & Err.Number
End If
WScript.Quit(ErrNumber)

A noter que tel quel, le code d'envoi de mail nécessite que le serveur smtp
de IIS soit installé et configuré sur la machine d'où s'exécute le script.
Il est possible en modifiant légèrement le code de faire en sorte qu'il
utilise (comme Blat) un serveur smtp "externe" (chercher dans ce newsgroup
un post récent de Gilles Laurent ;-)



Avatar
jbongran
Stephane wrote:
J'oubliai pour la messagerie va voir Blat il fait ca très bien.

arg = fPARAM&" -to -server smtp.toto.fr -f_
-subject ""coucou "" -attach contenu.xls"
Set shell = CreateObject("WScript.Shell")
retour = shell.Run("Blat "&arg,8,True) 'Attend la fin de l'envoie du
'mail, Affiche la fenêtre dans son état actuel. La fenêtre active
reste 'active.


sinon avec Outlook c'est du genre:
Set oEmail = CreateObject("CDO.Message") 'Utilise oEmail.From > ""
oEmail.Subject = objet
oEmail.Textbody = "blabla"
oEmail.Subject = objet
'oEmail.AddAttachment pj
oEmail.To = sMAILEXP & ";" & adrEmail
oEmail.Send


Voilà t'as plus qu'à bosser.


Précisions:
L'objet CDO.Message, tel qu'utilisé dans le code, n'a rien à voir avec
Outlook, pour voir des exemples d'usage:
http://www.motobit.com/tips/detpg_send-email-from-asp/

Cette ligne est une erreur:
Set oEmail = CreateObject("CDO.Message") 'Utilise oEmail.From Il s'agit en fait de deux lignes:
Set oEmail = CreateObject("CDO.Message")
oEmail.From = ""

A noter que tel quel, le code d'envoi de mail nécessite que le serveur smtp
de IIS soit installé et configuré sur la machine d'où s'exécute le script.
Il est possible en modifiant légèrement le code de faire en sorte qu'il
utilise (comme Blat) un serveur smtp "externe" (chercher dans ce newsgroup
un post récent de Gilles Laurent ;-)

Avatar
Méta-MCI (MVP)
Bonsoir !


J'arrive un peu après la bataille, pour glisser un complément à ton batch :

set FileDate=%date:~11,4%%date:~8,2%%date:~5,2%
rename c:temptotto.xls totto_%FileDate%.xls
mailCDO.exe destinataire expediteur "sujet du message" "texte du message" totto_%FileDate%.xls

La dernière ligne permettra d'envoyer le fichier renommé, en pièce jointe.

L'utilitaire mailCDO.exe est disponible là : http://ponx.org/batutils/ (dans la liste de gauche + téléchargement en bas)


Pour utiliser ce batch, il faut, soit être dans le même répertoire que le fichier renommé, soit ajouter le chemin, en préfixe du nom
de la pièce jointe (et, éventuellement, ajouter des guillemets, s'il y a un espace.

Pour la pratique, je te renvois au message de J.& B. ; pardon de Jacques Barathon (moins liquide, donc plus solide).


@-salutations
--
Michel Claveau
Avatar
Méta-MCI (MVP)
Re

J'ai oublié de préciser un truc : de plus en plus de serveurs de messagerie n'acceptent d'envoyer un e-mail que si le serveur à été
consulté, en réception, dans les 10, 20 ou 30 minutes qui ont précédé.

C'est un dispositif anti-spam qui devient assez courant (bien que peu efficace).

Cela est valable, quelque soit le mode d'envoi d'un e-mail (CDO, blat, mailCDO, VBS, telnet, etc.)

Bonne soirée

Michel Claveau
Avatar
Stephane
Précisions:
L'objet CDO.Message, tel qu'utilisé dans le code, n'a rien à voir avec
Outlook, pour voir des exemples d'usage:
http://www.motobit.com/tips/detpg_send-email-from-asp/


Ah ? Outlook d'office peut-etre pas mais c'est lié à outlook express.

Cette ligne est une erreur:
Set oEmail = CreateObject("CDO.Message") 'Utilise oEmail.From > Il s'agit en fait de deux lignes:
Set oEmail = CreateObject("CDO.Message")
oEmail.From = ""


Effectivement en supprimant la fin du commentaire j'ai merdé sur la
ligne suivante. En même temps c'était vendredi et ca sentait le week-end
à plein nez...

A noter que tel quel, le code d'envoi de mail nécessite que le serveur smtp
de IIS soit installé et configuré sur la machine d'où s'exécute le script.


Ah ? Tu peux m'expliquer pourquoi ca fonctionne chez mois depuis à peu
près 2 ans sans IIS. Contrairement à ce que tu dis 'CDO.Message' est lié
à Outlook (express). Il suffit juste,dans outlook express, de créer un
compte et de déclarer le serveur SMTP et ca fonctionne.

Stephane

1 2 3