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 ?
 
Bonsoir David590, Patrick, le forum

David, essayes :
VB:
On Error GoTo Gere_Erreur
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
Gere_Erreur:
On Error GoTo 0
Bien cordialement, @+
 

patricktoulon

XLDnaute Barbatruc
re
bonsoir Yeahou
vous avez même pas besoins de l'ouvrir le fichier

tenez testez
adaptez le chemin ,le nom de la feuille
VB:
Sub LitClasseurFermé()
Dim Rsource As Range, Rdest As Range, Chemin$, Fichier$, Onglet$
Chemin = Environ("userprofile") & "\DeskTop" 'ThisWorkbook.Path 'chemin du fichier source
Fichier = "exemple source.xlsx"'nom du fichier source
Onglet = "Feuil1" 'feuille du fichier source
Set Rsource = [A1:z400]' plage du fichier source
Set Rdest = feuil1.[A1].Resize(Rsource.Rows.Count, Rsource.Columns.Count)'destination
LitChamp Rdest, Chemin, Fichier, Onglet, Rsource'lance l'execution
End Sub

Sub LitChamp(Rdest As Range, Chemin, Fichier, Onglet, Rsource As Range)
Rdest.FormulaArray = "='" & Chemin & "\[" & Fichier & "]" & Onglet & "'!" & CStr(Rsource.Address(0, 0)) 'formule matricielle de liaison
Rdest = Rdest.Value 'supression des formulesremplacement des formules par les valeurs
End Sub
hop!! c'est magic !! ;)
 

David590

XLDnaute Occasionnel
Merci à tous pour vos réponses

bonsoir
, ReadOnly:=True n'est pas suffisamment clair pour toi?
surtout que si quelq'un est en train de le modifier meme si tu pouvais l'ouvrir tes données ne seraient pas a jour
sert toi des formules de liaison ;)
Je viens d'essayer avec des liaisons en utilisant juste ActiveWorkbook.UpdateLink Name:=lelien, Type:=xlExcelLinks pour mettre à jours les liaisons, c'est mieux car c'est beaucoup plus rapide que de faire copy/paste mais j'ai quand même la fenêtre qui s'ouvre si le Classeur1 sauvegarde pendant la mise à jour des liaisons


Bonsoir David590, Patrick, le forum

David, essayes :
VB:
On Error GoTo Gere_Erreur
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
Gere_Erreur:
On Error GoTo 0
Bien cordialement, @+
Oui c'est bien ce que je veux faire mais le problème c'est qu'apparemment cette fenêtre n'est pas une erreur puisque je l'ai quand même avec Error GoTo Resume Next , je peux juste cliquer sur ok et ensuite j'ai la fenêtre d'erreur avec fin.. debogage... que je pourrai gérer avec Error GoTo
Le soucis c'est qu'il faut toujours que quelqu'un appuie sur ok, sinon la macro est en standby

En fait,
Sans Error GoTo :
J'ai la fenêtre en cours d'utilisation, réessayer.... j'appui sur Ok et là j'ai la fenêtre d'erreur, fin, debogage... et la macro est arrêté

AvecError GoTo :
J'ai la fenêtre en cours d'utilisation, réessayer.... j'appui sur Ok et la macro continue


re
bonsoir Yeahou
vous avez même pas besoins de l'ouvrir le fichier

tenez testez
adaptez le chemin ,le nom de la feuille
VB:
Sub LitClasseurFermé()
Dim Rsource As Range, Rdest As Range, Chemin$, Fichier$, Onglet$
Chemin = Environ("userprofile") & "\DeskTop" 'ThisWorkbook.Path 'chemin du fichier source
Fichier = "exemple source.xlsx"'nom du fichier source
Onglet = "Feuil1" 'feuille du fichier source
Set Rsource = [A1:z400]' plage du fichier source
Set Rdest = feuil1.[A1].Resize(Rsource.Rows.Count, Rsource.Columns.Count)'destination
LitChamp Rdest, Chemin, Fichier, Onglet, Rsource'lance l'execution
End Sub

Sub LitChamp(Rdest As Range, Chemin, Fichier, Onglet, Rsource As Range)
Rdest.FormulaArray = "='" & Chemin & "\[" & Fichier & "]" & Onglet & "'!" & CStr(Rsource.Address(0, 0)) 'formule matricielle de liaison
Rdest = Rdest.Value 'supression des formulesremplacement des formules par les valeurs
End Sub
hop!! c'est magic !! ;)

Je précise que le fichier Classeur1 reste toujours ouvert, je ne sais pas si ca change quelque chose
Je viens de tester, j'ai bien une plage de cellule qui se copie mais avec des #REF! partout
Je vois pas ce qui coince..
VB:
Sub LitClasseurFermé()
Dim Rsource As Range, Rdest As Range, Chemin$, Fichier$, Onglet$
Chemin = Environ("userprofile") & "\\PC1\Users\Public" 'ThisWorkbook.Path 'chemin du fichier source
Fichier = "Classeur1" 'nom du fichier source
Onglet = "Feuil1" 'feuille du fichier source
Set Rsource = [A1:P30] ' plage du fichier source
Set Rdest = Feuil1.[A1].Resize(Rsource.Rows.Count, Rsource.Columns.Count) 'destination
LitChamp Rdest, Chemin, Fichier, Onglet, Rsource 'lance l'execution
End Sub

