Message d'erreur aléatoire excel 2016 en réseau avec utilisateurs ayant windows7 [Résolu]

Signaler
Messages postés
16
Date d'inscription
mercredi 10 août 2016
Statut
Membre
Dernière intervention
24 janvier 2020
-
eriiic
Messages postés
23229
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2020
-
Bonjour,

Je ne sais plus si c'est moi qui a le nez trop près de l'écran ou s'Il y a vraiment un problème mais j'ai besoin d'Aide! Je ne peux pas envoyer mon outil Excel à des fnis de confidentialité de la compagnie. mais bon, tentons du mieu qu'on peu...

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

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.

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. De leur côté, ça ne le fait pas toujours, environ 1x sur 2!!!!!
Je n'arrive pas à corriger la situation, qui devient irritante pour tout le monde! Ils utilisent l'outil environ 20 fois par jour!

Les références actives dans la 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
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

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
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


Configuration: Windows / Chrome 78.0.3904.97

5 réponses

Messages postés
23229
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2020
5 875
Bonjour,

Workbooks(ThisWorkbook.Sheets("list").Range("D21").Value).Close
LeBug = "Fin des etapes-2"
If ActiveWorkbook.Name <> ThisWorkbook.Sheets("list").Range("D22").Value Then 

juste une idée en passant :
Ajouter une petite tempo après le .Close que la fermeture soit complète et que le ActiveWorkbook qui suit ne disparaisse pas en cours de route.
eric
melidan06
Messages postés
16
Date d'inscription
mercredi 10 août 2016
Statut
Membre
Dernière intervention
24 janvier 2020

Bonjour Eric,
Merci de ta réponse. Effectivement, rarement mais quand meme, il arrive que des gens me disent que leur outil disparraîssent pendant le traitement de la macro . Alors ils ouvrent leur outil à nouveau et se retrouvent en lecture seule...

Qu'est-ce que "Tempo"? Je m'excuse de ma question, je suis pure québécoise et je n'ai jamais entendu ce terme... :(
Veux tu dire par "Tempo" d'ajouter le "savechanges"?
ex: Workbooks(ThisWorkbook.Sheets("list").Range("D21").Value).Close Savechanges = False?

Comment as-tu fais pour ajouter les chiffres 1 2 et 3 lorsque tu as inscrit le code dans ta réponse?

Et pour les autres problèmes, as-tu une idée?

merci à l'avance
Melissa
Messages postés
23229
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2020
5 875
C'est l'abréviation de temporisation: l'occuper à ne rien faire le temps que la fermeture du ficher se termine.
Par exemple insérer :
    For i = 1 To 10000
        DoEvents
    Next i

Pour mettre en forme le code le sélectionner, sur l'icone de mise en forme '<>' en haut choisir basic dans la liste déroulante.
eric
melidan06
Messages postés
16
Date d'inscription
mercredi 10 août 2016
Statut
Membre
Dernière intervention
24 janvier 2020

ok donc, disons que j,ajoute un tempo apres avoir demandé au fichier ouvert de se fermer:
...
Workbooks(ThisWorkbook.Sheets("list").Range("D21").Value).Close
Application.Wait Now + TimeValue("0:00:02")
...
c'est ça qui fait que mon outil ne disparaîtra pas dans le fond?
Messages postés
23229
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2020
5 875
Ah ça je n'en sais rien de si c'était la cause exacte de tes erreurs.
C'est une possibilité à tester.
Ajoute quand même un
DoEvents
pour donner la main aux tâches en arrière plan.
C'est pour ça que je t'avais proposé une boucle plutôt qu'un .Wait
eric

Edit : si tu as la solution sur un autre forum n'oublie pas de la reporter ici pour les futurs lecteurs...

En essayant continuellement, on finit par réussir. 
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Messages postés
16
Date d'inscription
mercredi 10 août 2016
Statut
Membre
Dernière intervention
24 janvier 2020

Bonjour Éric,
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!!!

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"
Messages postés
23229
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2020
5 875
Bonjour,

tu as tenté une grosse valeur pour la boucle ?
Du style For i = 1 To 30000
eric