Problème de fichier joint dans une macro Excel d'envoi de courrier

benadry

XLDnaute Occasionnel
Bonjour le forum,

Je fais appel à vos compétences pour résoudre un problème que je rencontre dans une macro Excel.

J'ai fait un copier-coller d'une macro vers un autre classeur. Or, si elle fonctionne très bien dans le premier, j'ai une erreur "l'indice n'appartient pas à la sélection" dans le second classeur.

En fait, il s'agit d'envoyer des fichiers par mail et l'erreur apparaît lors de la définition du nom du fichier qui sera joint (en fait, dès la ligne : Fichier = Sheets("Fiche anomalie").[E1].Value & ".xlsx").




Voici mon code :

Code:
Sub validerlaSaisie()
    '
    Dim chemin, Repertoire, Fichier, destinataire1, destinataire2, destinataire3, destinataire4, destinataire5, cc, body, sujet, strcommand, fichierjoint As String, Rep As Integer
    
        chemin = "G:\XXXX\YYY\ZZZ\AAA\BBB\CCC\"
        Fichier = Sheets("Fiche anomalie").[E1].Value & ".xlsx"
        'Repertoire = Range("A7").Value & "\"
        destinataire1 = "didi.kabe@moi.fr"
        destinataire2 = "papa.meme@moi.fr "
        destinataire3 = "xaxa.bibi@moi.fr"
        destinataire4 = "pepe.ruru@moi.fr"
        destinataire5 = "caca.baba@moi.fr "
        cc = "controle@moi.fr"
        fichierjoint = chemin & Fichier

        Sheets("Saisie").Select
        Range("E1").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [A1].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            
        Range("A7").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [A6].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            
        Range("B7").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [A6].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            
        Range("E6").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [D6].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            
        Range("E7").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [D7].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            
        Range("B11").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [A11].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            
        Range("E11").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [D11].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            
        Range("B13").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [A13].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            
        Range("E13").Select
            If [B13].Value = "Agent" Then
            If ActiveCell = "" Then
            MsgBox ("La saisie de " & [D13].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            End If
                    
        Range("B15").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [A15].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            
        Range("E15").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [D15].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            
        Range("B20").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [A20].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            
        Range("E20").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [D20].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            
        Range("B22").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [A22].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            
        Range("E22").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [D22].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            
        Range("A26").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [A25].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
            
      Application.EnableEvents = True
      Sheets("Saisie").Unprotect Password:="DAC081"
      Sheets("Base").Visible = True
      Sheets("Base").Unprotect Password:="DAC081"
      Sheets("Saisie").Range("i6:bb6").Copy
      With Sheets("Base")
        .Rows(8).Insert
          With .Range("A8")
            .PasteSpecial Paste:=xlPasteValues
            .PasteSpecial Paste:=xlPasteFormats
          End With
          End With
          Sheets("Base").Select
      Range("A8:A2000").Select
      Range("A8:Z2000").Sort Key1:=Range("A8"), Order1:=xlAscending, Key2:=Range( _
            "B8"), Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase _
            :=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, _
            DataOption2:=xlSortNormal
            ActiveSheet.Protect
        Application.CutCopyMode = False
        Sheets("Saisie").Select
        Range("A1:E44").Copy
        
        Worksheets.Add.Name = "Fiche anomalie"
        Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
        ActiveSheet.Paste
        ActiveSheet.Shapes.Range(Array("Rectangle 56", "Rectangle 65")).Select
        Selection.Delete
         
        Sheets("Fiche anomalie").Select
        Sheets("Fiche anomalie").Copy
        Range("A2").Select
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
        ActiveSheet.SaveAs Filename:=chemin & [E1].Value & ".xlsx"

        Sheets("Fiche anomalie").Select
        Rep = MsgBox("Voulez-vous envoyer la présente fiche anomalie par courrier électronique  ?", vbYesNo + vbQuestion, "Le programme demande votre attention")
        If Rep = vbNo Then
        Exit Sub
        Else
        
        Application.DisplayAlerts = False
     
        If [A7].Value = "PN" Then
    
        sujet = "Fiche anomalie "
     
         body = "<HTML><BODY>Bonjour" & "," & "<br>" & "<br>" & "Nous vous prions de trouver ci-joint" & ", " & _
    "une fiche anomalie concernant la saisie d'un agent de votre service." & _
    " Nous vous remercions de lui transmettre ladite fiche et de lui demander de régulariser le dossier dans les meilleurs délais." & _
        "<br>" & "<br>" & "<br>" & "Bien cordialement." & "<br>" & "<br>" & "<br>" & "<br>" & "Le Service Contrôle.</BODY></HTML>"
    
        strcommand = "C:\Program Files\Mozilla Thunderbird\thunderbird"
        strcommand = strcommand & " -compose " & "to='" & destinataire1 & "'"
        strcommand = strcommand & "," & "cc='" & cc & "'"
        strcommand = strcommand & "," & "subject='" & sujet & "',format='1',"
        strcommand = strcommand & "body='" & body & "'"
        strcommand = strcommand & "," & "attachment='file:///" & ActiveWorkbook & "'"
    
     
        Call Shell(strcommand, vbNormalFocus)
    
        End If

[…]

La feuille en question s'appelle bien "Fiche anomalie" et le classeur a pour nom la valeur de la cellule E1.

Quelqu'un aurait-il une idée ?

Merci d'avance.

Cordialement.
 

benadry

XLDnaute Occasionnel
Re : Problème de fichier joint dans une macro Excel d'envoi de courrier

Rebonjour,

Je pense à une chose : peut-être cela vient-il du fait que ma macro est sur le "fichier de base" (c'est-à-dire celui à partir duquel un nouveau fichier va être généré) et non pas sur celui qui est envoyé par mail ?

Si c'est le cas, comment puis-je faire, car je ne veux pas qu'un fichier avec macro soit envoyé par mail. Cela risque de dérouter l'utilisateur (et il y en a plusieurs, donc je veux éviter de prendre le risque) ou de l'inciter à bidouiller partout.

Merci d'avance pour toute aide.

Cordialement.
 

benadry

XLDnaute Occasionnel
Re : Problème de fichier joint dans une macro Excel d'envoi de courrier

Rebonjour,

Je viens de refaire un essai et la macro n'a pas buggé.

Mais, au lieu d'envoyer le fichier, elle a mis en pièce jointe le répertoire qui est dans chemin.

Cela veut donc dire que quand je lui dis :

Code:
fichierjoint = chemin & Fichier

Elle comprend :

Code:
fichierjoint = chemin


Le mystère s'épaissit et je suis preneur de toute aide !

Merci d'avance.
 

Staple1600

XLDnaute Barbatruc
Re : Problème de fichier joint dans une macro Excel d'envoi de courrier

Bonsoir à tous

Juste de passage pour suggérer de corriger les déclarations
Dim chemin$, Repertoire$, Fichier$, destinataire1$, destinataire2$, destinataire3$, destinataire4$, destinataire5$, cc$, body$, sujet$, strcommand$, fichierjoint$, Rep%

Et pourquoi donc faire cela, peut-être me demanderas-tu?
Parce que
 
Dernière édition:

benadry

XLDnaute Occasionnel
Re : Problème de fichier joint dans une macro Excel d'envoi de courrier

Bonjour Staple1600,
Bonjour le forum,

Merci pour ton aide, mais j'ai toujours le même problème.

Je joins à la présente un fichier test (qui ne va pas bien fonctionner, les chemins n'étant pas adaptés).

Pour résumer, l'utilisateur saisit des données, la macro vérifie que tout est complet, alimente une base, copie la feuille de données dans le classeur de départ ("Fiche anomalie"), en fait une copie sous format xlsx (voir pourquoi ci-dessus) et demande à l'utilisateur s'il veut envoyer par mail la fiche ainsi créée.

Tout fonctionne très bien : le mail se génère impeccablement, mais la pièce jointe n'est pas conforme.
Elle devrait être un classeur Excel au format xlsx, nommé en fonction de la valeur de la cellule E1.

Or, c'est là où le bât blesse !

Je suppose qu'il doit y avoir juste un petit quelque chose à modifier, mais quoi ?

Merci d'avance pour votre aide.


Cordialement.
 

Pièces jointes

  • Fiche anomalieV2_2 - Copie.xlsm
    107 KB · Affichages: 29

Staple1600

XLDnaute Barbatruc
Re : Problème de fichier joint dans une macro Excel d'envoi de courrier

Bonsoir à tous

benadry
NB: Il est préférable de désactiver (en les commentant) les procédures événementielles (WorkBook_Open() etc...) avant de joindre un PJ.
Code VBA:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Application.ScreenUpdating = False
'Worksheets("accueil").Visible = True
'For i = 2 To Worksheets.Count
'Worksheets(i).Visible = False
'Next
'Application.DisplayFullScreen = False
'Me.Save
End Sub



Code VBA:
Private Sub Workbook_Open()
'Application.DisplayFullScreen = True
End Sub

Pour le reste, je regarde ton code et je redis plus tard.
EDITION : je repasse juste pour suggestion (pour simplifie la vérification de la saisie)
Cela ne solutionne pas ton problème, mais une suggestion c'est toujours bon à prendre ;) ... ou pas.
Code:
Sub test()
Dim tcells, i&, j&
tcells = _
Array("E1", "A7", "B7", "E6", "E7", "B11", "E11", "B13", "E13", "B15", "E15", "B20", "E20", "B22", "E22", "A26")
j = 0
For i = 0 To UBound(tcells)
If Len(Range(tcells(i))) = 0 Then
j = j + 1
End If
Next i
If j > o Then
MsgBox "Votre saisie est incomplète!", vbCritical, "ERREUR"
Else
'reste du code
MsgBox j 'pour test
End If
End Sub
 
Dernière édition:

benadry

XLDnaute Occasionnel
Re : Problème de fichier joint dans une macro Excel d'envoi de courrier

Bonjour le forum,
Bonjour Staple 1600,

Désolé de ne pas t'avoir répondu plus tôt : week-end oblige !

Merci pour ton code, qui simplifie, effectivement, pas mal de choses. En revanche, je ne vois pas très bien comment insérer mon message d'erreur : car, en effet, au lieu de faire référence à une cellule précise, par exemple :
Code:
        Range("A7").Select
            If ActiveCell = "" Then
            MsgBox ("La Saisie de : " & [A6].Value & "  n'est pas renseignée !")
            Exit Sub
            End If
J'ai maintenant une référence de ce genre :

Code:
  MsgBox "La Saisie de : " & [i&,-j&].Value & "  n'est pas renseignée !", vbCritical, "ERREUR"

Et cela ne fonctionne pas.

Merci en tout cas et, si tu peux me sortir de l'ornière pour mon histoire de référence fichier ..., je ne sais plus comment faire.


Merci d'avance.

Bien cordialement.
 

Staple1600

XLDnaute Barbatruc
Re : Problème de fichier joint dans une macro Excel d'envoi de courrier

Bonjour à tous

Essaies avec cette version modifiée
Code:
Sub testII()
Dim tcells, i&, j&, VIDE$
tcells = _
Array("E1", "A7", "B7", "E6", "E7", "B11", "E11", "B13", "E13", "B15", "E15", "B20", "E20", "B22", "E22", "A26")
j = 0
For i = 0 To UBound(tcells)
If Len(Range(tcells(i))) = 0 Then
VIDE = VIDE & vbTab & Range(tcells(i)).Address(0, 0) & vbCrLf
j = j + 1
End If
Next i
If j > o Then
MsgBox "Les cellules suivantes ne sont pas renseignées:" & vbCrLf & VIDE, vbCritical, "ERREUR"
Else
'reste du code
MsgBox j 'pour test
End If
End Sub
 

benadry

XLDnaute Occasionnel
Re : Problème de fichier joint dans une macro Excel d'envoi de courrier

Bonjour le forum,
Bonjour Stape1600,

Merci pour le code, c'est très gentil de ta part.

Aurais-tu une solution pour mon autre problème ?

J'ai essayé de trouver une solution en définissant le Fichier ainsi :

Code:
Fichier = ActiveSheet.[E1].Value & ".xlsx"

au lieu de :

Code:
Fichier = Sheets("Fiche anomalie").[E1].Value & ".xlsx"


Pour mémoire, cela se situe au début du code.

Par ailleurs, fichierjoint est maintenant égal à :

Code:
fichierjoint = chemin & Repertoire & Fichier

au lieu de :

Code:
fichierjoint = chemin & Fichier

puisque les différentes fiches anomalies sont classées dans des sous-répertoires par catégorie.

Ma solution SEMBLE fonctionner : en effet, je joins bien un fichier Excel au bon format.

Le problème est que la personne à qui je l'envoie dans l'entreprise ne parvient pas à ouvrir le fichier. Par ailleurs, j'ai essayé de copier celui-ci sur mon bureau et il a un nom bizarre : il reprend le nom du chemin, du répertoire et du fichier ! Ce qui donne, dans mon code envoyé précédemment :
Code:
G:\XXXX\YYY\ZZZ\AAA\BBB\CCC\Nom du Répertoire\Nom du fichier.xlsx.

Nom du répertoire et Nom du fichier sont à remplacer par les valeurs qui les définissent, bien sûr.

Quelqu'un aurait-il une solution ?

Merci d'avance.

Bien cordialement.
 

Staple1600

XLDnaute Barbatruc
Re : Problème de fichier joint dans une macro Excel d'envoi de courrier

Bonsoir à tous

benadry
Si tu ajoutes pour tester une MsgBox (voir où ci-dessous)
Qu'affiche cette MsgBox ?
chemin = "G:\XXXX\YYY\ZZZ\AAA\BBB\CCC\"
Fichier = Sheets("Fiche anomalie").[E1].Value & ".xlsx"
msgbox Fichier
 

Discussions similaires

Statistiques des forums

Discussions
312 211
Messages
2 086 286
Membres
103 170
dernier inscrit
HASSEN@45