Comment choisir plusieurs cellules Excel sur la déclaration d'un argument

Résolu
SUMACNAJ Messages postés 35 Date d'inscription mercredi 2 mai 2007 Statut Membre Dernière intervention 13 septembre 2007 - 9 mai 2007 à 14:26
SUMACNAJ Messages postés 35 Date d'inscription mercredi 2 mai 2007 Statut Membre Dernière intervention 13 septembre 2007 - 11 mai 2007 à 10:22
Bonjour,

J'ai décrit une procédure qui dit :

Sub EnvoiEmail(Adresse As String, Objet As String, Corps As String, Optional PJ As String)

J'ai donc en face :

Sub Envoi()
    EnvoiEmail Range("B3"), Range("B4"), Range("B5"), Range("B17")
End Sub

J'aimerais savoir si dans mon argument "Corps", il est possible que j'aille de la cellule B5 à la cellule B15 ? J'ai essayé plusieurs choses du style ("B5", "B15") ou ("B5", "B6", "B7", "B8", ..., "B15") ou ("B5, B15") mais rien ne fonctionne. Il ne me prend systématiquement qu'une seule cellule, la première.

Merci de votre aide et à bientôt

33 réponses

jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
9 mai 2007 à 14:33
Salut,
Je pense que cette déclaration serait mieux.

Sub EnvoiEmail(Adresse As Range, Objet As Range, Corps As Range, Optional PJ As Range)

End Sub<hr />

'Ensuite il te suffit de l'appeler ainsi
Sub Envoi()
   Call EnvoiEmail(Range("B3"), Range("B4"), Range("B5:B15"), Range("B17"))
End Sub , ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
3
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
9 mai 2007 à 15:58
Re,
L'incompatibilité de type (qui est logique) ce trouve ici:
HyperLien = HyperLien & "&Body=" & Corps    ' le & sépare les arguments

Sur cette ligne Corps représente une String (alors que nous on lui passe un Range) .

Donc a partir de la cela dépend de ce que tu souhaites faire mais tu peux essayer ceci (remplace la ligne ci dessus par
Dim CellCorps As Range
Dim CorpsMail As String
For Each CellCorps In Corps
   CorpsMail = CorpsMail & CellCorps.Text & vbNewLine
Next
HyperLien = HyperLien & "&Body=" & CorpsMail
, ----
[code.aspx?ID=41455 By Renfield]

Le seul problème c'est qu'il semble que la mise en page soit morte a l'affichage du mail.

@+: Ju£i?n
Pensez: Réponse acceptée
3
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
9 mai 2007 à 16:34
Salut,
Si c'est juste OUtlook
pourquoi ne pas le piloter directement depuis Excel
Regarde cette nouvelle procédure envoiMail. c'est avec cela que le dernier mail que tu as recu a été fait.

Sub EnvoiEmail(Adresse As Range, Objet As Range, Corps As Range, Optional PJ As Range)
'pour que cette nouvelle procédure fonctionne
'tu dois ajouter en référence au classeur
'Microsoft Outlook 9.0 Object Library (9.0 ou equivalent)
'pour ajouter référence depuis IDE VBA
'menu Outils => Référence =>Microsoft Outlook 9.0 Object Library

Dim CorpsMail As String
Dim CelCorps As Range
Dim MMail As MailItem
Dim OutApp As Outlook.Application
   'on prépare le coprs du mail
   For Each CelCorps In Corps
       CorpsMail = CorpsMail & CelCorps.Text & vbCrLf
   Next

   'on cree un outlook
   Set OutApp = New Outlook.Application
   'on cree un nouveau mail
   Set MMail = OutApp.CreateItem(olMailItem)
   'on rempli ces propriétés
   With MMail
       'destinataire
       .To = Adresse.Text
       'sujet
       .Subject = Objet.Text & " (à " & Time & ")"
       'corps
       .Body = CorpsMail
       'si tu veux afficher le mail
       .Display
       'envoi du mail
       .Send
   End With

   Set MMail = Nothing
   Call OutApp.Quit
   Set OutApp = Nothing

End Sub , ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
3
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
9 mai 2007 à 17:10
Re,
Il semble que pour aller à la ligne c'est  (copie colle car je ne sais pas si c'est O ou un zero)

