Erreur définie par l'application ou par l'objet
Salut,
Sur la feuille "Accueil" de mon fichier, j'ai un UserForm dans lequel j'ai inséré une ListView1 dans laquelle je peux double cliquer pour charger des données dans les feuilles Archive_Page1 et Achive_page2.
Mon UserForm et sa ListView1 :
Lorsque je double clique sur l'un des résultats de la ListView, j'ai ce code qui se lance (j'ai défini des niveaux d'accès aux feuilles Archive_Page1 et Archive_Page2 selon le mail de l'utilisateur du fichier) :
Private Sub ListView1_DblClick()
On Error GoTo ErrHandler
If ListView1.SelectedItem Is Nothing Then Exit Sub
' Récupération de l'ID uniquement
Dim ID As Long
ID = CLng(ListView1.SelectedItem.Text)
Application.ScreenUpdating = False
Me.Hide
' Appel de ChargerDonnees et ChargerDonnees2 avec uniquement l'ID
ChargerDonnees ID 'pour charger Archive_Page1
ChargerDonnees2 ID 'pour charger Archive_Page2
' Vérification de l'autorisation d'accès
Dim outlookApp As Object
Dim userEmail As String
Dim niveau1Emails As Variant
Dim niveau2Emails As Variant
Dim isNiveau1 As Boolean
Dim isNiveau2 As Boolean
' Définir les niveaux d'accès
niveau1Emails = Array("mail1@essai.fr", "mail2@essai.fr", "mail3@essai.fr")
niveau2Emails = Array("mail1@essai.fr", "mail2@essai.fr", "mail4@essai.fr", "mail6@essai.fr")
' Récupérer l'email de l'utilisateur
On Error Resume Next
Set outlookApp = CreateObject("Outlook.Application")
If Not outlookApp Is Nothing Then
userEmail = outlookApp.Session.currentUser.AddressEntry.GetExchangeUser.PrimarySmtpAddress
End If
Set outlookApp = Nothing
On Error GoTo ErrHandler
' Vérifier les niveaux d'accès
isNiveau1 = IsEmailInArray(userEmail, niveau1Emails)
isNiveau2 = IsEmailInArray(userEmail, niveau2Emails)
' Références aux feuilles
Dim wsArchive1 As Worksheet
Dim wsArchive2 As Worksheet
Set wsArchive1 = ThisWorkbook.Sheets("Archive_Page1")
Set wsArchive2 = ThisWorkbook.Sheets("Archive_Page2")
' S'assurer que les feuilles sont déprotégées avant modification
On Error Resume Next
wsArchive1.Unprotect
wsArchive2.Unprotect
On Error GoTo ErrHandler
' Configuration selon le niveau d'accès
If isNiveau2 Then
wsArchive2.Visible = xlSheetVisible
wsArchive1.Visible = xlSheetVisible
ElseIf isNiveau1 Then
wsArchive1.Visible = xlSheetVisible
wsArchive2.Visible = xlSheetVeryHidden
Else
wsArchive1.Visible = xlSheetVisible
wsArchive2.Visible = xlSheetVeryHidden
wsArchive1.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _
UserInterfaceOnly:=True, AllowFormattingCells:=False
End If
' Activer Archive_Page1
wsArchive1.Activate
Application.ScreenUpdating = True
Exit Sub
ErrHandler:
Application.ScreenUpdating = True
If Err.Number <> 0 Then
MsgBox "Une erreur s'est produite : " & Err.Description, vbExclamation
Resume Next
End If
End SubDans un module à part, j'ai le code de la fonction utilisée ci-dessus, IsEmailInArray :
Public Function IsEmailInArray(email As String, arr As Variant) As Boolean
Dim i As Long
' Si l'email est vide, retourner False
If Len(Trim(email)) = 0 Then
IsEmailInArray = False
Exit Function
End If
' Parcourir le tableau pour chercher l'email
For i = LBound(arr) To UBound(arr)
If LCase(Trim(email)) = LCase(Trim(arr(i))) Then
IsEmailInArray = True
Exit Function
End If
Next i
' Si l'email n'est pas trouvé, retourner False
IsEmailInArray = False
End FunctionLe code qui charge les données dans la feuille Archive_Page1 est celui-ci :
Sub ChargerDonnees(ID As Long)
On Error GoTo GestionErreur
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("BDD1")
Dim wsCharger As Worksheet
Set wsCharger = ThisWorkbook.Sheets("Archive_Page1")
' Trouver la ligne correspondante dans BDD1
Dim selectedRow As Long
selectedRow = Application.Match(ID, ws.Range("A:A"), 0)
If IsError(selectedRow) Then
MsgBox "ID introuvable dans la feuille BDD1.", vbCritical
Exit Sub
End If
' Copier les données
wsCharger.Range("E3").Value = ws.Cells(selectedRow, GetColumnByHeader(ws, "Date")).Value
wsCharger.Range("K3").Value = ws.Cells(selectedRow, GetColumnByHeader(ws, "Heure")).Value
wsCharger.Range("K8").Value = ws.Cells(selectedRow, GetColumnByHeader(ws, "Nom")).Value
wsCharger.Range("K9").Value = ws.Cells(selectedRow, GetColumnByHeader(ws, "Prénom")).Value
wsCharger.Range("K11").Value = ws.Cells(selectedRow, GetColumnByHeader(ws, "Date de naissance")).Value
wsCharger.Range("K12").Value = ws.Cells(selectedRow, GetColumnByHeader(ws, "Adresse privée")).Value
wsCharger.Activate
Exit Sub
GestionErreur:
MsgBox "Erreur lors du chargement des données : " & Err.Description, vbCritical
End SubLe code qui charge les données dans la feuille Archive_Page2 est celui-ci :
Sub ChargerDonnees2(ID As Long)
On Error GoTo GestionErreur
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("BDD1")
Dim wsCharger As Worksheet
Set wsCharger = ThisWorkbook.Sheets("Archive_Page2")
' Déprotéger la feuille Archive_Page2
wsCharger.Unprotect
' Trouver la ligne correspondante dans BDD1
Dim selectedRow As Long
selectedRow = Application.Match(ID, ws.Range("A:A"), 0)
If IsError(selectedRow) Then
Exit Sub
End If
' Premier bloc
wsCharger.Range("E7").Value = ws.Cells(selectedRow, GetColumnByHeader(ws, "Appréciation1")).Value
wsCharger.Range("I8").Value = ws.Cells(selectedRow, GetColumnByHeader(ws, "Appréciation2")).Value
wsCharger.Range("I9").Value = ws.Cells(selectedRow, GetColumnByHeader(ws, "Appréciation3")).Value
wsCharger.Range("I10").Value = ws.Cells(selectedRow, GetColumnByHeader(ws, "Appréciation4")).Value
' Formatage des cellules
With wsCharger.Range("E7")
.Font.Name = "Calibri"
.Font.Size = 11
End With
' Déprotéger la feuille avant de modifier les protections
wsCharger.Unprotect
' Verrouiller toutes les cellules
wsCharger.Cells.Locked = True
' Verrouiller tous les boutons et formes
Dim shp As Shape
For Each shp In wsCharger.Shapes
On Error Resume Next
shp.Locked = True
On Error GoTo 0
Next shp
' Protéger la feuille avec toutes les restrictions, sans mot de passe
wsCharger.Protect DrawingObjects:=True, _
Contents:=True, _
Scenarios:=True, _
UserInterfaceOnly:=True, _
AllowFormattingCells:=False, _
AllowFormattingColumns:=False, _
AllowFormattingRows:=False, _
AllowInsertingColumns:=False, _
AllowInsertingRows:=False, _
AllowInsertingHyperlinks:=False, _
AllowDeletingColumns:=False, _
AllowDeletingRows:=False, _
AllowSorting:=False, _
AllowFiltering:=False, _
AllowUsingPivotTables:=False
' Activer la feuille
wsCharger.Activate
Exit Sub
GestionErreur:
MsgBox "Erreur lors du chargement des données : " & Err.Description, vbCritical
' Protéger la feuille même en cas d'erreur
wsCharger.Protect UserInterfaceOnly:=True
End SubJe ne comprends pas pourquoi, lorsque je lance la macro Sub ListView1_DblClick j'ai le message suivant qui s'affiche : je précise que, une fois que j'ai cliqué sur OK il disparait et n'empêche pas le fichier d'être exploitable mais c'est curieux...je ne vois pas d'où ca peut venir. D'autant que ce message n'apparait qu'une seule fois, c'est à dire que si je reclique dans ma ListView1, les feuilles Archive_Page1 et Archive_Page2 s'affichent sans que ce message n'apparaisse au préalable...
Auriez-vous une idée ? car je ne sais plus où chercher...
Bonjour,
Alors tout d'abord je tiens quand même a vous féliciter votre code est très propre et facile à relire.
A priori il est difficile de bien cerner le point qui lève l'erreur. Si vous pouviez joindre un fichier de démo, ce serait parfait.
Dans l'état, mon intuition me pousse à la conclusion suivante :
C'est probablement le lien avec Outlook qui pose problème. Je vous conseillerai, au niveau de la connexion à l'app, d'ajouter des DoEvents comme ceci, afin de laisser à l'app le temps de se lancer. Cela pourrait expliquer pourquoi la 1e fois ça met une erreur, et après non (l'app reste active en arrière-plan).
' Récupérer l'email de l'utilisateur
On Error Resume Next
Set outlookApp = CreateObject("Outlook.Application")
DoEvents
If Not outlookApp Is Nothing Then
userEmail = outlookApp.Session.currentUser.AddressEntry.GetExchangeUser.PrimarySmtpAddress
End If
Set outlookApp = Nothing
DoEvents
On Error GoTo ErrHandlerSi ce n'est pas ça… Je pense qu'un fichier est nécessaire pour voir en exécution pas à pas.
1000 mercis! vous avez l'œil!
Il s'agissait effectivement d'un problème de connexion à Outllook... Un problème qui ne survenait pas sur mon PC perso (excel 2021) mais sur mon PC pro (excel 2013)
bonne journée
Merci pour votre retour, content d'aider.
Bonne journée également