Routine d'erreur
- Messages
- 79
- Excel
- 365
- Inscrit
- 06/08/2013
- Emploi
- Expert Qualité Retraite CARSAT SUD EST
Bonjour à tous,
J'ai besoin d'aide pour poser une routine d'erreur sur mon code.
J'ai un fichier en lecture seule utilisé simultanément par plusieurs personnes.
Lorsque ces personnes cliquent sur un bouton elles transfèrent des données vers un autres fichier = doc(1).
Mon problème est que lorsque le doc1 est déjà "ouvert" par un autre utilisateur (le temps que celui-ci transfère ses données) cela génère une erreur.
Je voudrais pouvoir recommencer la demande d'ouverture du doc1 tant qu'il ne s'ouvre pas en lecture-écriture
Auriez-vous une proposition ?
Merci d'avance pour votre aide
Bon week-end
Mag
Sub transferer()
'masque l'execution des macros
Application.ScreenUpdating = False
'ouvre le fichier
Workbooks.Open Filename:="N:\Serveur1\GESTION SUIVI CAF.xlsx"
'récupère le nom dans une variable
doc1 = ActiveWorkbook.Name
Windows("RECEVABILITE_AUTO DP.xlsm").Activate
'récupère le nom dans une variable
doc2 = ActiveWorkbook.Name
Windows(doc2).Activate
Sheets("nir caf").Visible = True
Sheets("nir caf").Select
' copie les données
Columns("A:n").Select
Selection.Copy
Windows(doc1).Activate
Columns("A:n").Select
ActiveSheet.Paste
Range("a1").Select
' vide le presse papier
Call presse
'enregistre et ferme le doc1 après copie
Windows(doc1).Activate
ActiveWorkbook.Save
ActiveWorkbook.Close
End Sub
bonjour
entre fichiers Excel, je déconseille le "transfert" ou disons la copie en dur des données
principe conseillé : chaque personne dispose d'un fichier qui va lire le fichier source, sans l'ouvrir. Pour cela tu mets un onglet MIR dans chaque fichier personnel. Dans cet onglet tu mets des liaisons (copier/collage spécial avec liaisons) vers le fichier de données. MIR est donc en permanence une vision des données.
nota : étends la zone de liaisons assez loin pour prévoir que les données vont s'allonger avec le temps.
Pas de VBA, pas de formule. Rien
- Messages
- 79
- Excel
- 365
- Inscrit
- 06/08/2013
- Emploi
- Expert Qualité Retraite CARSAT SUD EST
Bonsoir,
Le souci de cette solution est que j'ai trop d’utilisateurs.
le principe est de les faire travailler sur le même fichier en lecture seule, comme ça je n'ai qu'une seule maquette à modifier.
Actuellement je modifie ma maquette et j'ai un petit code qui me permet de "diffuser" la maquette en remplaçant le fichier utilisateurs par la nouvelle version.
Si je suis ton principe et que j'ai un fichier par utilisateur, je vais devoir intervenir sur + de 20 fichiers chaque fois que je fais une modification et j'en fais souvent....
par contre je la retiens pour un autre cas qu'un j'ai en gestion, avec 1 seul service car le principe est top !
merci pour ta réponse et ton temps.
re
je pense que nous ne nous sommes pas compris
un fichier de données en lecture seule. Unique. Non diffusé mais accessible par réseau.
un fichier d'exploitation contenant un MIR des données. Ce fichier tu le modifies comme tu veux et tu l'envoies à 1 ou 1000 personnes. Tout le monde l'a sur son PC mais c'est le même pour tous !
Bonsoir,
Quelque chose m'échappe dans ta méthode, que je trouves par ailleurs un peu curieuse... Si je lis bien, les utilisateurs utilisent un classeur [ doc2 = "RECEVABILITE_AUTO DP.xlsm" ], pour mettre à jour par copie de données un autre même classeur [ doc1 = "N:\Serveur1\GESTION SUIVI CAF.xlsx" ].
Les données tranférées sont les colonnes A à N de la feuille "nir caf" de doc2. Tu ne précises pas si l'utilisateur introduit des données (non conservées puisque en lecture seule) en vue du transfert, mais si c'est le cas il faudrait que ces données parviennent à la feuille précitée, masquée lors du déroulement de la procédure... Aucune feuille n'étant précisée pour doc1, il faut penser que ce dernier n'en a qu'une (ou du moins une seule visible qui ne peut être que la seule feuille active à l'ouverture du classeur).
Donc tous les utilisateurs copient la même feuille du même classeur, dont rien n'est dit sur la façon dont elle est elle-même alimentée sur la même feuille d'un même autre classeur !
Tu ne nous dit certainement pas tout mais j'ai un peu de mal à trouver de la rationalité dans ce processus...
Heureux que ta macro soit courte, car vue comment elle est écrite, plus longue j'aurais renoncé à la lire. Elle demande à être énergiquement épurée, ce qui réduira le code d'un peu plus de moitié : suppression de tous les Select, Selection et Activate, et qualification des expressions correspondantes, suppression des variables inutiles, qui ne sont d'ailleurs même pas déclarées, cadrage de la zone à transférer, et dans la foulée, abandonner le copier-coller et éviter de démasquer la feuille...
Il devrait par ailleurs suffire de tester si doc1 est ouvert en lecture pour ne pas procéder à l'opération dans ce cas...
Cordialement.
edit : Je ne raffole pas des liaisons entre fichiers (travailler sur un fichier comportant des liaisons m'horripile particulièrement), mais au cas particulier d'un fichier dédié à la consultation, la proposition de jmd me paraît infiniment plus rationnelle que la situation actuelle...
- Messages
- 79
- Excel
- 365
- Inscrit
- 06/08/2013
- Emploi
- Expert Qualité Retraite CARSAT SUD EST
bonjour à tous
jmd là on s'est compris !
merci c'est + clair pour moi
Mferrand
j'ai déclaré mes variables et allégé le code
et j'ai testé si doc1 est ouvert .......
cela fonctionne parfaitement !
pour répondre à ta question les utilisateurs introduisent des données via l'utilisation d'un usf (qui génère l'envoi d'un courrier) et je récupère une partie de ces données pour constituer un listing "traitement ok" que je croise ensuite avec le listing "traitement à faire".
cela n'est qu'un ajout temporaire sur un fichier existant et en utilisation depuis 2015.
Il me reste maintenant à modifier le code pour que chaque ajout s'inscrive à la suite des données existantes du doc1 sans écraser les données existantes déjà collectées.
je vais étudier les 2 solutions
merci pour votre temps à tous les 2 et pour vos conseils
Mag
Private Sub INITIAL_Click()
' teste si le fichier est ouvert
Dim wb As Workbook
Dim lWorkbook As Workbook
Dim lFound As Boolean
lFound = False
For Each lWorkbook In Workbooks
If lWorkbook.FullName = "N:\Serveur1\GESTION SUIVI CAF.xlsx" Then
lFound = True
Exit For
End If
Next
If lFound Then
Application.Wait (Now + TimeValue("0:00:01"))
MsgBox "fichier en cours d'utilisation, veuillez recommencer"
Exit Sub
Else
'........ ma procédure
call transférer '(le bout de code allégé avec les variables déclarées à finir de construire pour récupérer les données à la suite des données existantes)
'.........
End if
End sub
Bonjour,
Il me reste maintenant à modifier le code pour que chaque ajout s'inscrive à la suite des données existantes du doc1 sans écraser les données existantes déjà collectées.
ok ! l'utilisateur saisit en utilisant un Userform, les données vont dans la feuille "nir caf" (masquée). Pas de problème à ce stade, mais il faut savoir où elles sont, comment elles sont disposées, si la zone d'extension est variable, on peut la délimiter...
Par contre sur la cible, il faut savoir où les poser ! Soit à la suite (on cherche un emplacement non occupé !), soit dans un emplacement prédéfini pour chaque utilisateur (ce qui identifie du même coup l'origine, le cas échéant...)
Sans vouloir entrer dans les secrets des éléments que tu manipules, une vue claire des emplacements origine et destination des données est nécessaire et permettrait de réécrire correctement ta procédure...
Pour ce qui est de tester si le transfert est possible il me semble que tu testes si le classeur est ouvert (pour différer s'il l'est !). Ton propos initial indiquait que si le classeur était déjà ouvert ailleurs il s'ouvrait en lecture seule. Auquel cas le test devrait porter sur le fait de savoir s'il est en lecture seule ou non (propriété ReadOnly de Workbook). A la suite on peut soit demander à l'utilisateur de recommencer, soit une boucle qui recommence automatiquement jusqu'à ce que le classeur soit en lecture-écriture...
Cordialement.
- Messages
- 79
- Excel
- 365
- Inscrit
- 06/08/2013
- Emploi
- Expert Qualité Retraite CARSAT SUD EST
Re-bonjour,
Si tu acceptes les MP et que tu veux avoir une vue d'ensemble, fais-le moi savoir (question de respect je n'envoie pas de MP sans accord préalable), je peux t'envoyer les 2 fichiers (doc1 et doc2) pour que ce soit plus clair pour toi (données service public je ne peux diffuser sur le forum et faire une version démo me prendrais trop de temps...)
la plupart des liens tournent sur réseau donc tu auras des bugs car il ne trouvera pas le fichier mais tu comprendras où veut aller le code.
STP de l'indulgence pour la débutante que je suis
pour ce qui est du transfert de données, j'ai avancé sur le code et oui, j'ai opté pour demander à l'utilisateur de recommencer (recliquer) car je ne suis pas à l'aise avec les boucles.
merci pour investissement
voici le code transférer (il est pas terrible mais il fonctionne) :
je suis preneuse de tous renseignements ou exemples me permettant de travailler + "propre" et - "lourd"
Sub transferer()
Dim doc1, doc2
'masque l'execution des macros
Application.ScreenUpdating = False
'ouvre le fichier
' mettre chemin réseau (\\srvficret\.....) lors de l'installation au taf
Workbooks.Open Filename:="C:\Users\MAGALI\Desktop\GESTION SUIVI CAF.xlsm" ', ReadOnly:=True
'récupère le nom dans une variable
doc1 = ActiveWorkbook.Name
Windows("RECEVABILITE_AUTO DP.xlsm").Activate
'récupère le nom dans une variable
doc2 = ActiveWorkbook.Name
Windows(doc2).Activate
Sheets("nir caf").Visible = True
Sheets("nir caf").Select
Dim L As Long
Range("A2:n2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Windows(doc1).Activate
L = Sheets(1).Range("A356666").End(xlUp).Row ' récupération d'un nb qui représente la dernière ligne utilisée dans la colonne A
Sheets(1).Range("a" & L + 1).Select
ActiveSheet.Paste
Application.CutCopyMode = False ' enleve la surbrillance autour de la zone à copier
'optionnel :
Sheets(1).Range("a" & L + 1).Select 'se positionne au début de la zone copiée
'vide le presse papier
Call presse
Application.Run "doublons"
Windows(doc1).Activate
ActiveWorkbook.Save
ActiveWorkbook.Close
End Sub
Je ne serai pas en mesure de tester selon ta configuration de travail... mais ce qu'il importe de savoir c'est la structure de tes deux fichiers et le type de données pour ajuster cette partie du code... Si tu veux les faire passer par MP pas de problème de mon côté, je ne m'intéresse aux données en tant que telles ! mais à leur type et particularités éventuelles qui peuvent avoir une incidence selon la façon dont on procède.
Il n'y a pas de difficulté pour écrire le reste de ton code, sous réserve que toi seule pourra tester et que la mise au point finale t'incombera de ce fait.
Cordialement.
- Messages
- 79
- Excel
- 365
- Inscrit
- 06/08/2013
- Emploi
- Expert Qualité Retraite CARSAT SUD EST
Y a pas de soucis pour la mise au point finale.
Du moment ou j'arrive à comprendre le code avec le pas à pas détaillé (F8 est mon ami), en général j'arrive à adapter ou à modifier.
C'est de cette façon que j'ai appris (le peu que je sais faire) en programmation.
Je t'envoie les 2 fichiers en MP.
Merci pour ta disponibilité.
Mag
F8 pour détecter un "décrochage" ou le point sur lequel une erreur se produit, OK ! Pour interpréter ou comprendre le déroulement du code cela risque d'être fastidieux... L'Aide reste encore la meilleure doc de départ, elle est toujours sous la main, et permet de suivre les enchaînements, même si un certain nombre de rubriques y sont très insuffisamment documentées...
J'ai récupéré tes fichiers, ce sera pour demain... Trop tard chez moi pour me lancer dans l'analyse de l'ensemble...
Cordialement.