Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Ouvrir une feuille existante ou la crééer

eric57

XLDnaute Occasionnel
Bonjour le Forum

Malgres plusieurs recherches et tentatives d'adaptation de macros, je n'ai pas réussi a obtenir le résultat escompté.

Ma macro doit copier une liste dans une autre feuille Excel sur un autre classeur.

Il faut donc que si ce classeur n'est pas encore ouvert, ouvrir le classeur
Si le classeur est déjà ouvert, l'afficher.

Si la feuille existe ( Le nom de la feuille est donnée dans une inbox ) Je vais sur la feuille sinon je la créée

j'ai réussi pour ouvrir et créer la feuille, mais je n'arrive pas a faire la partie ou le classeur serait déjà ouvert ou le feuille existante.

Je vous met 2 fichiers, Classeur Travail et classeur Réponse afin de vous permettre de mieux visualiser.

Le premier étant celui ou j'ai la macro et la liste initiale, et le second un ex de classeurs qu'on utilises pour recevoir la liste.

Si vous pouviez m'aider à me dépatouiller, ce serait sympa.

J'ai essayé d'annoter au max ma macro pour expliquer ce que je veux
 

Pièces jointes

  • Classeur_Travaille.xlsm
    23.9 KB · Affichages: 55
  • Classeur_Réponse.xlsx
    9.1 KB · Affichages: 25

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour
pas trop le tps de traiter mais comme je vois un peu ton soucis essaye de voir avec ça :
Code:
Application.ScreenUpdating = False
chemin = "C:\DATA\Exceldata\katia_projets\fichier_source.xls"
If Fic_ouvert(chemin) = True Then
Fic_O = MsgBox("Le fichier : " & "fichier_source.xls" & Chr(13) & " est ouvert ; Il va Etre Fermé " _
& "Par le Pg sans SAUVEGARDE", vbYesNo)
    If Fic_O = vbNo Then
    MsgBox " Arrêt du Traitement "
    Exit Sub
    End If
et la fonction qui va avec :
Code:
Function Fic_ouvert(Nom_fic As String)

Dim filenum As Integer, errnum As Integer

  On Error Resume Next
  filenum = FreeFile()
  Open Nom_fic For Input Lock Read As #filenum
  Close filenum
  errnum = Err
  On Error GoTo 0

  ' Traitement suivant erreur OUVERT OU PAS
  Select Case errnum
          
  '  Fichier Fermé
    Case 0
      Fic_ouvert = False

     '  Fichier dejà OUVERT
    Case 70
     Fic_ouvert = True

    ' Autre erreur
    Case Else
      Error errnum
  End Select