Dim CorpsMail As String
Dim CellCorps As Range
For Each CellCorps In Corps
   CorpsMail = CorpsMail & CellCorps.Text & "%0A"
Next

HyperLien = "mailto:" & Adresse & "?"      ' Le ? introduit les arguments
HyperLien = HyperLien & "Subject=" & Objet & " (à " & Time() & ")"
HyperLien = HyperLien & "&Body=" & CorpsMail    ' le & sépare les arguments
, ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
10 mai 2007 à 14:39
Re,
Aller pas de nouveau paramètres.

essaie ceci pour voir si ca te convient.
For Each CellCorps In Corps
   CorpsMail = CorpsMail & ActiveSheet.Range("A" & CellCorps.Row).Text & ": " & CellCorps.Text & "%0A"
Next, ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
3
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
10 mai 2007 à 16:49
Salut,

1-
Dim AnEmpty As Boolean
   For Each CellCorps In Corps
       'si une cellule est vide
       If IsEmpty(CellCorps) Then
           'on active la cellule vide
           CellCorps.Activate
           'on memorise
           AnEmpty = True
           'on sort de la boucle
           Exit For
       End If
   Next
   'si une cellule est vide
   If AnEmpty Then
       'on averti
       Call MsgBox("au moins un champs n'est pas rempli")
       'on sort de la procédure
       Exit Sub
   End If

   For Each CellCorps In Corps
       CorpsMail = CorpsMail & CellCorps.Text & "%0A%0D"
   Next , ----
[code.aspx?ID=41455 By Renfield]
2-
Apres l'appel de la procédure EnvoiMail tu sort

Sub Envoi()
   Call EnvoiEmail(Range("B3"), Range("B4"), Range("B5:B15"), Range("B17"))
   'on ferme le classeur actif
   ActiveWorkbook.Close (False) 'true si tu veux enregistrer les modif
End Sub , ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
3
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
11 mai 2007 à 08:53
Salut,
Bah une solution est de passer par une fonction a présent.
regarde ce qui suit.
Sub Envoi()
   If EnvoiEmail(Range("B3"), Range("B4"), Range("B5:B15"), Range("B17")) Then
       'on ferme le classeur actif
       ActiveWorkbook.Close (False) 'true si tu veux enregistrer les modif
   End If
End Sub<hr />
Function EnvoiEmail(Adresse As Range, Objet As Range, Corps As Range, Optional PJ As Range) As Boolean
'[TOUT LE CODE DE LA PROCEDURE]
   EnvoiEmail = True
End Function , ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
3
SUMACNAJ Messages postés 35 Date d'inscription mercredi 2 mai 2007 Statut Membre Dernière intervention 13 septembre 2007
9 mai 2007 à 15:03
Bonjour et merci pour la rapidité de ta réponse,

J'ai essayé d'appliquer ta méthode mais rien de mieux, j'ai remplacé mes "String" par des "Range" et ensuite j'ai mis les " : " entre B5 et B15 sans oublier d'ajouter le "Call". Lorsque j'ajoute le "Call", il met une erreur 'Erreur de compilation" et si je ne mets pas le "Call", il me dit "Incompatibilité de type".

Je pensais que le fait de sélectionner une série de cellules serait plus simple, merci de me guider à nouveau.

Cordialement
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
9 mai 2007 à 15:12
Re,
je n'ai aucune erreur chez moi, peu tu remettre le code que tu as actuellement?.

L'erreur d'incompatibilité de type se produit sur la ligne d'appel?

@+: Ju£i?n
Pensez: Réponse acceptée
0
SUMACNAJ Messages postés 35 Date d'inscription mercredi 2 mai 2007 Statut Membre Dernière intervention 13 septembre 2007
9 mai 2007 à 15:22
Re,

Alors , pour ce qui est de la première feuille :


Option Explicit
' ------------------------------------------------------------------
'Déclaration des tableaux qui recevront les touches à utiliser suivant
' le logiciel de messagerie par défaut du système.
' Déclarés ici, les tableaux ont une portée qui couvre tout le module
Dim TouchesPJ(5) As String, TouchesEnvoi(5) As String
' ------------------------------------------------------------------
' Procédure principale qui compose les éléments du message
' et effectue la demande d'envoi
' c'est cette procédure qui sera appelée par le programme principal (ici Excel)
'
Sub EnvoiEmail(Adresse As String, Objet As String, Corps As String, Optional PJ As String)
' Remarque : l'argument PJ (pièce jointe) est optionnel. S'il est fourni,
' c'est le chemin complet du fichier à joindre qui doit être fourni
' pour joindre plusieurs pièces,
' il faudrait que PJ soit un tableau et qu'il soit traité + bas par une boucle...
Dim HyperLien As String ' Reçoit les éléments de l'hyperlien
                        ' composés à partir des arguments fournis à la procédure
