Se connecter avec
S'enregistrer | Connectez-vous

Ouvrir et fermer un fichier

Dernière réponse : dans Programmation

Bonjour à tous,

je cherche à récupérer les informations de plusieurs fichiers et à créer un historique générale.
J'ai écri un code qui marche très bien mais il faut pour cela que le ou les fichiers à copier soient ouvert.

  1. Sub historique()
  2.  
  3.  
  4. Dim i As Long, a As Long
  5. Dim n As Long
  6.  
  7.  
  8. a = Worksheets("Historique Abattage").Range("A65536").End(xlUp).Row + 1
  9. n = Workbooks("Plan com Abattage").Worksheets("Historique des pannes").Range("A65536").End(xlUp).Row
  10.  
  11. For i = 5 To n
  12. If Workbooks("Plan com Abattage").Worksheets("Historique des pannes").Cells(i, 11).Value = 1 Then
  13. Worksheets("Historique Abattage").Cells(a, 1).Value = Workbooks("Plan com Abattage").Worksheets("Historique des pannes").Cells(i, 1).Value
  14. Worksheets("Historique Abattage").Cells(a, 2).Interior.ColorIndex = Workbooks("Plan com Abattage").Worksheets("Historique des pannes").Cells(i, 2).Interior.ColorIndex
  15. Worksheets("Historique Abattage").Cells(a, 3).Value = Workbooks("Plan com Abattage").Worksheets("Historique des pannes").Cells(i, 3).Value
  16. Worksheets("Historique Abattage").Cells(a, 4).Value = Workbooks("Plan com Abattage").Worksheets("Historique des pannes").Cells(i, 4).Value
  17. Worksheets("Historique Abattage").Cells(a, 5).Value = Workbooks("Plan com Abattage").Worksheets("Historique des pannes").Cells(i, 5).Value
  18. Worksheets("Historique Abattage").Cells(a, 6).Value = Workbooks("Plan com Abattage").Worksheets("Historique des pannes").Cells(i, 6).Value
  19. Worksheets("Historique Abattage").Cells(a, 7).Value = Workbooks("Plan com Abattage").Worksheets("Historique des pannes").Cells(i, 7).Value
  20. Workbooks("Plan com Abattage").Worksheets("Historique des pannes").Cells(i, 11).Value = 0
  21. a = a + 1
  22. End If
  23.  
  24. Next
  25.  
  26. End Sub


Je sais que je peux nommer quelques trucs pour que ce soit moins long mais bon. la c pas l'objet de ma demande.


J'ai donc essayer le code suivant pour ouvrir puis fermer le fichier à copier

  1. Sub historiqueabattage()
  2.  
  3. Dim wb As Workbook
  4. Dim ws As Worksheet
  5.  
  6. Dim i As Long, n As Long
  7. Dim a As Long
  8.  
  9. Set wb = Workbooks.Open("C:\Documents and Settings\STAGE\Bureau\Plan com U4\Plan com Abattage.xls")
  10. Set ws = wb.Worksheets("Historique des pannes")
  11.  
  12. a = ActiveSheet.Range("A65536").End(xlUp).Row + 1
  13. n = wb.ws.Range("A65536").End(xlUp).Row
  14.  
  15. For i = 5 To n
  16. If wb.ws.Cells(i, 11).Value = 1 Then
  17. ActiveSheet.Cells(a, 1).Value = wb.ws.Cells(i, 1).Value
  18. ActiveSheet.Cells(a, 2).Interior.ColorIndex = wb.ws.Cells(i, 2).Interior.ColorIndex
  19. ActiveSheet.Cells(a, 3).Value = wb.ws.Cells(i, 3).Value
  20. ActiveSheet.Cells(a, 4).Value = wb.ws.Cells(i, 4).Value
  21. ActiveSheet.Cells(a, 5).Value = wb.ws.Cells(i, 5).Value
  22. ActiveSheet.Cells(a, 6).Value = wb.ws.Cells(i, 6).Value
  23. ActiveSheet.Cells(a, 7).Value = wb.ws.Cells(i, 7).Value
  24. wb.ws.Cells(i, 11).Value = 0
  25. a = a + 1
  26. End If
  27.  
  28. Next
  29.  
  30. wb.Close SaveChanges:=True
  31.  
  32. End Sub


Et la j'ai un probleme. Propriété ou méthode non géré par cet objet. Je pense que ca vient du fait qu'il ne reconnait pas les ligne (a,i,n) mais je ne vois pas quoi faire.

Merci de votre aide

Julien

Autres pages sur : ouvrir fermer fichier

Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