Sub LitChamp(Rdest As Range, Chemin, Fichier, Onglet, Rsource As Range)
Rdest.FormulaArray = "='" & Chemin & "\[" & Fichier & "]" & Onglet & "'!" & CStr(Rsource.Address(0, 0)) 'formule matricielle de liaison
Rdest = Rdest.Value 'supression des formulesremplacement des formules par les valeurs
End Sub
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Chemin = Environ("userprofile") & "\\PC1\Users\Public" 'ThisWorkbook.Path 'chemin du fichier source
Fichier = "Classeur1.saucisse" 'nom du fichier source
Onglet = "Feuil1" 'feuille du fichier source

et quoi que environ userprofile te renvoie normalement c\users\nom du compte windows
donc
1°c'est tout ton chemin qui est faux
2° l'extension manquante dans le nom de classeur
3° respecte la case si tant est que la feuille soit bien nommée "Feuil1"
 

David590

XLDnaute Occasionnel
Effectivement, je n'avais pas mis l'extension, donc Classeur1.xlsm
Pour le Feuil1, je l'ai vu entre deux, j'avais édité
Par contre le chemin d'un fichier d'un pc distant c'est bien \\ non ? c'est toujours ce que j'utilise d'habitude !
 

David590

XLDnaute Occasionnel
J'avais pas compris qu'il fallait pas mettre Environ("userprofile") &
Ca fonctionne comme ca maintenant:

VB:
Sub LitClasseurFermé()
Dim Rsource As Range, Rdest As Range, Chemin$, Fichier$, Onglet$
Chemin = "\\PC1\Users\Public" 'ThisWorkbook.Path 'chemin du fichier source
Fichier = "Classeur1.xlsm" 'nom du fichier source
Onglet = "Feuil1" 'feuille du fichier source
Set Rsource = [A1:P30] ' plage du fichier source
Set Rdest = Feuil1.[A1].Resize(Rsource.Rows.Count, Rsource.Columns.Count) 'destination
LitChamp Rdest, Chemin, Fichier, Onglet, Rsource 'lance l'execution
End Sub

Sub LitChamp(Rdest As Range, Chemin, Fichier, Onglet, Rsource As Range)
Rdest.FormulaArray = "='" & Chemin & "\[" & Fichier & "]" & Onglet & "'!" & CStr(Rsource.Address(0, 0)) 'formule matricielle de liaison
Rdest = Rdest.Value 'supression des formulesremplacement des formules par les valeurs
End Sub

Alors ca fonctionne très très vite, beaucoup plus vite que d'ouvrir/copier/coller/fermer
Donc plus ca va vite, moins y'a de chance que le PC1 sauvegarde en même temps que le PC2 ouvre le fichier

Pour tester j'ai mis un Workbooks(Classeur1).Save dans une boucle sur le PC1 et ton code dans une boucle sur le PC2, et ca coince quand même

En pratique ca risque d'être quand même mieux puisque plus rapide mais ca n'est pas infaillible s'il arrive que je PC1 sauvegarde en même temps que le PC2 consulte

Ce qui aurait été bien c'est que l'on puisse éviter d'avoir cette fenêtre pour pouvoir ensuite gérer l'erreur simplement en lui demandant d'attendre 1seconde puis réessayer la sauvegarde

La fenêtre que j'aimerai éviter :
erreur1.jpg



Et celle qui vient ensuite, mais celle ci peut être évité avec Error GoTo
erreur2.jpg
 

patricktoulon

XLDnaute Barbatruc
re
essaie cela
comme cette fenêtre est bloquante donc vba est coincé si tu clique pas ,il faut cliquer en addressof
si tu a une 2d fenetre donne moi la capture (j'ajouterais les sendskeys qu'il faut )
VB:
#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&


Sub LitClasseurFermé()
Dim Rsource As Range, Rdest As Range, Chemin$, Fichier$, Onglet$
Chemin = "\\PC1\Users\Public" 'ThisWorkbook.Path 'chemin du fichier source
Fichier = 'nom du fichier source'Adapte le nom de ton fichier !!!!
Onglet = "Feuil1" 'feuille du fichier source
Set Rsource = [A1:A10] ' plage du fichier source
Set Rdest = Feuil1.[A1].Resize(Rsource.Rows.Count, Rsource.Columns.Count) 'destination
LitChamp Rdest, Chemin, Fichier, Onglet, Rsource 'lance l'execution
End Sub

Sub LitChamp(Rdest As Range, Chemin, Fichier, Onglet, Rsource As Range)
 TimerID = SetTimer(0, 0, 100, AddressOf clickOFF)
Rdest.FormulaArray = "='" & Chemin & "\[" & Fichier & "]" & Onglet & "'!" & CStr(Rsource.Address(0, 0)) 'formule matricielle de liaison
Rdest = Rdest.Value 'supression des formulesremplacement des formules par les valeurs
End Sub

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

David590

XLDnaute Occasionnel
Par contre, c'est le PC1 qui affiche la fenêtre problématique, celui ou le classeur est ouvert avec la macro qui tourne en boucle et qui sauvegarde

Du coup je dois mettre ton code autour du ThisWorkbook.Save, non ?
J'ai essayé comme ca mais j'ai toujours la fenêtre

VB:
#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
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 907
Membres
101 836
dernier inscrit
karmon