Debug message d'erreur type d'argument ByRef incompatible
Bonjour à tous,
J'ai une macro qui enregistre un fichier et qui va créer un mail avec le fichier enregistré précédemment.
J'ai passé en argument le chemin du fichier, son nom pour pouvoir l'insérer en PJ.
Malheureusement j'ai un ByRef incompatible lorsque j'appelle la macro.
Voici les bouts de code qui correspondent, comme ça vous avez pas toutes la macro à vous taper.
Macro qui sert à enregistrer sous
.SaveAs TempFilePath & TempFileName & FileExtStr, FileFormat:=FileFormatNum
Paramètre pour la macro email
Public Sub email(TempFilePath As String, TempFileName As String)
Attachement de la pièce-jointe du fichier enregistré, avec le paramètre déterminés par la macro.
.Attachments.Add TempFilePath & TempFileName
call de la macro qui va générer l'email.
Call email(TempFilePath, TempFileName)
En vous remerciant par avance,
Cordialement.
Bonjour,
Le type de variable doit être rigoureusement le même pour pouvoir être passé par référence...
Tu fais précéder les arguments de la macro appelée de l'instruction ByVal, et cela règlera le problème.
Cordialement.
Sub email(ByVal TempFilePath As String, ByVal TempFileName As String)
NB- Mettre Public est inutile pour une procédure, elles sont toujours publiques par défaut.
Bonjour MFerrand,
Merci pour t'es précieux conseils.
J'ai renommé la macro comme indiqué.
Sub email(ByVal TempFilePath As String, ByVal TempFileName As String)
Mais je sais pas si j'ai bien écrit l'appel de la macro. Parce que la piéce jointe ne s'ajoute pas
Call email(TempFilePath, TempFileName)
Merci d'avance,
Bien cordialement.
Je n'ai pas vu ton code et notamment les déclarations de variables...
Autres solutions : forcer le passage ByRef en mettant les arguments d'appel de la procédure entre parenthèses :
Call email((TempFilePath), (TempFileName))
et bien sûr, alors ne pas mettre ByVal pour les arguments déclarés...
Ou s'assurer que les variables sont bien de même type...
Cordialement.
J'ai fait comme tu m'as indiqué mais rien de mieux, la PJ ne se charge pas les variables ne sont pas reconnus dans la deuxième macro email.
Bon ben voila le code complet.
code de sauvegarde du fichier.
Sub Copy_ActiveSheet()
'Working in Excel 97-2016
'vaiables saveas
Dim FileFormatNum As Long
Dim Sourcewb As Workbook
Dim Destwb As Workbook
Dim FileExtStr As String
Dim TempFilePath As String
Dim TempFileName As String
Dim nomfile As Variant
nomfichier = ThisWorkbook.Name
'enleve le bis sur le nom de fichier wemed'
nomfile = Left(nomfichier, 22)
With Application
.EnableEvents = False
End With
'Copy the sheet to a new workbook
Set Destwb = ActiveWorkbook
'Determine the Excel version and file extension/format
With Destwb
If Val(Application.Version) < 12 Then
'You use Excel 97-2003
FileExtStr = ".xls": FileFormatNum = -4143
Else
'You use Excel 2007-2016
Select Case Destwb.FileFormat
Case 51: FileExtStr = ".xlsx": FileFormatNum = 51
Case 52:
If .HasVBProject Then
FileExtStr = ".xlsm": FileFormatNum = 52
Else
FileExtStr = ".xlsx": FileFormatNum = 51
End If
Case 56: FileExtStr = ".xls": FileFormatNum = 56
Case Else: FileExtStr = ".xlsb": FileFormatNum = 50
End Select
End If
End With
' 'Change all cells in the worksheet to values if you want
' With Destwb.Sheets(1).UsedRange
' .Cells.Copy
' .Cells.PasteSpecial xlPasteValues
' .Cells(1).Select
' End With
' Application.CutCopyMode = False
'Save the new workbook and close it
TempFilePath = "I:\Commun\PROJET- C REPORT\Test LCR C- Report\LCR 16\Test lcr auto\WEMED\2_test\test light dashboard\beta\"
TempFileName = nomfile
'resultat'
'Part of Classeur4 2016-06-01 10-30-09'
With Destwb
.SaveAs TempFilePath & TempFileName & FileExtStr, FileFormat:=FileFormatNum
.Close SaveChanges:=False
End With
MsgBox "You can find the new file in " & TempFilePath
With Application
.EnableEvents = True
End With
End Sub
code email
Sub email(ByVal TempFilePath As String, ByVal TempFileName As String, ByVal FileExtStr As String)
'ByVal FileExtStr As String
'variables email
Dim OutApp As Object
Dim OutMail As Object
Dim strbody As String
Dim SigString As String
Dim Signature As String
'--------------------------------------------------------------------------------------------------------------------------------------------
'gestion de la création de l'email avec signature intégrée via la méthode appdata
' Don't forget to copy the function GetBoiler in the module.
' Working in Office 2000-2016
MsgBox TempFilePath
MsgBox TempFileName
MsgBox FileExtStr
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
'texte du message dans le corps de l'email
strbody = "<H4><B>Bonjour,</B></H4>" & _
"Ci-joint la mise à jour du service WEMED.<br>" & _
"Merci de trouver ci-dessous les Bookings d'aujourd'hui :<br>" & _
" <br>" & _
"I:\Naf\Cargo Flow\Services\WEMED\Bookings :<br>" & _
"<br><br><B>Best Regards,</B>"
'Change only .htm to the name of your signature, check the name of your outlokk signature
SigString = Environ("appdata") & _
"\Microsoft\Signatures\Base.htm"
If Dir(SigString) <> "" Then
Signature = GetBoiler(SigString)
Else
Signature = ""
End If
On Error Resume Next
With OutMail
.To = "......"
.CC = "...."
.BCC = ""
.Subject = "Bookings WEMED " & Now
.HTMLBody = strbody & "<br>" & Signature
.Attachments.Add TempFilePath & TempFileName & ByVal FileExtSt
.display
End With
On Error GoTo 0
Set OutMail = Nothing
Set OutApp = Nothing
End Sub
appel des macro
Call Copy_ActiveSheet
'envoi email
Call email((TempFilePath), (TempFileName), (FileExtStr))
Quelque chose m'échappe :
1) Je ne vois pas d'où provient le classeur affecté Destwb, comment a-t-il été créé ou ouvert pour devenir le classeur actif lors de l'affectation ?
2) Dans quellel procédure se trouve le code qui appelle les macros ?
Pour commencer...
Ou il manque une foule d'éléments, ou les éléments indiqués ne peuvent permettre à aucune procédure d'aboutir !!
Oui j'ai une macro qui crée un nouveau worksheet et copier ceux de l'ancien.
Donc Destwb est l'actif WB qui va s'enregistrer et c'est celui la qui va être mis en PJ.
En fait ma macro fonctionne parfaitement si je mets tout dans une seule macro cad la sauvegarde et le mail.
Donc techniquement ça marche
La macro qui appelle les autres macro. Qui fonctionne sauf pour la PJ qui n'est pas prise en compte!!!
Sub Dashboard_Light()
Dim FileExtStr As String
Dim TempFilePath As String
Dim TempFileName As String
Application.ScreenUpdating = False
'code debug
Call copynew_wb
'enregistre sous
Call Copy_ActiveSheet((TempFilePath), (TempFileName), (FileExtStr))
'envoi email
MsgBox TempFilePath 'rien dans les variables
MsgBox TempFileName 'rien dans les variables
MsgBox FileExtStr 'rien dans les variables
'Call email((TempFilePath), (TempFileName), (FileExtStr))
Application.ScreenUpdating = True
End Sub
Bon ! Je n'ai pas tout vu mais tes variables déclarées dans des procédures distinctes, même si elles portent le même nom, n'ont rien à voir les unes avec les autres !
Si tu démarres avec Dashboard_Light qui appelle tour à tour les autres procédures, et sachant que tes variables sont affectées dans Copy_ActiveSheet, il faut :
1) déclarer tes 3 variables au niveau module (en tête du module) :
Dim FileExtStr As String
Dim TempFilePath As String
Dim TempFileName As String
2) supprimer les déclarations de ces 3 variables dans les deux procédures.
3) appeler Copy_ActiveSheet sans argument (elle est déclarée sans) :
Call Copy_ActiveSheet
4) réactiver ta procédure email :
Call email(TempFilePath, TempFileName, FileExtStr)
Et voir ce qui se passe alors !
Merci bien pour ton aide,
Je vais tester tout ça et je te reviens
Cordialement
Bonjour à tous et à Mferrand,
Merci pour votre aide, ça fonctionne correctement avec vos recommandations.
Merci de votre aide, sujet résolu.