XL 2016 Message d'erreur aléatoire pour les utilisateurs réseau -Excel 2016

Melidan2006

XLDnaute Nouveau
Bonjour,

J'ai un sérieux problème et j'ai besoin d'Aide! Je ne peux pas envoyer mon outil Excel à des fins de confidentialité de la compagnie. Je suis consciente que ça peut compliquer votre aide...

Voici ce qui se passe... Depuis quelques mois, nous avons été migré sur office 365, excel 2016. J'ai fabriqué un outil excel 2016 en février (Alors que j'étais encore sur windows 7). Les gens l'utilisent via un réseau sécurisé dans la compagnie (eux aussi avec Windows 7).

Le problème: J'ai migré à Windows 10 64 bits en octobre mais pas mes collègues. Ils sont toujours à Windows 7 32 bits.
Chaque fois qu'ils ont une erreur technique, j'ai demandé à Excel de m'envoyer un message d'erreur avec l'information.
Presque Toujours la même chose: Variable objet ou variable de bloc With non définie ou L'indice n'appartient pas à la sélection.

Le code qui est en problème se trouve dans un Module et est déclenché dans un Userform par Call Rech_trans
J'ai validé et mes objects sont tous définis au départ. Je n'ai pas de bloc with dans ce code.

Or, de mon côté, je ne suis pas capable de générer cet erreur, tout fonctionne toujours nickel. De leur côté, l'erreur n,arrive pas toujours, environ 1x sur 2!!!!!
Donc parfois ça fonctionne, parfois non!

Je suis limité avec mes connaissances Excel et nul en Informatique. Je n'arrive pas à corriger la situation, qui devient irritante pour tout le monde! Ils utilisent l'outil environ 20 fois par jour!

Les objets - références actives dans cet outil excel VBA sont:


Merci de votre aide à l'avance, je suis désespérée... je ne compte plus les heures que j'ai mis à tenter de trouver le problème.

Plus bas, je vous donne mon code. EN caractere gras est l'endroit où mon code bloque le plus souvent 99% du temps:


Sub Rech_trans()

'**********************
' VBA ok 2019/02/25 MF
'**********************

'Pour aller chercher toutes les transactions du stagiaire
'Par # de ADMvt de la feuille Recherche/Search
'Possibiliter d'importer également les transactions archivées ou pas, selon le désire du stagiaire

Dim motdp As String
Dim ADMvt As String 'Identification de la transaction
Dim Bonneligne, LigneActive As String
Dim a, b, c, d As String
Dim LeBug As String

Dim i, X As Integer

Dim Nb, Action As Byte 'Pour dire le nombre de transaction(s) trouvée(s)

'MsgBox "La recherche prendra quelques secondes. Veuillez patienter.", vbInformation, "Avis!"

Application.ScreenUpdating = False
Application.DisplayAlerts = False
'Excel.Application.Visible = False

motdp = ThisWorkbook.Sheets("list").Range("A1").Value
ThisWorkbook.Unprotect Password:=motdp
LeBug = "Etape 1"
If ActiveSheet.Name <> "Recherche - Search" Then
ThisWorkbook.Sheets("Recherche - Search").Activate
End If
ActiveSheet.Unprotect Password:=motdp

On Error GoTo errorhandler

If Excel.Application.Visible = True Then
Excel.Application.Visible = False
End If


'**********************
' ETAPE 1: Effacer les anciens résultats
'**********************

''Sélectionner la feuille Recherche
'If ActiveSheet.Name <> "Recherche - Search" Then
' LeBug = "Etape 1-1-1"
' ThisWorkbook.Sheets("Recherche - Search").Activate
'End If

LeBug = "Etape 1-2"
ThisWorkbook.Sheets("Recherche - Search").Range("B11:D3000").ClearContents
LeBug = "Etape 1-3"
ThisWorkbook.Sheets("Recherche - Search").Range("F11:H3000").ClearContents


LeBug = "Etape 1-4"
'Préparer le critère de l'individu: Linker le Code de l'agent pour retracer toutes ses transactions ds la BD
ADMvt = ThisWorkbook.Sheets("Recherche - Search").Range("B6").Value


