Code VBA pour calcul automatique et listing d'éléments

KLA -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
En vous remerciant d'avance de l'attention portée à ma publication.

Je vous expose la situation :
Dans le lien ci-dessous (cjoint) se trouve un tableur excel doté de trois feuilles ;
Sur la première, une liste de navires correspondant à une année et un état.
Sur la deuxième, le cumul de certains navires pour l'année courante
Sur la troisième, la liste complète de certains navires pour cette même année courante.

Ce document doit m'aider à renseigner un nombre de navires ayant quitté le port cette année (sur la feuille 2) ainsi qu'a obtenir la liste de tous ces navires après leur départ (feuille 3)

Le besoin que j'ai consiste à utiliser la première feuille comme données sources pour remplir de manière automatisée les feuilles 2 et 3.
Lorsqu'un navire possède l'état "E" ou "X" sur la feuille1, il faut que la valeur des navires cumulés dans le feuille2 augmente de 1. Cette valeur cumulée ne concerne que les navires pour l'année courante.
De plus, chaque navire ayant cet état "E" ou "X" doit apparaître individuellement dans la liste 3, et ce associé à son année de départ

Voici le document joint :
http://www.cjoint.com/c/FFckbfMDG7i

Merci à tous ceux qui pourront m'aider ou auront essayé.

Cordialement,
KLA

PS : ma version d'excel est 2010.

1 réponse

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour

    pour la feuile1
    A2:A26 nommé "navire"
    B2:B26 nommé An_O
    C2:C26 nommé "etat"

    en H6 feuil2

    =SOMMEPROD((an_0=ANNEE(AUJOURDHUI()))*((etat="E")+(etat="X")))
    0
    1. KLA
       
      Bonjour michel_m,

      J'ai tenté d'utiliser cette fonction, mais cela ne semble pas concluant. La case H6 affiche une erreur #valeur...
      De plus, cela ne me permet pas de transférer les lignes des navires sur la troisième feuille.

      Il s'agit peut-être d'une erreur de ma part, cependant j'ai vérifié maintes fois l'exactitude de la ligne de fonction. Peut-être s'agit-il de la manière de nommer les cellules ? Je me suis contenté de modifier les en-têtes du tableau feuil1, ne sachant pas comment (ni même s'il est possible) de renommer une plage de cellules sans passer par le VBA.

      En vous remerciant de votre aide, j'espère que vous saurez éclaircir cette incompréhension qui me mène a une erreur.
      0
      1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > KLA
         
        Bonjour

        pour H6 feuil2, pas besoin de VBA

        peut-^tre : lire An_0 et non AN_O

        voir
        http://www.cjoint.com/data3/FFdiHI4stQt_ccm-cumul-double.xlsx

        je n'ai pas regerdé pour la feuil3 (pas trop compris la demande
        0
    2. KLA
       
      Je vais aller vérifier ça et reviens donner des nouvelles dès que possible. Encore merci pour le temps que vous me consacrez.


      Pour la feuille3, je vais essayer d'être simple : tous les navires qui sont partis (et donc qui participent à la somme en H6 feuil2) doivent apparaître listés sur la feuil3 (un simple copié/collé de leur nom). Néanmoins il ne faut afficher que ceux étant partis pendant l'année calendaire en course.

      Par exemple : en feuil1, Navire2 et Navire3 affichent des états de départs ("E" ou "X"), mais sont antérieur (2011) à l'année courante, il ne faut donc pas les copier. Par contre, Navire 20 affiche un état de départ pour l'année actuelle (2016), il faudra donc que "Navire20" soit copié/collé automatiquement dans le tableau feuil3.
      0
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      re,

      en définitive, j'ai tout fait par VBA comme tu le souhaitais (formule matricielle pas piquée des hannetons et lente pour la feuil3

      Option Explicit
      Const etatE As String = "E"
      Const etatX As String = "X"
      '------------------------------------------------------------
      Sub reperer_avec_Trois_critères()
      Dim An_0 As Integer, Derlig As Byte, Cptr As Byte, Dico As Object

      Application.ScreenUpdating = False
      Set Dico = CreateObject("scripting.dictionary")
      An_0 = Year(Date)
      With Sheets(1)
      Derlig = .Columns("A").Find(what:="*", searchdirection:=xlPrevious).Row
      For Cptr = 2 To Derlig
      If (.Cells(Cptr, "B") = An_0) * ((.Cells(Cptr, "C") = etatE) + (.Cells(Cptr, "C") = etatX)) Then
      Dico.Add .Cells(Cptr, "A"), ""
      End If
      Next
      End With
      With Sheets(2)
      .Range("H6") = Dico.Count
      End With
      With Sheets(3)
      .Range("C2") = An_0
      .Range("B2:B200").Clear
      .Range("B2").Resize(Dico.Count, 1) = Application.Transpose(Dico.keys)
      .Range("B2:B" & 2 + Dico.Count).Borders.Weight = xlThin
      End With
      End Sub

      0