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 , après pour avoir un code plus jolie je souhaite passer les arguments.

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.

Rechercher des sujets similaires à "debug message erreur type argument byref incompatible"