Se connecter avec
S'enregistrer | Connectez-vous

Créer un historique

Dernière réponse : dans Programmation

Bonjour,

à partir d'un tableau dans lequel je fais apparaitre du texte en cas de panne puis disparaitre quand le probleme est résolu, je souhaiterai créer un historique de ces pannes.

j'arrive à reporter le texte, à enlever les lignes vide mais je n'arrive pas à passer à la ligne suiante. mes données sont systématiquement écraser lorsque mon tableau de départ change.

Voici mon code :

  1. Sub historique()
  2.  
  3.  
  4. Dim i, a As Single
  5.  
  6. a = 5
  7. For i = 36 To 57
  8.  
  9.  
  10. If Sheets("Feuil1").Cells(i, 1).Value = 1 Then
  11.  
  12. com = Sheets("Feuil1").Cells(i, 26).Value
  13. datedeb = Sheets("Feuil1").Cells(i, 60).Value
  14. typep = Sheets("Feuil1").Cells(i, 66).Interior.ColorIndex
  15. machine = Sheets("feuil1").Cells(i, 7).Value
  16. ligne = Sheets("feuil1").Cells(i, 68).Value
  17.  
  18. Else: com = ""
  19. datedeb = ""
  20. typep = xlNone
  21. machine = ""
  22. ligne = ""
  23.  
  24. End If
  25.  
  26.  
  27. Sheets("Feuil2").Cells(a, 3).Value = com
  28. Sheets("Feuil2").Cells(a, 1).Value = datedeb
  29. Sheets("Feuil2").Cells(a, 2).Interior.ColorIndex = typep
  30. Sheets("Feuil2").Cells(a, 5).Value = machine
  31. Sheets("Feuil2").Cells(a, 4).Value = ligne
  32. a = a + 1
  33.  
  34. Next
  35.  
  36. b = Sheets("feuil2").Range("A65536").End(xlUp).Row
  37.  
  38. a = 5
  39. While a <= b
  40.  
  41. If Sheets("feuil2").Cells(a, 1) = "" Then
  42. Sheets("feuil2").Rows(a).Delete Shift:=xlUp
  43. b = b - 1
  44.  
  45. Else
  46.  
  47. a = a + 1
  48.  
  49. End If
  50.  
  51. Wend
  52.  
  53.  
  54. End Sub


Quelqu'un peut-il m'aider?
Par avance merci

Autres pages sur : creer historique

Lassé par la pub ? Créez un compte

Meilleure solution

je pense avoir trouver une solution. en fait le 1 qui sert de condition est tiré d'une formule avec Si (selon qu'une cellule est vide ou non.


J'ai rajouter en ligne 16 un code qui remet à 0 cette cellule. Maintenant vu que ca écrase ma formule il suffit que je me serve des macro qui commande le tableau pour faire apparaitre ce 1.

je teste ca et je te dis si ca marche


  1. Sub historique()
  2.  
  3.  
  4. Dim i As Long, a As Long
  5.  
  6. a = Worksheets("Historique (détail)").Range("A65536").End(xlUp).Row + 1
  7.  
  8.  
  9. For i = 36 To 57
  10. If Worksheets("Plan atelier").Cells(i, 1).Value = 1 Then
  11. Worksheets("Historique (détail)").Cells(a, 1).Value = Worksheets("Plan atelier").Cells(i, 60).Value
  12. Worksheets("Historique (détail)").Cells(a, 2).Interior.ColorIndex = Worksheets("Plan atelier").Cells(i, 66).Interior.ColorIndex
  13. Worksheets("Historique (détail)").Cells(a, 3).Value = Worksheets("Plan atelier").Cells(i, 26).Value
  14. Worksheets("Historique (détail)").Cells(a, 4).Value = Worksheets("Plan atelier").Cells(i, 68).Value
  15. Worksheets("Historique (détail)").Cells(a, 5).Value = Worksheets("Plan atelier").Cells(i, 7).Value
  16. Worksheets("Plan atelier").Cells(i, 1).Value = 0
  17. a = a + 1
  18. End If
  19.  
  20. Next
  21.  
  22. End Sub
Expert Programmation

Ouh que c'est pas beau !

Salut Julien.

De la très belle écriture pour certaines choses, du vraiment pas beau pour d'autres. Ton algo pour la suppression est pour le moins surprenant, mais intelligent. Mais je cherche encore pourquoi tu remplis des lignes vides pour les supprimer :??: 

Je ne parlerai que des trucs pas bien, ne t'en vexe pas ;) 

1° Où sont les déclarations des variables ? La ligne 4 n'est pas suffisante.
a est un numéro de colonne et doit être déclaré en entier, pas en réel.

2° A la place de Sheets, utilise Worksheets. Là, je chipote.

3° Indente correctement ton code.

4° En 1980, on utilisait While / Wend. De nos jours, utilise Do .. Loop