End Function
Ce que je me rappelle ( il y a 5 ans) , je devais extraire des données de x employés avec chacun leur fichier
et résumer leur données dans mon fichier > l'inverse c'est idem .... tu as des données et tu écris dans leur fichier , donc je traitais au début comme ça :
Code:
For x = 1 To Nbfic

    Workbooks.Open(Filename:=chemin & "\" & Nom_proj(x)) _
        .RunAutoMacros Which:=xlAutoOpen ...... etc !!
 

CHALET53

XLDnaute Barbatruc
Bonjour Eric, Hervé

j'avais fait aussi quelque chose:
Le programme "Ouvre_fic" dans le fichier Eric57 contrôle l'ouverture du fichier "GLOBAL.xls". S'il n'est pas ouvert, lance le programme "Ouvre", ouvre le fichier et l'active
Ensuite, contrôle de l'existence de la feuille "Feuil2". Si elle n'est pas ouverte, le programme création_fiche l'ouvre. Si elle n'existe pas, création de la feuille et activation
Pour le test : mettre les deux fichiers dans un répertoire. Ouvrir seulement le fichier Eric57 et exécuter pas à pas le programme "Ouvre_fic
Modifier les chemins dans les programmes
Ensuite adapter dans ton environnement

a+
 

Pièces jointes

  • Eric57.xls
    52.5 KB · Affichages: 41
  • GLOBAL.xls
    56.5 KB · Affichages: 36

eric57

XLDnaute Occasionnel
Bonjour Chalet et Hervé

Merci pour votre aide,
mais je n'ai pas réussi a intégrer vos macros avec la mienne.

Chalet, j'ai ( à peu près ) compris le principe des différentes macros appelés, mais tu part sur un fichier "GLOBAL.xls" donc le nom du fichier est tjr le même.
Dans mon cas, ce nom n'est connu qu'au moment ou je le sélectionne dans ma fenêtre le classeur destinataire

Code:
 If U = "NF" Then
        Application.Dialogs(xlDialogOpen).Show (cheminNF)
       
        Else
        Application.Dialogs(xlDialogOpen).Show (cheminEN)
If U = "NF" Then
Application.Dialogs(xlDialogOpen).Show (cheminNF)

Else
Application.Dialogs(xlDialogOpen).Show (cheminEN)

Comment rentrer cette variable dans ta macros ?

Hervé, dans ton cas c'est pareil, "chemin" est une source défini, a l'avance, c'est là que je plante
 

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour
Jour férié mais comme je viens de terminer un sujet , j'ai eu ton message . J'ai repris l'appli avec le code que j'avais laissé et te donne une autre piste car le principe "inter-classeur" était le même
Là je pense que ce ne devrait pas être trop dur à adapter :
Code:
Application.ScreenUpdating = False  ' Permet de ne pas voir les differentes feuilles qui s'ouvrent
deb:
chemin = InputBox("Indiquer le chemin complet du Repertoire" _
& Chr(13) & Chr(13) & "Exemple C:\Serveur1\Data\Projets" & Chr(13) & _
"Les Majuscules ou Minuscules n'ont pas d'importance")
'chemin = "C:\DATA\Exceldata\PROJETS"  ' MODIFIER ICI LE CHEMIN OU SE TROUVENT LES FICHIERS
'---------------------------------------------------------
' On va traiter si le chemin est CORRECT , sinon on pourra recommencer OU
' Quitter la Sub

direction = Dir(chemin & "\*.xls")
If direction = "" Then
mes = MsgBox(" Le chemin entré est erroné ou ne comporte pas" & Chr(13) & _
" de fichiers Excel", vbOKCancel)
If mes = vbCancel Then alors = MsgBox(" voulez vous quitter l'application ?", vbYesNo)
If alors = vbYes Then
Exit Sub
Else
GoTo deb
End If
End If
' Fin du traitement de Verification du Chemin
Bon là c'est l'utilisateur qui va alimenter à la paluche ta variable, c'est Basic ! mais au moins c'est du sûr
 

CHALET53

XLDnaute Barbatruc
tu peux peut-être aussi ouvrir le fichier ainsi et récupérer le nom du fichier depuis la variable Filename
(ce n'est pas de moi)

Sub essai1()
Dim FileName As String
FileName = Application.GetOpenFilename("Classeurs Excel(*.xls*),*.xls*, Macros complémentaires (*.xla),*.xla")
MsgBox "Vous avez-sélectionné : " & FileName, vbInformation, "Illustration - GetOpenFilename"
End Sub
 

eric57

XLDnaute Occasionnel
Merci pour vos réponses.

En cherchant un peu et faisant pas mal d'essais,
J'ai reussi a travailler avec les macros et fonctions de Chalet53 que j'ai intégré dans ma macro

Tout se passe bien sauf, dans la cas ou le classeur est déjà ouvert, je bloque sur la ligne "ActiveSheet. Paste"
J'ai l'impression qu'il perdu le contenu u presse papier en cours de route
 
Dernière édition:

herve62

XLDnaute Barbatruc
Supporter XLD
je ne connais pas bien ton appli , mais j'ai jeté un oeil et tenter d'intégrer mon code ( lui je connais)
remet tes CHEMINS à la place des miens et teste moi CA MArche , mais n'en sait pas plus après
sitôt que tu as select. un fichier il te dit si ouvert > il ferme, sinon ..... continue avec ta sauce !!!! là je sais plus ce que tu veux faire
 

Pièces jointes

  • Classeur_Travaille.xlsm
    26.1 KB · Affichages: 48

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour
En regardant un peu + , j'ai tenté de deviner car on voit que du fait un COPY de plage au début .... mais pas de PASTE ensuite ?
Ou alors j'ai mal vu ?
Là on copie ta plage D6:F10 et on la colle dans l'autre classeur dans la feuille choisie
Espérant que jusque là c'est ce que tu voulais
 

Pièces jointes

  • Classeur_Travaille.xlsm
    26.8 KB · Affichages: 35

eric57

XLDnaute Occasionnel
Bonsoir Hervé

Merci pour ton implication.
Tu as d'autant plus de mérite que je viens de me rendre compte que le fichier "classeur_travail" que j'ai mis au départ n' était pas la version finale correcte.
Je pense que j'ai loupé un enregistrement

Je regarde ton boulot et je te dit ce qu'il en est
 

eric57

XLDnaute Occasionnel
Merci Hervé, je te confirme que Presque tout fonctionne

Je suis parti de ton travail, et j'ai intégré une partie du code de Chalet53 ( pour les ou la feuille existe déjà )

Les différents cas de figures testés :

Absence d'initiales sur la page de départ = OK
Ouverture d'un fichier + ajout nouvelle feuille ( inexistante au départ ds le classeur ) puis collage des données = OK
Ouverture d'un fichier + activation de la feuille (car déjà existante dans le classeur ) puis collage des données = OK
Ouverture d'un fichier déjà ouvert => Bloque sur la partie "ActiveSheet.Paste "

=> Ton message : MsgBox "Le fichier " & Direction & " est ouvert" & "Il va Etre Fermé" n'apparait pas
=> C'est un message d'Excel qui dit que le classeur est déjà ouvert et que si je clique sur "Oui" toutes les données non enregistrées vont être perdues

je te remet le classeur avec les dernières modifications ( la macro est en module 1 maintenant)

Voila, donc si tu avais une petite idée pour ce dernier soucis, je suis preneur
 

Pièces jointes

  • Classeur_Travaille-1.xlsm
    30.5 KB · Affichages: 46

herve62

XLDnaute Barbatruc
Supporter XLD
Bonsoir , SLt Eric
Dans ta reprise
Ouverture d'un fichier déjà ouvert => Bloque sur la partie "ActiveSheet.Paste "

=> Ton message : MsgBox "Le fichier " & Direction & " est ouvert" & "Il va Etre Fermé" n'apparait pas
Reprends le dernier code de la IF .. THEN il y a entre EN et NF pas la même suite
il faut remettre l'instruction "dialogOpen" au bon endroit
de toute façon , j'y vois plus clair et mon traitement de Fic_ouvert , j'en doute? car je traite juste après le clic "Ouvrir' donc Sûr que c'est toujours ouvert !!!!!!!!!!
là .... je patauge un peu à cause du déplacement du code en module ... cela perturbe car il faut à chaque fois ou au début de traitement mentionner le nom de FEUILLE !!!!
en PLUS il faudrait tenter de rajouter au moment de RESULTAT le workbook .Comme ça on est SUR sur quoi on travaille :
Code:
Workbooks(nom_fic).Sheets.Add.Name = Resultat
  'Sheet(Resultat).Range("C2").Select
ActiveSheet.Paste Destination:=Worksheets(Resultat).Range("F6:D10") ' Et là on Colle
A mon avis tu devrais aussi ajouter dans la suite le bloc :
With Workbooks( Resultat)
Ton code de copie avec les "range" en ".range " ( moi je préfère les .Cells (x,y) + facile pour jongler avec)
ENd With
A suivre!!
 

Discussions similaires

Réponses
2
Affichages
342
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…