Appel procédure

Bonjour

Je cherche à simplifier du code en appelant une procédure mais je n'y arrive pas

Pourriez-vous m'aide svp?

Je vous serais trés reconnaissant

Voici mon code qui me permet de recupérer les évenements d'outlook entre 2 dates contenant le texte "(m" ou "(s" et le texte "caro"

Sub testcaloutlook()
Dim OutlApp As New Outlook.Application
Dim OutlMapi As Outlook.Namespace
Dim OutlFolder As Outlook.MAPIFolder
Dim OutlItems As Outlook.Items
Dim OutlAppointment As Outlook.AppointmentItem
'
Dim datedebut As String
Dim datefin As String
Dim sujet As String
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
ActiveSheet.DisplayPageBreaks = False
Application.EnableEvents = False
Application.DisplayAlerts = False

' informe de la date de début et de fin des événemets du calendrier à rechercher
datedebut = Date - 10
datefin = Date + 90
'
Set OutlMapi = OutlApp.GetNamespace("MAPI")
Set OutlFolder = OutlMapi.GetDefaultFolder(olFolderCalendar)
Set OutlItems = OutlFolder.Items

Set OutlAppointment = OutlItems.Find("[Start] >= '" & datedebut & "'")

' boucle sur calendrier outlook entre date debut et date fin
While TypeName(OutlAppointment) <> "Nothing"
    If OutlAppointment.Start > datedebut And OutlAppointment.Start < datefin Then
    ' recherche événements du calendrier commencant par *
        ddd1 = Format(OutlAppointment.Start, "dd/mm/yyyy")
        ' recherche colonne de la date
        For Each Cell In plage2
            If Cell.Value = CDate(ddd1) Then
                col1 = Cell.Column
                col = Mid(Cell.Address, 2, InStr(2, Cell.Address, "$") - 2)
            End If
        Next Cell
        sujet = OutlAppointment.Subject

    If LCase(sujet) Like "*(m*" Or LCase(sujet) Like "*(s*" Then
        If LCase(sujet) Like "*(m*" then nb = 6
        If LCase(sujet) Like "*(s*" then nb = 7
        dep = InStr(1, sujet, "(m-") + 3
        Fin = InStr(dep, sujet, ")")
        texte = Trim(Mid(sujet, dep, Fin - dep))
        If LCase(sujet) Like "*caro*" Then
            Nom = "ARRAMBIDE"
            Date1 = ddd1
        End If
        Call enreg (texte, Nom, Date1, nb)
  End If

  Set OutlAppointment = OutlItems.FindNext
Wend

Application.ScreenUpdating = True
ActiveSheet.DisplayPageBreaks = True
Application.EnableEvents = True
Application.DisplayAlerts = True
Application.Calculation = xlCalculationAutomatic
End Sub

Je voudrais appeler ensuite la procédure "enreg" avec les arguments texte, nom et date

Voici mon code

Sub enreg(Nom, Date1, texte, nb)
        Set Plage = ThisWorkbook.Worksheets("Stats repas").Range("b56:b280")
        For Each Cell In Plage
            If Cell.Value = Nom Then ' si = au nom de la liste
                 lig = Cell.Row ' lig = au numéro de ligne de la feuil1
            End If
        Next Cell
        ' recherche date dans ligne 4
        Set plage1 = ThisWorkbook.Worksheets("Stats repas").Range("f55:NR55")
        For Each Cell In plage1
            If Cell.Value = CDate(Date1) Then
                 lettre = Mid(Cell.Address, 2, InStr(2, Cell.Address, "$") - 2)
                 ' lettre du numéro de colonne
            End If
        Next Cell
        sDatam = ""
        Range(lettre & lig + nb).Value = texte
        Range(lettre & lig).ClearComments
        If Range(lettre & lig + 6).Value <> "" Then sDatam = LCase(Range(lettre & lig + 6).Value)
        If Range(lettre & lig + 6).Value <> "" Or Range(lettre & lig + 7).Value <> "" Then sDatam = sDatam & "-"
        If Range(lettre & lig + 7).Value <> "" Then sDatam = sDatam & UCase(Range(lettre & lig + 7).Value)
        If Not Range(lettre & lig).Comment Is Nothing Then sDatam = sDatam & IIf(sDatam = "", "*", " *")
        If sDatam <> "" Then
            With Range(lettre & lig)
                .AddComment
                .Comment.Text sDatam
                .Comment.Shape.TextFrame.AutoSize = True
                .Comment.Visible = True
            End With
        End If
End Sub

Je comprends pas comment passer les arguments d'une procédure à l'autre

Les 2 procédures sont dans un m^me module

Je vous remercie beaucoup de votre aide

Cordialement

Bonjour,

A première vue la méthode est bonne :

Call enreg(texte, Nom, Date)

Par contre, la procédure "enreg" comporte à priori 4 arguments non optionnels (Nom, Date1, texte, nb).

Sinon, tu peux aussi déclarer tes variables hors procédure (en début de module). La valeur inscrite dans une procédure peut ainsi être réutilisée dans une autre.

Merci de votre réponse

J'ai un bug sur cette ligne

Range(lettre & lig + nb).Value = texte

si je remplace nb par 6, j'ai la même erreur

J'ai noté :

Call enreg(Nom, Date1, texte, nb)

et

Sub enreg(Nom, Date1, texte, nb)

J'ai fait en début de procedure enreg

MsgBox Nom & " - " & Date1 & " - " & texte & " - " & nb

le résultat est " - - KFK - 6"

Avez vous une solution svp ?

Merci

Sans fichier, c'est pas évident. Je vous conseille de faire une exécution pas à pas et de placer des espions sur vos variables pour voir les valeurs qu'elles prennent et comprendre l'origine de l'erreur.

En épluchant votre code, j'ai constaté un soucis à ce niveau :

        For Each Cell In plage1
            If Cell.Value = CDate(Date1) Then
                 lettre = Mid(Cell.Address, 2, InStr(2, Cell.Address, "$") - 2)
                 ' lettre du numéro de colonne
            End If
        Next Cell

Vu que vous fermer votre boucle à cet endroit, la variable lettre contiendra seulement la dernière lettre de colonne de la plage.

A votre place, je remplacerai également cette ligne :

 lettre = Mid(Cell.Address, 2, InStr(2, Cell.Address, "$") - 2)

Par celle-ci :

 lettre = Split(Cell.Address, "$")(1)

pour info je viens de modifier mon message précédent

pour info je viens de modifier mon message précédent

C'est la valeur des variables lettre et lig juste avant l'erreur qui seraient plus intéressantes.

Tout fonctionne

Merci beaucoup pour votre aide précieuse

bonne soirée

Rechercher des sujets similaires à "appel procedure"