[Résol]Calc: dernière occurence d'uncaractère

antokomba Messages postés 17 Statut Membre -  
antokomba Messages postés 17 Statut Membre -
Bonjour,

J'aimerai automatiser la recherche de la dernière apparition d'un chiffre, et qu'il me donne en résultat le numéros de la dernière ligne ou le chiffre est apparu.(ou mieux: le numéro de la ligne -17 par exemple).

J'ai en gros quelques centaines de lignes, 8 colones, et une 60aine de chiffres possible différents.

Quelle est la formule la plus appropriée?
Pourriez vous me faire un exemplepour un chiffre?

Merci par avance,

Anto.

12 réponses

  1. ccm81 Messages postés 11033 Statut Membre 2 434
     
    bonjour,
    sans vba je ne sais pas
    avec vba un exemple ou le chiffre cherché est en K1 et le resultat en K2

    Private Sub CommandButton1_Click()
    Dim li As Long, derli As Long, ch As Long, co As Long, lich As Long
    derli = Range("A65536").End(xlUp).Row
    lich = 0
    ch = Range("K1").Value
    For li = 1 To derli
      For co = 1 To 8
        If Cells(li, co) = ch Then
          lich = li
        End If
      Next co
    Next li
    Range("K2").Value = lich
    End Sub


    bonne suite
    0
  2. antokomba Messages postés 17 Statut Membre
     
    Si j'ai bien compris c'est une macro qu'il faut que j'utilise?
    Tu peux me corriger pour la valeur 11 et le résultat dans la case V400 stp?

    Private Sub CommandButton1_Click()
    Dim li As Long, derli As Long, ch As Long, co As Long, lich As Long
    derli = Range("A65536").End(xlUp).Row
    lich = 0
    ch = Range("A1:E900").11
    For li = 1 To derli
    For co = 1 To 8
    If Cells(li, co) = ch Then
    lich = li
    End If
    Next co
    Next li
    Range("v400").Value = lich
    End Sub
    0
  3. ccm81 Messages postés 11033 Statut Membre 2 434
     
    re

    Private Sub CommandButton1_Click()   
    Dim li As Long, derli As Long, ch As Long, co As Long, lich As Long   
      derli = Range("A65536").End(xlUp).Row   
      lich = 0   
      ch = 11  
      For li = 1 To derli   
        For co = 1 To 8   
          If Cells(li, co) = ch Then   
            lich = li   
          End If   
        Next co   
      Next li   
    Range("v400").Value = lich   
    End Sub

    devrait aller
    RQ. Cette macro est atachée a un bouton qu'il te faudra mettre sur la feuille ( a prendre dans la boite a outils controles), si tu ne sais pas faire, on peut simplifier la manoeuvre

    bonne suite
    0
  4. antokomba Messages postés 17 Statut Membre
     
    Je ne sais pas comment on fait pour le boutton :s
    J'ai essayé de l'exécuter tel quelle mais j'ai des erreur:

    Quand je fait exécuter la macro, ça me met "Erreur de synthaxe BASIC, Private non autorisée dans une procédure"

    Aussi j'ai un "Sub Main" dans l'endroit ou j'ai collé la macro, tout au début.
    Quand je le supprime j'ai "Erreur d'exécution BASIC. Sous procédure ou procédure de fontion non définie."
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. antokomba Messages postés 17 Statut Membre
     
    Aussi je viens de voir ce sujet :https://forum.openoffice.org/fr/forum/viewtopic.php?f=8&t=26929
    Ils disent qu'il faut mettre "Option VBASupport 1" au début pour que les macro VBA marchent.
    J'ai donc lancé ma macro avec ça, et ça me donne un 368 en V400, ou j'attendais un 19 (car le premier 11 est sur la ligne 19)
    0
    1. ccm81 Messages postés 11033 Statut Membre 2 434
       
      et ça me donne un 368 en V400, ou j'attendais un 19 (car le premier 11 est sur la ligne 19)
      mais tu as demandé la dernière ligne où le chiffre est apparu !!!
      0
    2. antokomba Messages postés 17 Statut Membre
       
      Et merde, je me suis mal exprimé... j'ai pas précisé que je remplie les chiffres par le haut ici.
      Du coup je fait comment?
      0
  7. ccm81 Messages postés 11033 Statut Membre 2 434
     
    re
    désolé, je m'en doutais un peu
    donc
    Alt F11 pour acceder a l'editeur de macro (tu supprimes tout)

    1.tu copies le code suivant (le nom de la procedure a changé)
    Sub derligne()  
    Dim li As Long, derli As Long, ch As Long, co As Long, lich As Long  
    derli = Range("A65536").End(xlUp).Row  
    lich = 0  
    ch = 11  
    For li = 1 To derli  
      For co = 1 To 8  
        If Cells(li, co) = ch Then  
          lich = li  
        End If  
      Next co  
    Next li  
    Range("V400").Value = lich  
    End Sub

    2. Outils/Macros/
    tu choisis derligne
    Options
    touche de raccourci ctrl+s (par exemple)
    3. pour executer
    Outils/macros/derligne/executer
    ou
    ctrl+s

    si tu veux savoir comment on met un bouton et lui attacher un code, tu dis

    bonne suite
    0
  8. antokomba Messages postés 17 Statut Membre
     
    My bad, je viens de voir ton commentaire.
    Je remplis les lignes par le haut dans ce fichier...la dernièer occurence sera donc en partant du haut. Vraiment désolé de t'avoir fait perdre du temps avec ça.
    0
  9. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonsoir tout le monde,

    Sinon c'est faisable par formule.

    Avec le nombre recherché (11) en C1 :
    ligne 1ère occurence :
    =MIN(SI(($A$2:$A$400)=C1;LIGNE($A$2:$A$400);9^9))
    ligne dernière occurence :
    =MAX((($A$2:$A$400)=C1)*LIGNE($A$2:$A$400))

    Les 2 formules sont matricielles et doivent être validées par shift+ctrl+entrée.
    (elles s'entourent ensuite de { } )

    eric
    0
  10. antokomba Messages postés 17 Statut Membre
     
    @Eric,
    Si je comprend bien, si je veux la première occurence du chiffre la première formule suffit?
    Sinon j'ai l'impression que ça ne prend en compte que la première colonne.
    Aussi quand je fait shift+ctrl+entrée après avoir collée la formule rien ne se passe ( pas de {} ) et j'ai une erreur.
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Re,

      j'ai l'impression que ça ne prend en compte que la première colonne.
      oui, faite sur A2:A400

      quand je fait shift+ctrl+entrée après avoir collée la formule rien ne se passe ( pas de {} ) et j'ai une erreur.
      C'est que tu le fais mal... Il faut que le curseur soit dans la zone d'édition des formules en haut.

      ex: Classeur1.xls

      eric
      0
    2. antokomba Messages postés 17 Statut Membre
       
      "j'ai l'impression que ça ne prend en compte que la première colonne.
      oui, faite sur A2:A400 "
      Et c'est possible de le fraire sur 5 colonnes en même temps?
      0
    3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Re,

      avec la valeur recherchée en G1 :
      =MIN(SI(($A$2:$E$400)=G1;LIGNE($A$2:$E$400);9^9))
      formule matricielle à valider par shift+ctrl+entrée
      0
  11. ccm81 Messages postés 11033 Statut Membre 2 434
     
    re

    @ eriiic
    jolie formule comme d'habitude et une question, dans mon code y a t'il moyen de quitter les deux for en même temps?

    @antokomba
    pour ne pas rester sur une impression d'inachevé et si tu veux eviter une formule matricielle

    <code>Sub Premli()
    Dim li As Long, derli As Long, ch As Long, co As Long, lich As Long
    Dim trouve As Boolean
    derli = Range("A65536").End(xlUp).Row
    lich = 0
    ch = 11
    trouve = False
    For li = 1 To derli
      For co = 1 To 8
        If Cells(li, co) = ch Then
          lich = li
          trouve = True
          Exit For
        End If
      Next co
      If trouve Then
        Exit For
      End If
    Next li
    Range("V400").Value = lich
    End Sub
    </code>

    bonne suite
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Salut ccm81,

      y a t'il moyen de quitter les deux for en même temps?
      La possibilité que tu as utilisée (tester un flag) est correcte, je procède presque tout le temps ainsi.
      Tu pourrais aussi forcer 'li' à sa valeur max (et tant qu'à faire 'co' aussi, et 'trouve' devient inutile). Au next li tu quitteras la boucle. C'est plus court mais peut-être moins lisible.

      eric
      0
  12. ccm81 Messages postés 11033 Statut Membre 2 434
     
    @ eriiic
    merci, ça me rassure ...
    en y reflechissant il y avait encore d'autres ruses plus ou moins propres, comme un goto (là on touche les bas fonds) , un traitement au coeur de la boucle suivi d'un exit sub, mais si je comprends bien, rien du genre exit for-for
    cordialement
    0
  13. antokomba Messages postés 17 Statut Membre
     
    Ca marche, merci beaucoup à tous les deux!
    0