Routine d'erreur

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

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

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.

Je me demandais comment cela pouvait fonctionner... mais si tu dis que cette question là n'est pas résolue !!

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.

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.

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.

Rechercher des sujets similaires à "routine erreur"