'**********************
' ETAPE 2: 'Ouvrir BD en mode lecture seule
'**********************
LeBug = "Etape 2-1"
Workbooks.Open Filename:= _
"G:\SPP\" & ThisWorkbook.Sheets("list").Range("D21").Value, _
ReadOnly:=True
Workbooks(ThisWorkbook.Sheets("list").Range("D21").Value).Activate
Range("A60000").End(xlUp).Select
Bonneligne = ActiveCell.Row

Range("B5").Select
If Range("A6") = "" Then
Workbooks(ThisWorkbook.Sheets("list").Range("D21").Value).Close
Application.Wait Now + TimeValue("0:00:02")
If Excel.Application.Visible = False Then
Excel.Application.Visible = True
End If
If ActiveWorkbook.Name <> ThisWorkbook.Sheets("list").Range("D22").Value Then
ThisWorkbook.Activate
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "Aucune transaction retracée.", vbInformation + vbOKOnly, "Aucune transaction!"
Exit Sub
End If


'**********************
' ETAPE 3: 'Filtrer selon les critères (AdMvt+transctions archivées ou AdMvt sans les transactions archivées
'**********************
'Cell linké avec la case à cocher "Inclure les transactions archivées"
'Filtrer le code ADMvt
LeBug = "Etape 3"
ActiveSheet.Range("$A$5:GE" & Bonneligne).AutoFilter Field:=2, Criteria1:=ADMvt
If ThisWorkbook.Sheets("Recherche - Search").OLEObjects("CheckBox1").Object.Value = False Then 'Ne pas inclure les archives car pas coché
a = ActiveWorkbook.Sheets("Statut").Range("B3").Value
b = ActiveWorkbook.Sheets("Statut").Range("B4").Value
c = ActiveWorkbook.Sheets("Statut").Range("B5").Value
d = ActiveWorkbook.Sheets("Statut").Range("B6").Value
'Filtrer le statut
ActiveSheet.Range("$A$5:GE" & Bonneligne).AutoFilter Field:=17, Criteria1:=Array(a, b, c, d), Operator:=xlFilterValues
End If


'**********************
' ETAPE 4: Importer les transactions demandées - #Transaction, Date, Statut, puis Police#, Nom, Date naiss.
'**********************
'Si pas de transaction pour les critères demandés, ne pas copier car va copier toutes les transactions de tout le monde.
LeBug = "Etape 4"
On Error GoTo errorhandler2
'Trouver la derinère ligne inscrite dans la BD avec les critères demandés.
Range("A6:A" & Range("A65000").End(xlUp).Row).SpecialCells(xlVisible).Cells(1, 1).Select 'Si pas de transaction filtrée, va aller à errorhandler2.
' Range("A5").End(xlDown).Select

'***Rendu ici, c'est qu'il y a présence de transactions pour le stagiaire selon ses critères
LigneActive = ActiveCell.Row
If ActiveCell.Value <> "" Then
ActiveCell.End(xlDown).Select
'Empêcher de copier jusqu'à la ligne 1048576 si seulement une transaction
If ActiveCell.Row = 1048576 Then
Bonneligne = LigneActive
ActiveCell.End(xlUp).Select
Else: Bonneligne = ActiveCell.Row
End If
Else: GoTo errorhandler2
End If
'ActiveCell.Offset(0, 1).Select

On Error GoTo errorhandler
' If ActiveCell.Offset(0, 1).Value = ADMvt Then 'Si c'est le code mouvement du stagiaire, copier
' Pour recopier la plage désirée uniquement si présence de transcations ds la BD avec les critères demandés
'#Transaction
Range("A6:A" & Bonneligne).Copy
ThisWorkbook.Sheets("Recherche - Search").Range("B11").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
'Date
Range("G6:G" & Bonneligne).Copy
ThisWorkbook.Sheets("Recherche - Search").Range("C11").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
'Statut
Range("Q6:Q" & Bonneligne).Copy
ThisWorkbook.Sheets("Recherche - Search").Range("D11").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
'#Police, nom, date naiss.
Range("L6:N" & Bonneligne).Copy
ThisWorkbook.Sheets("Recherche - Search").Range("F11").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
' End If

'**********************
' FIN DES ETAPES
'**********************
LeBug = "Fin des etapes-1"
Workbooks(ThisWorkbook.Sheets("list").Range("D21").Value).Close
Application.Wait Now + TimeValue("0:00:02")

LeBug = "Fin des etapes-2"
If ActiveWorkbook.Name <> ThisWorkbook.Sheets("list").Range("D22").Value Then
LeBug = "Fin des etapes-2-1"
ThisWorkbook.Activate
End If

LeBug = "Fin des etapes-3"
ThisWorkbook.Sheets("Recherche - Search").Range("H9").Value = Format(Date, "YYYY/MM/DD")
LeBug = "Fin des etapes-4"
ActiveSheet.Protect Password:=motdp
LeBug = "Fin des etapes-5"
If Not ThisWorkbook.ProtectWindows And Not ThisWorkbook.ProtectStructure Then
LeBug = "Fin des etapes-5-1"
ThisWorkbook.Protect Password:=motdp
End If
LeBug = "Fin des etapes-6"
If Excel.Application.Visible = False Then
LeBug = "Fin des etapes-6-1"
Excel.Application.Visible = True
End If
LeBug = "Fin des etapes-7"
'ThisWorkbook.Sheets("Recherche - Search").Range("B11").Activate
LeBug = "Fin des etapes-8"
Application.ScreenUpdating = True
Application.DisplayAlerts = True
LeBug = "Fin des etapes-9"
ThisWorkbook.Save
Exit Sub
errorhandler:
ThisWorkbook.Sheets("list").Range("F18").Value = Err.Description
ThisWorkbook.Sheets("list").Range("E18").Value = "Module 6 Rech_trans"
ThisWorkbook.Sheets("list").Range("D18").Value = "Non"
ThisWorkbook.Sheets("list").Range("D29").Value = LeBug
Call envoi_autre_erreur 'Module 1
ThisWorkbook.Sheets("list").Range("F18").Value = ""
ThisWorkbook.Sheets("list").Range("E18").Value = ""
ThisWorkbook.Sheets("list").Range("D18").Value = ""
ThisWorkbook.Sheets("list").Range("D29").Value = ""
If ActiveSheet.Name <> "Recherche - Search" Then
ThisWorkbook.Sheets("Recherche - Search").Activate
End If
Range("B10").Select
If IlEstOuvert(Workbooks, ThisWorkbook.Sheets("list").Range("D21").Value) = True Then
'msgbox "Le classeur est déjà ouvert !"
Workbooks(ThisWorkbook.Sheets("list").Range("D21").Value).Close
End If
ActiveSheet.Protect Password:=motdp
If ThisWorkbook.ProtectWindows Or ThisWorkbook.ProtectStructure Then
Else: ThisWorkbook.Protect Password:=motdp
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
If Excel.Application.Visible = False Then
Excel.Application.Visible = True
End If

errorhandler2: 'Pour éviter qu'il y ait une erreur technique lorsqu'il n'y a aucune transaction pour ses stagiaires non archivées et que les archives sont exclues de la demande
If IlEstOuvert(Workbooks, ThisWorkbook.Sheets("list").Range("D21").Value) = True Then
'msgbox "Le classeur est déjà ouvert !"
Workbooks(ThisWorkbook.Sheets("list").Range("D21").Value).Close
Application.Wait Now + TimeValue("0:00:02")
End If
If ActiveSheet.Name <> "Recherche - Search" Then
ThisWorkbook.Sheets("Recherche - Search").Activate
End If
Range("B10").Select
ThisWorkbook.Sheets("Recherche - Search").Protect Password:=motdp
If ThisWorkbook.ProtectWindows Or ThisWorkbook.ProtectStructure Then
Else: ThisWorkbook.Protect Password:=motdp
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
If Excel.Application.Visible = False Then
Excel.Application.Visible = True
End If
MsgBox "Aucune transaction active!", vbOKOnly + vbInformation, "Vous êtes à jour!"
End Sub
 
Dernière édition:
Solution
Bonjour Eriiic,
après une semaine de test avec la modification du code
ayant ajouté le code DoEvents comme tu me conseillais, après que j'ai demandé au système de fermer le fichier excel, j'avais encore des erreurs mais beaucoup moins.

J'ai aussi ajouté le DoEvents à l'ouverture de mon autre fichier excel.

Mon Userform ouvrait à partir d'un module appelé par un bouton sur une feuille excel.
J'ai donc modifié l'ordre de la série de VBAs à exécuter depuis le UserForm que j'utilisais (retiré les "Call" dans le UserForm et les ai transféré dans un module à la place, juste apres que mon Userform soit fermé.

Du coup, avec les 3 solutions ensembles, j'ai réussi à retirer plus de 85% des erreurs qui arrivaient aléatoirement...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Melidan,
Juste pour faire la synthèse :
- Vous créez votre outil sous XL2016 et Win7. Tout est ok.
- Vous basculez sous XL365 et donc toujours sous Win7.
- Aujourd'hui vous avez XL365 Win10 : OK, vos "clients" sous sous XL365 Win7 : KO.

Mais avez vous eu la config XL2016 et Win7 ? Est ce que ça marchait chez vous ?
 

Melidan2006

XLDnaute Nouveau
Bonjour Sylvanu,
merci de voter intérêt

En faite, nous avons XL365 depuis le début. Je croyais que Xl2016 et 365 était la même chose. Désolée.
Nous travaillons tous dans la même compagnie, dans un secteur différent. Ce qui fait que moi, j'ai été migré dans Windows10 et pas eux. Nous sommes tous sur le même réseau.
De mon côté., tout fonctionne très bien.
 

Melidan2006

XLDnaute Nouveau
Oui effectivement Eric, j'ai placé le post aux 2 endroits. J'utilise les 2 plateformes pour m'aider.

Devrais-je détruire l'autre sur comment ca marche et laisser celui-ci actif? Question de ne pas avoir 2 conversations en même temps?

Je suis à tester le DoEvents que vous m'avez parlé, mais je ne sais pas du tout où le placer exactement. Je lis sur internet et je tente de comprendre... ça dit aussi qu'il y a des risques de surcharge... de là la boucle j'imagine: pour limiter le temps du DoEvents. https://codes-sources.commentcamarc...lemes-et-solutions#cas-d-une-boucle-d-attente

Devrais-je le placer à l'ouverture et aussi à la fermeture du fichier BD?
Comme ceci?

...
'**********************
' ETAPE 2: 'Ouvrir BD en mode lecture seule
'**********************
LeBug = "Etape 2-1"
Workbooks.Open Filename:= _
"G:\SPP\" & ThisWorkbook.Sheets("list").Range("D21").Value, _
ReadOnly:=True
For i = 1 To 10000
DoEvents
Next i

...

'**********************
' FIN DES ETAPES
'**********************
LeBug = "Fin des etapes-1"
Workbooks(ThisWorkbook.Sheets("list").Range("D21").Value).Close
For i = 1 To 10000
DoEvents
Next i

...
Application.Wait Now + TimeValue("0:00:02")
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Non, tu peux laisser les deux.
Sur une question simple le crossposting n'est pas bien vu, mais comme ce style de problème est tordu, toutes les idées seront bienvenues pour toi.
Oui, c'est bien après le .Close que je le voyais.
Le but est de laisser le .Close se finir complètement avant que dans la foulée tu utilises ton ActiveWorkbook sur le bon classeur, et non sur celui qui a disparu entretemps.
Ne pas avoir peur de tailler large sur la boucle, quitte à affiner ensuite si tu constates une amélioration.
eric
 
Dernière édition:

Melidan2006

XLDnaute Nouveau
Disons qu'on apprécie rarement de passer 1/4h ou 1/2h à préparer une réponse, pour s'apercevoir ensuite que c'est résolu depuis 6h sur un autre forum ;-)

Je comprends tout à fait. Je vais fermer les posts dès que j'ai la certitude que ça fonctionne. Ensuite, je ne ferai plus jamais cette erreur là! Je n'avais pas voulu malfaire... juste trouver la solution miracle à mon problème :D
Je te reviens dès que jai essayé le DoEvents
 

Melidan2006

XLDnaute Nouveau
Bonjour Eriiic,
après une semaine de test avec la modification du code
ayant ajouté le code DoEvents comme tu me conseillais, après que j'ai demandé au système de fermer le fichier excel, j'avais encore des erreurs mais beaucoup moins.

J'ai aussi ajouté le DoEvents à l'ouverture de mon autre fichier excel.

Mon Userform ouvrait à partir d'un module appelé par un bouton sur une feuille excel.
J'ai donc modifié l'ordre de la série de VBAs à exécuter depuis le UserForm que j'utilisais (retiré les "Call" dans le UserForm et les ai transféré dans un module à la place, juste apres que mon Userform soit fermé.

Du coup, avec les 3 solutions ensembles, j'ai réussi à retirer plus de 85% des erreurs qui arrivaient aléatoirement.

Donc au lieu de recevoir plus de 25 erreurs de mes confrères par jour, je suis passé de 0 à 3x par jour!!!

Je vais tester ma boucle DoEvents vec 3000 au lieu de 1000, ça va peut-être régler le reste des erreurs...

C'est merveilleux! MERCI DE TON AIDE PRECIEUSE ERIC!!!!!!!

Voici comment j'ai ajouté ton truc DoEvents:
'**********************
' FIN DES ETAPES
'**********************
LeBug = "Fin des etapes-1"
Workbooks(ThisWorkbook.Sheets("list").Range("D21").Value).Close
For i = 1 to 1000
DoEvents
Next i

LeBug = "Fin des etapes-2"
If ActiveWorkbook.Name <> ThisWorkbook.Sheets("list").Range("D22").Value Then
LeBug = "Fin des etapes-2-1"
ThisWorkbook.Activate
End If
LeBug = "Fin des etapes-3"
 

blord

XLDnaute Impliqué
Bonjour,

Dans mon entreprise, nous sommes 2 personnes à faire du développement VBA avec Excel. Nous avons rapidement constaté qu'Excel avait changé au niveau de la gestion des "classeurs actifs" et que le "vrai" classeur actif peut être différent de ce qui est affiché à l'écran.

Comme vous utilisez "ActiveWorkbook" dans votre code, il est possible que justement, le classeur actif ne soit pas celui que l'on voudrait, d'où l'erreur par intermittence "L'indice n'appartient pas à la sélection" ...

Une façon de corriger cette situation serait d'attribuer le nom du classeur à une variable et de l'utiliser partout dans le code au lieu du ActiveWorkbbok...

Je pense que cela pourrait corriger votre problème, par contre, je n'ai pas attentivement réviser le code...

Benoit Lord
 

Melidan2006

XLDnaute Nouveau
Bonjour blord,

Effectivement, j'avais constaté la même chose dans le passé. Parfois c'est le bon qui est actif, parfois non... C'est pourquoi je valide le nom de "l'ActiveWorkbook" avant de demander de faire l'Action.
Si le nom de l'ActiveWkbk n'est psa celui que je veux, là je demande "Thisworkbook.Activate" car je suis certaine qu'il n'était pas actif et normalement, qu'il s'active, il n'y a pas d'ambiguité avec "ThisWkbk" selon moi.

LeBug = "Fin des etapes-2"
If ActiveWorkbook.Name <> ThisWorkbook.Sheets("list").Range("D22").Value Then
LeBug = "Fin des etapes-2-1"
ThisWorkbook.Activate
End If


Je pourrais mettre le nom en variable mais je n'ai pas forcé cette étape puisque je valide avant tout le nom de l'"ActiveWkbk" avant et la plupart du temps, tout fonctionne correctement.
ça vaudrait le coup d'essayer ;)
Merci pour la piste en plus.
 

Discussions similaires