Pb suite modification macro: ça fonctionne mal

Fermé
agc - 21 déc. 2012 à 10:20
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 21 déc. 2012 à 14:54
Bonjour,

je viens sur le forum car je suis quasi novice en VBA et nécessite l'aide de pro du VBA;
j'utilise un macro qui a été écrite par un informaticien reconvertit dans la finance; cette macro a pour but de copier/coller dans un nouveau classeur certains onglets d'un fichier xls (2007) référencés dans les colonnes d'une feuille xls (onglet "paramètres") appartenant au même classeur et d'envoyer ce nouveau classeur composé des onglets précédemment copier via outlook à une liste de destinataires également référencés dans l'onglet "paramètre".
La macro s'arrete lorsqu'elle rencontre une cellule vide.

La macro d'origine était formatée pour 7 colonnes, j'ai ajouté 1 colonne et essayé d'adapter la macro pour 8 colonnes.

PB: la macro effectue parfaitement le premier envoi pouis s'arrête en positionnant la cellule active à la fin de la deuxième ligne (1ere cellule vide rencontrée de la deuxième ligne) mais pas d'envoi de la deuxième ligne.

je copie ci-dessous la macro d'origine (1) puis la macro adaptée (2):

Macro d'origine (1):

Sub ENVOI()

Dim NOM As String
Dim LAF1 As String
Dim LAF2 As String
Dim LAF3 As String
Dim LAF4 As String
Dim LAF5 As String
Dim LAF6 As String
Dim LAF7 As String
Dim LIBELLE As String
Dim PERSONNE As String
Dim SUJET As String
Dim MOIS As String

NOM = ActiveWorkbook.Name

'Pour que l'écran ne se modifie pas pendant l'exécution de la macro :
Application.ScreenUpdating = False

'Pour expliquer par message les erreurs pouvant avoir commises :
On Error GoTo TRAITERROR

'Message pour vérifier que le lancement de la macro est bien voulu :
Dim reponse As Integer
reponse = MsgBox("Avez-vous bien déplacer les onglets à envoyer à droite de l'onglet Paramètres ?", vbYesNo + vbQuestion)
If reponse = vbNo Then
MsgBox "Envoi par messagerie non effectué !"
Exit Sub
Else
MsgBox "Envoi par messagerie commencé. "
End If

'Message pour vérifier que la messagerie Outlook est ouverte :
Dim MESSAGERIE As Integer
MESSAGERIE = MsgBox("Est-ce que vous avez ouvert votre messagerie Outlook ?" & Chr _
(10) & "- Si OUI, choisir Oui" & Chr _
(10) & "- Si NON, choisir Non, car la macro ne pourra s'excécuter.", vbYesNo + vbQuestion)
If MESSAGERIE = vbNo Then
MsgBox "La macro s'est arrêtée. Ouvrez votre messagerie et relancez la macro."
Exit Sub
Else
End If

Sheets("Paramètres").Activate
Range("A16").Activate
PERSONNE = ActiveCell.Value

Range("B16").Activate
LAF1 = ActiveCell.Value
Range("C16").Activate
LAF2 = ActiveCell.Value
Range("D16").Activate
LAF3 = ActiveCell.Value
Range("E16").Activate
LAF4 = ActiveCell.Value
Range("F16").Activate
LAF5 = ActiveCell.Value
Range("G16").Activate
LAF6 = ActiveCell.Value
Range("H16").Activate
LAF7 = ActiveCell.Value
Range("I16").Activate
LIBELLE = ActiveCell.Value

MOIS = Sheets("Paramètres").Range("B26")

Do
If PERSONNE = "Pas de destinataire" Then
MsgBox "Pas de destinataire pour la feuille " & LIBELLE

Else
'Copier les 2 onglets ds nv classeur
Sheets(Array(LAF1, LAF2, LAF3, LAF4, LAF5, LAF6, LAF7)).Select
Sheets(Array(LAF1, LAF2, LAF3, LAF4, LAF5, LAF6, LAF7)).Copy