Dim i As Integer        ' un compteur
Dim Client As Integer
' la syntaxe de base du mailto est la suivante :
' [mailto:dest@domaine.bof?Subject=Le mailto:dest@domaine.bof?Subject=Le] sujet du message&Body=Le corps du message
' je ne prends pas en compte les copies, copies cachées ou autres confirmation de lecture
' il faudrait utiliser d'autre arguments de mailto...


HyperLien = "mailto:" & Adresse & "?"       ' Le ? introduit les arguments
HyperLien = HyperLien & "Subject=" & Objet & " (à " & Time() & ")"
HyperLien = HyperLien & "&Body=" & Corps    ' le & sépare les arguments
'MsgBox Application.Name


' Activation du lien
'
' Pour Excel (les autres doivent être en commentaire)
    ActiveWorkbook.FollowHyperlink HyperLien
' Pour Word (les autres doivent être en commentaire)
'   ThisDocument.FollowHyperlink HyperLien
' Pour Access (les autres doivent être en commentaire)
'   Application.FollowHyperlink HyperLien
       
Attendre 1                                  ' Appel d'une procédure qui temporise
                                            ' c'est à dire que la procédure courante
                                            ' (ici EnvoiMail) est suspendue pendant 5s
                                            ' cela permet d'Attendrere que le client
                                            ' de messagerie soit lancé et prêt
                                            ' avant d'envoyer les touches
                                            ' sinon ce serait le programme appelant
                                            ' (ici Excel) qui recevrait les touches
                                           
Client = 1  ' 1=Outlook Express
            ' 2=Mozilla Thunderbird
            ' 3=Office Outlook


Select Case Client      ' appel du chargement des tableaux des touches selon le
                        ' client de messagerie indiqué
    Case 1
        OutLookExpress
    Case 2
        MozillaThunderbird
    Case 3
        Office2003OutLook
    Case Else
        MsgBox "Aucun client de messagerie connu n'est indiqué"
        Exit Sub
End Select


' Le traitement de la pièce jointe ne s'exécute que si la procédure à reçu qqchose
' dans l'argument PJ (Optional<=>Facultatif)


If PJ <> "" Then
    For i = 1 To TouchesPJ(0)   ' dans TouchesPJ(0) on a stocké le nombre de touches
                                ' à envoyer au programme pour joindre une pièce
        SendKeys TouchesPJ(i), True     ' Envoie les touches d'ajout d'1 pièce jointe
        Attendre 1                        ' temporise (à règler éventuellement)
    Next i
    SendKeys PJ, True       ' A ce stade le programme Attendre un nom de fichier
                            ' on lui envoie
    Attendre 1                ' on temporise
    SendKeys "{ENTER}", True    ' et on valide ce nom de fichier
    Attendre 1
End If
For i = 1 To TouchesEnvoi(0)
    SendKeys TouchesEnvoi(i), True  ' on envoie le message
Next i
End Sub


Sub Attendre(Secondes As Integer)
' Cette procédure temporise pendant le nombre de secondes qu'on lui transmet en argument
Dim Début As Long, Fin As Long, Chrono As Long
Début = Timer
Fin = Début + Secondes
Do Until Timer >= Fin
    DoEvents
Loop
End Sub




Sub OutLookExpress()
'Initialisation des tableaux de touches pour Outlook Express
    ' Pour une pièce jointe
'    TouchesPJ(0) = 2        ' Nombre de touches nécessaires
'    TouchesPJ(1) = "%i"     ' Appel du menu Insertion par la touche Alt-i
'    TouchesPJ(2) = "p"      ' appel du sous-menu pièce par la touche p
    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 1     ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "^{ENTER}"  ' Envoi du message avec Ctrl-Entrée
End Sub