salut,

Ohla ! pas d'activesheet quand on ouvre et on ferme des classeurs et des feuilles, c'est le meilleur moyen de s'embrouiller. Définis donc une variable pour la seconde feuille.

Ligne 9, tu définis un classeur. C'est bien.
Ligne 10, tu définis une feuille de ce classeur. C'est bien.
(Ligne 12, tu utilises la feuille active, c'est mal.)
Ligne 13, tu utilises la feuille de ce classeur de ce classeur. C'est bizarre, non ?

Inutile (et c'est une erreur) de préciser la classeur pour une feuille déjà renseignée.

Pour preuve, copie ce code à la ligne 11 :
  1. MsgBox "Je suis la feuille " & ws.Name & " et mon classeur est " & ws.Workbook.Name

Bonjour Zeb

finalement le pb n'était pas difficile à résoudre mais je ne voyais pas d'ou ca venait. merci de ton aide.

pour info voici le code qui fonctionne

  1. Sub historique()
  2.  
  3.  
  4. Dim wb, wb2 As Workbook
  5. Dim ws, ws2 As Worksheet
  6. Dim i As Long, a As Long
  7. Dim n As Long
  8.  
  9. Set wb = Workbooks.Open("C:\Documents and Settings\STAGE\Bureau\Plan com U4\Plan com Abattage.xls")
  10. Set ws = wb.Worksheets("Historique des pannes")
  11.  
  12. Set wb2 = Workbooks("Historique générale des pannes U4")
  13. Set ws2 = wb2.Worksheets("Historique Abattage")
  14.  
  15. a = ws2.Range("A65536").End(xlUp).Row + 1
  16. n = ws.Range("A65536").End(xlUp).Row
  17.  
  18. For i = 5 To n
  19. If ws.Cells(i, 11).Value = 1 Then
  20. ws2.Cells(a, 1).Value = ws.Cells(i, 1).Value
  21. ws2.Cells(a, 2).Interior.ColorIndex = ws.Cells(i, 2).Interior.ColorIndex
  22. ws2.Cells(a, 3).Value = ws.Cells(i, 3).Value
  23. ws2.Cells(a, 4).Value = ws.Cells(i, 4).Value
  24. ws2.Cells(a, 5).Value = ws.Cells(i, 5).Value
  25. ws2.Cells(a, 6).Value = ws.Cells(i, 6).Value
  26. ws2.Cells(a, 7).Value = ws.Cells(i, 7).Value
  27. ws.Cells(i, 11).Value = 0
  28. a = a + 1
  29. End If
  30.  
  31. Next
  32.  
  33. wb.Close SaveChanges:=True
  34.  
  35. End Sub

Petite question pour apporter une dernière amélioration à mon projet:

mon but est de venir chercher les infos dans 3 autres fichiers pour avoir une sauvegarde générale. ce sont d'autre personnes qui saississent les infos.
comment puis-je savoir si le fichier est déjà ouvert au moment de l'acivation de la macro et si c'est le cas comment afficher un message le signalant puis stoper la macro.

Je sais que tu donnes pas les réponses comme ca donc si tu peux me mettre sur la voie. J'appliquerai à ma macro ensuite

Par avance merci

Julien
Expert Programmation

Salut Julien,

Je donne les solutions pourvu qu'on fasse montre d'un peu de recherche personnelle. ;) 

Je n'ai pas trop d'idée pour ton soucis, et je n'ai pas Excel sous la main pour te proposer une solution ou des pistes. Rappelle-moi à ton bon souvenir Lundi prochain, je serai de nouveau opé'. ;) 