'Copier / collage spéciale valeur Page 1
Sheets(LAF1).Activate
Range("A1:DK3000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select

'Copier / collage spéciale valeur Page 2
Sheets(LAF2).Select
Range("A1:DK3000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select

'Copier / collage spéciale valeur Page 3
Sheets(LAF3).Select
Range("A1:DK3000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select

'Copier / collage spéciale valeur Page 4
Sheets(LAF4).Select
Range("A1:DK3000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select

'Copier / collage spéciale valeur Page 5
Sheets(LAF5).Select
Range("A1:DK3000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select

'Copier / collage spéciale valeur Page 6
Sheets(LAF6).Select
Range("A1:DK3000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select

'Copier / collage spéciale valeur Page 7
Sheets(LAF7).Select
Range("A1:DK3000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select

'Retour sur la première feuille envoyée
Sheets(LAF1).Select
Range("A1").Select

SUJET = LIBELLE

ActiveWorkbook.SaveAs Filename:= _
"C:\Import\" & LIBELLE, FileFormat:=xlNormal, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False

' virer les noms de champs pour gagner de la place
ActiveWorkbook.Names("Base_Planif").Delete
ActiveWorkbook.Names("Managers").Delete
ActiveWorkbook.Names("M").Delete
ActiveWorkbook.Names("N").Delete
ActiveWorkbook.Names("Services").Delete


ActiveWorkbook.SendMail Recipients:=PERSONNE, Subject:=SUJET, returnreceipt:=True
'MsgBox "Envoi par messagerie à " & PERSONNE

SendKeys "%N", False
ActiveWorkbook.Close (False)

End If

Sheets("Paramètres").Activate
ActiveCell.Offset(1, -8).Activate
PERSONNE = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LAF1 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LAF2 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LAF3 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LAF4 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LAF5 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LAF6 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LAF7 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LIBELLE = ActiveCell.Value

Loop Until IsEmpty(ActiveCell)

'RETOUR SUR LA FEUILLE DE LANCEMENT DES MACROS
Sheets("Macro").Activate

MsgBox "L'envoi par messagerie à vos correspondants est terminé."

TRAITERROR:
Select Case Err
Case 1004
Resume Next
Exit Sub
Case 9
Resume Next
Exit Sub
End Select

'Remise à jour du raffaichissement de l'écran :
Application.ScreenUpdating = True

End Sub


Macro adapdtée (2):

Sub ENVOI()

Dim NOM As String
Dim LAF1 As String
Dim LAF2 As String
Dim LAF3 As String
Dim LAF4 As String
Dim LAF5 As String
Dim LAF6 As String
Dim LAF7 As String
Dim LAF8 As String
Dim LIBELLE As String
Dim PERSONNE As String
Dim SUJET As String
Dim MOIS As String

NOM = ActiveWorkbook.Name

'Pour que l'écran ne se modifie pas pendant l'exécution de la macro :
Application.ScreenUpdating = False

'Pour expliquer par message les erreurs pouvant avoir commises :
On Error GoTo TRAITERROR

'Message pour vérifier que le lancement de la macro est bien voulu :
Dim reponse As Integer
reponse = MsgBox("Avez-vous bien déplacer les onglets à envoyer à droite de l'onglet Paramètres ?", vbYesNo + vbQuestion)
If reponse = vbNo Then
MsgBox "Envoi par messagerie non effectué !"
Exit Sub
Else
MsgBox "Envoi par messagerie commencé. "
End If

'Message pour vérifier que la messagerie Outlook est ouverte :
Dim MESSAGERIE As Integer
MESSAGERIE = MsgBox("Est-ce que vous avez ouvert votre messagerie Outlook ?" & Chr _
(10) & "- Si OUI, choisir Oui" & Chr _
(10) & "- Si NON, choisir Non, car la macro ne pourra s'excécuter.", vbYesNo + vbQuestion)
If MESSAGERIE = vbNo Then
MsgBox "La macro s'est arrêtée. Ouvrez votre messagerie et relancez la macro."
Exit Sub
Else
End If

Sheets("Paramètres").Activate
Range("A16").Activate
PERSONNE = ActiveCell.Value

Range("B16").Activate
LAF1 = ActiveCell.Value
Range("C16").Activate
LAF2 = ActiveCell.Value
Range("D16").Activate
LAF3 = ActiveCell.Value
Range("E16").Activate
LAF4 = ActiveCell.Value
Range("F16").Activate
LAF5 = ActiveCell.Value
Range("G16").Activate
LAF6 = ActiveCell.Value
Range("H16").Activate
LAF7 = ActiveCell.Value
Range("I16").Activate
LAF8 = ActiveCell.Value
Range("J16").Activate
LIBELLE = ActiveCell.Value

MOIS = Sheets("Paramètres").Range("B26")

Do
If PERSONNE = "Pas de destinataire" Then
MsgBox "Pas de destinataire pour la feuille " & LIBELLE

Else
'Copier les 2 onglets ds nv classeur
Sheets(Array(LAF1, LAF2, LAF3, LAF4, LAF5, LAF6, LAF7, LAF8)).Select
Sheets(Array(LAF1, LAF2, LAF3, LAF4, LAF5, LAF6, LAF7, LAF8)).Copy

'Copier / collage spéciale valeur Page 1
Sheets(LAF1).Activate
Range("A1:DK3000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select

'Copier / collage spéciale valeur Page 2
Sheets(LAF2).Select
Range("A1:DK3000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select

'Copier / collage spéciale valeur Page 3
Sheets(LAF3).Select
Range("A1:DK3000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select

'Copier / collage spéciale valeur Page 4
Sheets(LAF4).Select
Range("A1:DK3000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select

'Copier / collage spéciale valeur Page 5
Sheets(LAF5).Select
Range("A1:DK3000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select

'Copier / collage spéciale valeur Page 6
Sheets(LAF6).Select
Range("A1:DK3000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select

'Copier / collage spéciale valeur Page 7
Sheets(LAF7).Select
Range("A1:DK3000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select

'Copier / collage spéciale valeur Page 8
Sheets(LAF8).Select
Range("A1:DK3000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select

'Retour sur la première feuille envoyée
Sheets(LAF1).Select
Range("A1").Select

SUJET = LIBELLE

ActiveWorkbook.SaveAs Filename:= _
"C:\Import\" & LIBELLE, FileFormat:=xlNormal, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False

' virer les noms de champs pour gagner de la place
ActiveWorkbook.Names("Base_Planif").Delete
ActiveWorkbook.Names("Managers").Delete
ActiveWorkbook.Names("M").Delete
ActiveWorkbook.Names("N").Delete
ActiveWorkbook.Names("Services").Delete


ActiveWorkbook.SendMail Recipients:=PERSONNE, Subject:=SUJET, returnreceipt:=True
'MsgBox "Envoi par messagerie à " & PERSONNE

SendKeys "%N", False
ActiveWorkbook.Close (False)

End If

Sheets("Paramètres").Activate
ActiveCell.Offset(1, -8).Activate
PERSONNE = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LAF1 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LAF2 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LAF3 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LAF4 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LAF5 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LAF6 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LAF7 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LAF8 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
LIBELLE = ActiveCell.Value

Loop Until IsEmpty(ActiveCell)

'RETOUR SUR LA FEUILLE DE LANCEMENT DES MACROS
Sheets("Macro").Activate

MsgBox "L'envoi par messagerie à vos correspondants est terminé."

TRAITERROR:
Select Case Err
Case 1004
Resume Next
Exit Sub
Case 9
Resume Next
Exit Sub
End Select

'Remise à jour du raffaichissement de l'écran :
Application.ScreenUpdating = True

End Sub


Merci de votre aide !
A voir également:

1 réponse

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
Modifié par Patrice33740 le 21/12/2012 à 14:55
Bonjour,

Essaies ce code :
Sub ENVOI() 
Dim WBK As Workbook 
Dim WSH As Worksheet 
Dim CEL As Range 
Dim PLAGENOMMEE As Name 
Dim NOM As String 
Dim LAF1 As String 
Dim LAF2 As String 
Dim LAF3 As String 
Dim LAF4 As String 
Dim LAF5 As String 
Dim LAF6 As String 
Dim LAF7 As String 
Dim LAF8 As String 
Dim LIBELLE As String 
Dim PERSONNE As String 
Dim SUJET As String 
Dim MOIS As String 
Dim REPONSE As Integer 

NOM = ActiveWorkbook.Name 

'Pour que l'écran ne se modifie pas pendant l'exécution de la macro : 
Application.ScreenUpdating = False 

'Pour expliquer par message les erreurs pouvant avoir commises : 
On Error GoTo TRAITERROR 

'Message pour vérifier que le lancement de la macro est bien voulu : 
REPONSE = MsgBox("Avez-vous bien déplacé les onglets à envoyer à droite de l'onglet Paramètres ?", vbYesNo + vbQuestion) 
If REPONSE = vbNo Then 
  MsgBox "Envoi par messagerie non effectué !" 
  Exit Sub 
Else 
  MsgBox "Envoi par messagerie commencé. " 
End If 

'Message pour vérifier que la messagerie Outlook est ouverte : 
REPONSE = MsgBox("Est-ce que vous avez ouvert votre messagerie Outlook ?" & Chr(10) & _ 
                 "- Si OUI, choisir Oui" & Chr(10) & _ 
                 "- Si NON, choisir Non, car la macro ne pourra s'excécuter.", vbYesNo + vbQuestion) 
If REPONSE = vbNo Then 
  MsgBox "La macro s'est arrêtée. Ouvrez votre messagerie et relancez la macro." 
  Exit Sub 
End If 

MOIS = Sheets("Paramètres").Range("B26") 

Set CEL = Sheets("Paramètres").Range("A16") 

Do 
  With CEL 
    PERSONNE = .Value 
    LAF1 = .Offset(0, 1).Value 
    LAF2 = .Offset(0, 2).Value 
    LAF3 = .Offset(0, 3).Value 
    LAF4 = .Offset(0, 4).Value 
    LAF5 = .Offset(0, 5).Value 
    LAF6 = .Offset(0, 6).Value 
    LAF7 = .Offset(0, 7).Value 
    LAF8 = .Offset(0, 8).Value 
    LIBELLE = .Offset(0, 9).Value 
  End With 
  If PERSONNE = "Pas de destinataire" Then 
    MsgBox "Pas de destinataire pour la feuille " & LIBELLE 
  Else 
    'Copier les onglets ds nv classeur 
    Sheets(Array(LAF1, LAF2, LAF3, LAF4, LAF5, LAF6, LAF7, LAF8)).Select 
    Sheets(Array(LAF1, LAF2, LAF3, LAF4, LAF5, LAF6, LAF7, LAF8)).Copy 
    Set WBK = ActiveWorkbook 
     
    'Copier / collage spécial valeur de chaque page 
    For Each WSH In WBK.Worksheets 
      WSH.UsedRange.Value = WSH.UsedRange.Value 
      WSH.Activate 
      WSH.Range("A1").Activate 
    Next WSH 

    'Retour sur la première feuille envoyée 
    WBK.Sheets(1).Activate 
     
    SUJET = LIBELLE 

    WBK.SaveAs Filename:="C:\Import\" & LIBELLE 

    ' virer les noms de champs pour gagner de la place 
    If WBK.Names.Count > 0 Then 
      For Each PLAGENOMMEE In WBK.Names 
        PLAGENOMMEE.Delete 
      Next PLAGENOMMEE 
    End If 
     
    WBK.SendMail Recipients:=PERSONNE, Subject:=SUJET, returnreceipt:=True 
'    MsgBox "Envoi par messagerie à " & PERSONNE 

    SendKeys "%N", False 
    WBK.Close (False) 

  End If 

  Set CEL = CEL.Offset(1) 

Loop Until IsEmpty(CEL) 

'RETOUR SUR LA FEUILLE DE LANCEMENT DES MACROS 
Sheets("Macro").Activate 

MsgBox "L'envoi par messagerie à vos correspondants est terminé." 

'Remise à jour du raffaichissement de l'écran : 
Application.ScreenUpdating = True 

Exit Sub 

TRAITERROR: 
Select Case Err.Number 
  Case 1004 
    Resume Next 
  Case Else 
    MsgBox "Erreur n° " & Err.Number & vbCr & _ 
           Err.Description & vbCr & vbCr & _ 
           "Envoi interrompu." 
    Exit Sub 
End Select 

'Remise à jour du raffaichissement de l'écran : 
Application.ScreenUpdating = True 

End Sub 


Cordialement
Patrice
0