Sub MozillaThunderbird()
'Initialisation des tableaux de touches pour Mozilla Thunderbird
    ' Pour une pièce jointe
'    TouchesPJ(0) = 3        ' Nombre de touches nécessaires
'    TouchesPJ(1) = "%f"     ' Appel du menu Fichier par la touche Alt-f
'    TouchesPJ(2) = "j"      ' appel du sous-menu Joindre par la touche j
'    TouchesPJ(3) = "f"      ' appel du sous-sous-menu Fichier par la touche f
    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 2             ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "^{ENTER}"    ' Envoi du message avec Ctrl-Entrée
    TouchesEnvoi(2) = "{ENTER}"     ' confirmation par Entrée
End Sub


Sub Office2003OutLook()
'Initialisation des tableaux de touches pour Office Outlook
    ' Pour une pièce jointe
'    TouchesPJ(0) = 2        ' Nombre de touches nécessaires
'    TouchesPJ(1) = "%i"     ' Appel du menu Insertion par la touche Alt-i
'    TouchesPJ(2) = "f"      ' appel du sous-menu fichier par la touche f
    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 1     ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "%v"  ' Envoi du message avec Alt-v
End Sub

et pour la deuxième feuille :

Sub Envoi()
    EnvoiEmail Range("B3"), Range("B4"), Range("B5 , B15"), Range("B17")
End Sub

Je précise que je n'ai pas écrit tout cela, je l'ai récupéré et adapté à mon besoin, j'aimerais l'avoir fait mais je n'en ai pas les compétences.

Merci de ton aide Julien et à plus tard.

Tof
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
9 mai 2007 à 15:28
Salut,
Il te faut relire ce que je t'ai mis.
il faut modifier la déclaration de ta Sub EnvoiMail
Sub EnvoiEmail(Adresse As Range, Objet As Range, Corps As Range, Optional PJ As Range)

End Sub<hr />

'Ensuite il te suffit de l'appeler ainsi
Sub Envoi()
   Call EnvoiEmail(Range("B3"), Range("B4"), Range("B5:B15"), Range("B17"))
End Sub

De plus ce n'esst pas B5,B15 Mais B5:B15.
Une fois ces modif faite chez moi je n'ai pas de problème
Ensuitre peu être me manque t'il des infos. la ligne qui plante. etc
@+: Ju£i?n
Pensez: Réponse acceptée
0
SUMACNAJ Messages postés 35 Date d'inscription mercredi 2 mai 2007 Statut Membre Dernière intervention 13 septembre 2007
9 mai 2007 à 15:39
Re,

J'ai bien essayé ta méthode et je viens de refaire le tout. Lorsque je déclenche la procédure ensuite en cliquant sur mon bouton "Envoyer", il me met "Incompatibilité de type" et puis plus rien. Je ne sais pas à quelle ligne ça plante, et si je clique sur l'aide, ça me donne "Type incompatible (erreur 13)  :
Visual Basic peut convertir et forcer plusieurs valeurs pour effectuer des affectations de [javascript:hhobj_3.Click() type de données] qui étaient impossibles dans des versions antérieures. Cependant, cette erreur peut toujours se produire et peut avoir les causes et solutions suivantes :

<li class= "LB1"> La [javascript:hhobj_4.Click() variable] ou la [javascript:hhobj_5.Click() propriété] n'est pas du type approprié. Par exemple, une variable nécessitant une valeur entière ne peut pas accepter de valeur de chaîne sauf si cette valeur peut être reconnue comme un entier. Essayez d'effectuer des affectations uniquement entre [javascript:hhobj_6.Click() types de données] compatibles. Par exemple, un Integer peut toujours être affecté à une variable de type Long, un type Single peut toujours être affecté à une variable de type Double, et n'importe quel type (à l'exception d'un [javascript:hhobj_7.Click() type défini par l'utilisateur]) peut être affecté à une variable de type Variant.

</li><li class ="LB1">Un objet a été passé à une )[javascript:hhobj_8.Click() procédure] attendant une propriété ou une valeur simple. Passez la propriété simple appropriée ou appelez une [javascript:hhobj_9.Click() méthode] adaptée à l'objet.

</li><li class= "LB1"> Un nom de [javascript:hhobj_10.Click() module] ou de [javascript:hhobj_11.Click() projet] a été utilisé à l'endroit où une [javascript:hhobj_12.Click() expression] était attendue, par exemple :
Debug.Print MyModule