Mon code est le suivant
  1. Sub historiquetranchage()
  2.  
  3.  
  4. Dim wb, wb2 As Workbook
  5. Dim ws, ws2 As Worksheet
  6. Dim i As Long, a As Long
  7. Dim n As Long
  8.  
  9. Set wb = Workbooks.Open("C:\Documents and Settings\STAGE\Bureau\Plan com U4\Plan com salle HR.xls")
  10. Set ws = wb.Worksheets("Historique (détail)")
  11.  
  12. Set wb2 = Workbooks("Historique générale des pannes U4")
  13. Set ws2 = wb2.Worksheets("Historique Salle Haut risque")
  14.  
  15. a = ws2.Range("A65536").End(xlUp).Row + 1
  16. n = ws.Range("A65536").End(xlUp).Row
  17.  
  18. For i = 5 To n
  19. If ws.Cells(i, 11).Value = 1 And ws.Cells(i, 12) = 1 Then
  20. ws2.Cells(a, 1).Value = ws.Cells(i, 1).Value
  21. ws2.Cells(a, 2).Interior.ColorIndex = ws.Cells(i, 2).Interior.ColorIndex
  22. ws2.Cells(a, 3).Value = ws.Cells(i, 3).Value
  23. ws2.Cells(a, 4).Value = ws.Cells(i, 4).Value
  24. ws2.Cells(a, 5).Value = ws.Cells(i, 5).Value
  25. ws2.Cells(a, 6).Value = ws.Cells(i, 6).Value
  26. ws2.Cells(a, 7).Value = ws.Cells(i, 7).Value
  27. ws.Cells(i, 11).Value = 0
  28. ws.Cells(i, 12).Value = 0
  29. a = a + 1
  30.  
  31. ElseIf ws.Cells(i, 11).Value = 1 And ws.Cells(i, 12) = 0 Then
  32. ws2.Cells(a, 1).Value = ws.Cells(i, 1).Value
  33. ws2.Cells(a, 2).Interior.ColorIndex = ws.Cells(i, 2).Interior.ColorIndex
  34. ws2.Cells(a, 3).Value = ws.Cells(i, 3).Value
  35. ws2.Cells(a, 4).Value = ws.Cells(i, 4).Value
  36. ws2.Cells(a, 5).Value = ws.Cells(i, 5).Value
  37. ws.Cells(i, 11).Value = 0
  38. a = a + 1
  39.  
  40. ElseIf ws.Cells(i, 11).Value = 0 And ws.Cells(i, 12) = 1 Then
  41. a = i
  42. ws2.Cells(a, 6).Value = ws.Cells(i, 6).Value
  43. ws2.Cells(a, 7).Value = ws.Cells(i, 7).Value
  44. ws.Cells(i, 12).Value = 0
  45. a = a + 1
  46. End If
  47.  
  48. Next
  49.  
  50. wb.Close SaveChanges:=True
  51.  
  52. End Sub


En ligne 9 je viens ouvrir le fichier dans lequel je viens récupérer les infos qui m'interesse.
Seulement il est possible que le fichier en question soit déjà ouvert par la personne chargée de le remplir. si c'est le cas je ne viens pas copier les infos qui m'interesse et surtout je le sais meme pas car rien ne me l'indique.

C'est pourquoi au moment ou j'ouvre mon fichier, s'il est déjà ouvert, je voudrai afficher un msgbox indiquant que le fichier est ouvert puis stopper la macro.

J'ai essayer avec on error mais rien ne se passe. Je ne vois pas comment faire
Expert Programmation

julien05 a dit :
Je sais que tu donnes pas les réponses comme ca donc si tu peux me mettre sur la voie. J'appliquerai à ma macro ensuite
zeb a dit :
Je donne les solutions pourvu qu'on fasse montre d'un peu de recherche personnelle. ;) 
julien05 a dit :
Si je pose la question c'est que les recherches n'ont rien donné de concluant. je ne pose des question que lorsque que je suis bloqué.
Mais c'est bon, je vais t'aider... J'ai bien vu que tu ne réclamais pas tout, tout de suite et tout cuit ;) 

Bon, j'ai de nouveau accès à une machine avec Windows+Excel. Je regarde....
Expert Programmation

J'ai une idée à te soumettre.
Avant, la ligne 9, tu vérifies si le classeur est déjà ouvert ou pas.
Si un des classeurs ouverts (Workbooks) a pour propriété Name le nom de fichier que tu veux ouvrir, c'est qu'il est déjà ouvert.

  1. Dim NomFichier As String
  2. Dim wb As Workbook
  3.  
  4. NomFichier = "Plan com salle HR.xls"
  5.  
  6. For Each wb In Workbooks
  7. If wb.Name = NomFichier Then
  8. MsgBox "Le fichier est déjà ouvert"
  9. Exit For
  10. End If
  11. Next


Pour plus de précision encore, tu peux regarder du côté de FullName au lieu de simplement Name.

J'ai essayé ta solution. ca fonctionne sur mon ordi mais dès que je passe sur le réseau et que j'essaie ca avec 2 orid ca ne marche plus.

J'ai essayé de rajouter l'adresse de la cible au nomsu fichier mais ca n'a aucun effet
Expert Programmation

Ah, ben il faudrait savoir comment tu partages ce fichier.
Si tu utilises un serveur Sharepoint, s'il est en multi-user/exclusif, etc.

Regarde les propriétés WriteReserved et WriteReservedBy.
Lassé par la pub ? Créez un compte