Ça fait :
  1. Option Explicit
  2.  
  3. Sub historique()
  4.  
  5. Dim i As Long, a As Long
  6. Dim com, datedeb, typep, machine, ligne
  7.  
  8. a = 5
  9. For i = 36 To 57
  10. If Worksheets("Feuil1" ).Cells(i, 1).Value = 1 Then
  11. com = Worksheets("Feuil1" ).Cells(i, 26).Value
  12. datedeb = Worksheets("Feuil1" ).Cells(i, 60).Value
  13. typep = Worksheets("Feuil1" ).Cells(i, 66).Interior.ColorIndex
  14. machine = Worksheets("feuil1" ).Cells(i, 7).Value
  15. ligne = Worksheets("feuil1" ).Cells(i, 68).Value
  16.  
  17. Worksheets("Feuil2" ).Cells(a, 3).Value = com
  18. Worksheets("Feuil2" ).Cells(a, 1).Value = datedeb
  19. Worksheets("Feuil2" ).Cells(a, 2).Interior.ColorIndex = typep
  20. Worksheets("Feuil2" ).Cells(a, 5).Value = machine
  21. Worksheets("Feuil2" ).Cells(a, 4).Value = ligne
  22. a = a + 1
  23. End If
  24. Next
  25.  
  26. End Sub


Encore plus concis :
  1. Option Explicit
  2.  
  3. Sub historique()
  4.  
  5. Dim i As Long, a As Long
  6.  
  7. a = 5
  8. For i = 36 To 57
  9. If Worksheets("Feuil1" ).Cells(i, 1).Value = 1 Then
  10. Worksheets("Feuil2" ).Cells(a, 1).Value = Worksheets("Feuil1" ).Cells(i, 60).Value
  11. Worksheets("Feuil2" ).Cells(a, 2).Interior.ColorIndex = Worksheets("Feuil1" ).Cells(i, 66).Interior.ColorIndex
  12. Worksheets("Feuil2" ).Cells(a, 3).Value = Worksheets("Feuil1" ).Cells(i, 26).Value
  13. Worksheets("Feuil2" ).Cells(a, 4).Value = Worksheets("feuil1" ).Cells(i, 68).Value
  14. Worksheets("Feuil2" ).Cells(a, 5).Value = Worksheets("feuil1" ).Cells(i, 7).Value
  15. a = a + 1
  16. End If
  17. Next
  18. End Sub


Le problème, c'est que tu remets ton historique à partir de la ligne 5, systématiquement. Il faudrait recommencer à la suite, non ?

  1. Option Explicit
  2.  
  3. Sub historique()
  4.  
  5. Dim i As Long, a As Long
  6.  
  7. a = Worksheets("feuil2" ).Range("A65536" ).End(xlUp).Row + 1
  8. For i = 36 To 57
  9. If Worksheets("Feuil1" ).Cells(i, 1).Value = 1 Then
  10. Worksheets("Feuil2" ).Cells(a, 1).Value = Worksheets("Feuil1" ).Cells(i, 60).Value
  11. Worksheets("Feuil2" ).Cells(a, 2).Interior.ColorIndex = Worksheets("Feuil1" ).Cells(i, 66).Interior.ColorIndex
  12. Worksheets("Feuil2" ).Cells(a, 3).Value = Worksheets("Feuil1" ).Cells(i, 26).Value
  13. Worksheets("Feuil2" ).Cells(a, 4).Value = Worksheets("feuil1" ).Cells(i, 68).Value
  14. Worksheets("Feuil2" ).Cells(a, 5).Value = Worksheets("feuil1" ).Cells(i, 7).Value
  15. a = a + 1
  16. End If
  17. Next
  18. End Sub


Cela t'aide-t-il ?
Si oui, étudie ce code :
  1. Option Explicit
  2.  
  3. Sub historique()
  4. Dim cell_panne As Range
  5. Dim cell_histo As Range
  6.  
  7. Set cell_panne = Worksheets("feuil2").Columns(1).Cells(65536).End(xlUp).Offset(1)
  8. For Each cell_histo In Worksheets("Feuil1" ).Range("A36:A57")
  9. If cell_histo.Value = 1 Then
  10. cell_panne.Offset(0, 0).Value = cell_histo.Offset(0, 59).Value
  11. cell_panne.Offset(0, 1).Interior.ColorIndex = cell_histo.Offset(0, 65).Interior.ColorIndex
  12. cell_panne.Offset(0, 2).Value = cell_histo.Offset(0, 25).Value
  13. cell_panne.Offset(0, 3).Value = cell_histo.Offset(0, 67).Value
  14. cell_panne.Offset(0, 4).Value = cell_histo.Offset(0, 6).Value
  15. Set cell_panne = cell_panne.Offset(1)
  16. End If
  17. Next
  18. End Sub


-----------
EDIT: Ligne 8, il manquait le mot Each. Désol'

Salut Zeb,