Spécifiez une expression pouvant être affichée.

</li><li class ="LB1">Vous avez tenté de combiner une gestion d'erreurs Basic traditionnelle avec des valeurs de type Variant ayant le sous-type Error (10, vbError), par exemple :
Error CVErr(n)


Pour générer à nouveau une erreur, vous devez trouver la correspondance à une erreur Visual Basic intrinsèque ou définie par l'utilisateur, puis générer cette erreur.
</li><li class"LB1"> Une valeur CVErr ne peut pas être convertie en Date. Par exemple :
MyVar  CDate(CVErr(9))


Utilisez une instruction Select Case ou une structure similaire pour mapper le renvoi de CVErr à ce type de valeur.

</li><li class="LB1">Au moment de l'[javascript:hhobj_13.Click() exécution], cette erreur indique généralement qu'une variable de type Variant utilisée dans une expression a un sous-type incorrect, ou qu'une variable de type Variant contient un [javascript:hhobj_14.Click() tableau] apparaissant dans une instruction Print #. Pour imprimer des tableaux, créez une boucle affichant chaque élément individuellement.

</li>Pour plus d'informations, sélectionnez l'élément en question et appuyez sur F1 (sous Windows) ou AIDE (sur Macintosh).

Comment savoir la ligne qui me fait planter le tout ? Dois-je changer tous les "String" par des "Range" ? Est-ce que je peux éventuellement t'envoyer mon fichier Excel par mail ?

Dans tous les cas merci de ton aide et de ta réactivité.
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
9 mai 2007 à 15:41
SAlut,
Oui envoie:

epsylon9@gmail.com

@+: Ju£i?n
Pensez: Réponse acceptée
0
SUMACNAJ Messages postés 35 Date d'inscription mercredi 2 mai 2007 Statut Membre Dernière intervention 13 septembre 2007
9 mai 2007 à 15:48
Re,

C'est parti, merci.
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
9 mai 2007 à 16:01
Salut,
Est ce que tu souhaites garder le choix pour l'envoi du mail ou est ce que tu enverras toujours avec le même logiciel

@+: Ju£i?n
Pensez: Réponse acceptée
0
SUMACNAJ Messages postés 35 Date d'inscription mercredi 2 mai 2007 Statut Membre Dernière intervention 13 septembre 2007
9 mai 2007 à 16:04
Re,

Fabuleux , ça marche, j'ai bien tout mais effectivement il ne tient plus compte des cellules et me met tous mes champs les uns collés aux autres comme si ils était dans la même cellule. Existe-t-il une parade pour cela ?

Merci
0
SUMACNAJ Messages postés 35 Date d'inscription mercredi 2 mai 2007 Statut Membre Dernière intervention 13 septembre 2007
9 mai 2007 à 16:08
Salut,

Petit précision, j'ai lu sur certain message du Forum, que l'on pouvait mettre %OA ou %OB pour effectuer des retours chariots mais je n'ai pas saisis à quel endroit il fallait les mettre. Décidément, j'ai vraiment de sérieuses lacunes.

Encore merci de ton aide Ju£i?n.
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
9 mai 2007 à 16:13
OUps je crois que j'ai envoyer un mail sans le faire expres;...

Sorry

@+: Ju£i?n
Pensez: Réponse acceptée
0
SUMACNAJ Messages postés 35 Date d'inscription mercredi 2 mai 2007 Statut Membre Dernière intervention 13 septembre 2007
9 mai 2007 à 16:13
Re,

Le logiciel sera toujours le même puisque nous utilisons tous MICROSOFT OFFICE OUTLOOK 2000 ou 2003 mais à terme tout le monde sera en 2003 (avant l'été).

Donc je ne souhaite pas obligatoirement garder les autres options mais je n'ai pas assez de connaissances pour venir épurer le travail qui avait déjà été fait.

a+

Tof
0
SUMACNAJ Messages postés 35 Date d'inscription mercredi 2 mai 2007 Statut Membre Dernière intervention 13 septembre 2007
9 mai 2007 à 16:16
Aucun problème, j'ai bien le mail et il me semble que cela serait très déplacé de ma part de grogner non  

Excuses très largement accpetées.
0
Rejoignez-nous