XL 2010 contourner "Classeur1" est en cours d'utilisation. Réessayer ultérieurement.

David590

XLDnaute Occasionnel
Bonjour à tous,

J'ai un problème avec une fenêtre d'erreur que j'aimerai masquer, je m'explique :

Une macro tourne en boucle sur le Classeur1 qui est ouvert sur le PC1

Une macro du Classeur2 qui est ouvert sur le PC2 ouvre le Classeur1 du PC1 en lecture seule pour récupérer des données et le referme tout de suite

VB:
Workbooks.Open chemin & "Classeur1.xlsm", ReadOnly:=True
Workbooks("Classeur1.xlsm").Sheets("Feuil1").Range("A1:Z400").Copy Workbooks("Classeur2.xlsm").Sheets("Feuil1").Range("A1")
Workbooks("Classeur1.xlsm").Close False

Mon problème survient lorsque la macro du Classeur1 sauvegarde avec Workbooks(Classeur1).Save

Dans la plupart des cas tout va bien mais si le PC2 ouvre/ferme le Classeur1 pile quand celui se sauvegarde j'ai une fenêtre sur le PC1 avec ce message :

".....\Classeur1" est en cours d'utilisation. Réessayer ultérieurement.

j'ai essayer : Application.DisplayAlerts = False
mais la fenêtre vient quand même, ce qui suspend la macro tant que je n'appui pas sur Ok

Comment puis-je faire pour contourner cette fenêtre ?
 
une solution possible serait de s'assurer que l'enregistrement et la lecture des données ne peuvent pas se faire en même temps avec timer, par exemple enregistrement seconde nombre pair, lecture seconde nombre impair avec une boucle d'attente
on peut étendre le délai si l'enregistrement est plus long du genre 0 ou 5 pour les secondes ou une formule du genre secondes\x =secondes/x
 

patricktoulon

XLDnaute Barbatruc
tu est obligé de faire dans chacun des fichiers tu peux pas gérer cet evenement (interne à excel) dans le classeur destination pour le classeur source

il existe des fonctions de test pour savoir si un classeur peut s'ouvrir en lecture seule ou pas
tu trouvera moult versions si tu te donne la peine de chercher sur le forum

cette fonction devra être la condition dans le classeur source pour la mise a jour perpétuelle
 

David590

XLDnaute Occasionnel
Oui c'est bien ca , mais qu'on se comprenne bien, la plupart du temps ca fonctionne bien même quand j'ouvrais en lecture seule/copier/coller/fermer mais de temps en temps ca plante

Avec ton code qui est beaucoup plus rapide ca devrait déjà être mieux, mais si je fais un test extrême avec une boucle qui save sur le PC1 et une autre qui consulte sur le PC2 ca coince quand même par moment

Et oui étonnant mais c'est bien le classeur source qui est belle est bien déjà ouvert sur PC1 qui n'arrive pas au sauvegarder

Donc pour faire la gestion dans le classeur source, c'est bien ca alors?

Code:
#If VBA7 Then
    Private Declare PtrSafe Function SetTimer Lib "user32.dll" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As Long
    Private Declare PtrSafe Function KillTimer Lib "user32.dll" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long) As Long
#Else
    Private Declare Function SetTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As Long
    Private Declare Function KillTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
#End If
Dim TimerID&

Private Sub TestSave()
For I = 1 To 50
    ThisWorkbook.Save
Next I
End Sub

Sub clickOFF()
 CreateObject("wscript.shell").SendKeys "{ENTER}"
   If TimerID <> 0 Then KillTimer 0, TimerID: TimerID = 0:
End Sub


Désolé, mais je comprend pas grand chose à ce code, pour pas dire rien du tout :)
 

patricktoulon

XLDnaute Barbatruc
non c'est pas ça
c'est un peu le serpent qui se mort la queue là 🤣
la fonction timer n'a rien a voir avec le classeur source

au pire tu fait une gestion d'erreur dans la macro de mise a jour et save du classeur source c'est tout
ainsi si le save tombe au moment ou toi avec pc2 et classeur destination copiez les données la fonction save passe son tour c'est tout

la fonction timer sert seulement a lancer clickoff pour faire disparaître la fenêtre
 

David590

XLDnaute Occasionnel
non c'est pas ça
c'est un peu le serpent qui se mort la queue là 🤣
la fonction timer n'a rien a voir avec le classeur source

au pire tu fait une gestion d'erreur dans la macro de mise a jour et save du classeur source c'est tout
ainsi si le save tombe au moment ou toi avec pc2 et classeur destination copiez les données la fonction save passe son tour c'est tout
Tu veux dire une gestion d'erreur avec Error GoTo ?
Car j'ai essayé et ca n'empêche pas d'afficher cette fenêtre
 

patricktoulon

XLDnaute Barbatruc
re

pour ta macro save dans source

If ActiveWorkbook.ReadOnly Then
'rien
Else
thisworkbook.save
End If

tu devrais plus avoir de problème
après tu es bien gentil mais travailler en aveugle c'est compliqué
n'ayant pas les deux fichiers je ne peux que supputer des théories
 

David590

XLDnaute Occasionnel
J'ai essayé mais ca me fait la même chose
En fait ca revient à demander si le classeur ouvert est en lecture seule alors qu'on sait qu'il est déjà ouvert en lecture/écriture

Je sais que c'est vraiment pas facile sans pouvoir échanger des fichiers exemples quand c'est avec plusieurs classeurs en réseau, je te remercie quand même de m'avoir bien aidé
 

Discussions similaires

Statistiques des forums

Discussions
315 087
Messages
2 116 084
Membres
112 655
dernier inscrit
fannycordi