ta réponse est super, ca marche beaucoup mieux que mes codes (comme je connais pas grand chose j'essai des solutions dérvivées).

Par contre j'ai du mal avec ce le dernier code c'est bien au dela de mes compétences.

Pourrais-je te demander une autre petite chose?

Comment faire pour ne pas recopier une ligne si elle n'a pas été effacée? je m'explique: si d'autres pannes surviennent mais qu'une autre est toujours existante, si je valide mes pannes la macro me recopie une nouvelle fois cette panne.
Expert Programmation

Nan, nan, nan. :non:  Il n'y a rien qui ne soit au delà de tes compétences, pour peu que tu les élèves un peu. Et c'est justement le but de ce dernier code : te faire progresser.

Pour l'instant et la suite, je vais t'aider à faire ton boulot. Ma récompense ne devrait être qu'un "merci" ? Sache que je ne m'en contenterai pas. Il me faudra aussi être convaincu de t'avoir appris quelque chose.

C'est la rançon exigée ici.

¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
[:flambyx:2]


_________________
NB. Je suis un tortionnaire : pour t'encourager, je repartirai du dernier code. [:nyghost]

J'étais justement en train de vouloir tester ton dernier code mais il y a un problème ligne 8.

Pour ce qui est de mon autre problème je réfléchis à quelques solutions et il est vrai que c'est mon boulot. j'aurai due te répondre qu'une fois une solution trouvé. j'y ai pensé mais le message était déjà envoyé. dsl

je m'y remet de suite.
Expert Programmation

EDIT:
Quel est le problème de la ligne 8 ?
Incompression de ta part ou bug ?
Ligne 8, il manquait le mot Each. Désol'

-------------

Ligne 9 de mon code on peux lire :
  1. If cell_histo.Value = 1 Then

C'est la condition pour faire la copie.

Or tu voudrais y ajouter : <<si elle n'a pas été effacée>>
Je propose plutôt : <<si elle n'a pas déjà dans l'historique>>.

Qu'en penses-tu ?
Il faut donc déterminer de com, datedeb, machine et ligne quels sont les champs discriminants. Puis on recherche si la ligne est présente dans l'histo. Si oui, on ne fait rien, si non, on copie.

A la lumière de ces éléments, as-tu une idée de comment faire ?

-------------

Pour me faire plaisir, renomme ta feuil1 en Panne(*) et ta feuille 2 en Historique(*).

(*) Ou autre, à ton choix, pourvu que ce soit pertinent. ;) 

Voila mon idée.

Je pensai utilisé l'algo pour la suppression.

Pour rappel
  1. b = Sheets("feuil2").Range("A65536").End(xlUp).Row
  2.  
  3. a = 5
  4. While a <= b
  5.  
  6. If Sheets("feuil2").Cells(a, 1) = "" Then
  7. Sheets("feuil2").Rows(a).Delete Shift:=xlUp
  8. b = b - 1
  9.  
  10. Else
  11.  
  12. a = a + 1
  13.  
  14. End If
  15.  
  16. Wend


Je pense remplacer le while wend pour etre plus a la page.

Mais le hic c'est de remplacer "" (ligne 6) par la ou les lignes déja existantes.
Expert Programmation

Tiens, ça c'est pour la fine bouche, quand t'auras 5 minutes ;) 
  1. Option Explicit
  2.  
  3. Sub historique()
  4. Dim f_panne As Worksheet ' // Feuille
  5. Dim f_histo As Worksheet ' // Feuille
  6. Dim c_panne As Range ' // Cellule
  7. Dim c_histo As Range ' // Cellule
  8. Dim c_histo_der As Range ' // Cellule
  9. Dim com As Variant ' // N'importe quoi
  10. Dim dat As Variant ' // N'importe quoi
  11. Dim found As Boolean ' // Booléen
  12.  
  13. Set f_panne = Worksheets("liste des pannes")
  14. Set f_histo = Worksheets("historique des pannes")
  15.  
  16. Set c_histo_der = f_histo.Columns(1).Cells(65536).End(xlUp).Offset(1)
  17.  
  18. For Each c_panne In f_panne.Range("A36:A57")
  19. If c_panne.Value = 1 Then
  20. ' // Supposons que les critères soient com et dat
  21. com = c_panne.Offset(0, 25).Value
  22. dat = c_panne.Offset(0, 59).Value
  23.  
  24. ' // recherchons la ligne (com, dat) dans "liste des pannes"
  25. found = False
  26. For Each c_histo In f_histo.Range(f_histo.Range("A5"), c_histo_der)
  27. If c_histo.Offset(0, 2) = com And _
  28. c_histo.Offset(0, 0) = dat _
  29. Then
  30. ' // On a trouvé !!!!!
  31. found = True
  32. ' // Pas besoin d'aller au bout
  33. Exit For
  34. End If
  35. Next
  36.  
  37. ' // Si on n'a pas trouvé, on fait la copie
  38. If Not found Then
  39. c_histo.Offset(0, 0).Value = c_panne.Offset(0, 59).Value
  40. c_histo.Offset(0, 1).Interior.ColorIndex = c_panne.Offset(0, 65).Interior.ColorIndex
  41. c_histo.Offset(0, 2).Value = c_panne.Offset(0, 25).Value
  42. c_histo.Offset(0, 3).Value = c_panne.Offset(0, 67).Value
  43. c_histo.Offset(0, 4).Value = c_panne.Offset(0, 6).Value
  44.  
  45. Set c_histo_der = c_histo_der.Offset(1)
  46. End If
  47. End If
  48. Next
  49. End Sub
Lassé par la pub ? Créez un compte