VBA obtenir la ligne de la dernière cellule g

Résolu
sishley Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
ccm81 Messages postés 11033 Statut Membre -
Bonjour,

Je débute en VBA, et je ne suis pas informaticienne. Je vous demande votre aide car après plusieurs jours de recherche infructueuse, je ne trouve pas la solution à mon problème. J'ai des cellules grises, des cellules blanches et des cellules vides qui se sucèdent dans une colonne. J'ai besoin detrouver la dernière cellule grisée pour pouvoir ensuite comparer toutes mes cellules grises à mes cellules blanches. La longeur du tableau varie ce sont des données qui changent toutes les semaines. Voila ce que j'ai fait :

"Sub select_cell()
'
Workbooks("Classeur1.xlsm").Sheets("RECAPT6B").Activate
Range("C6653").End(xlUp).Select
If (Selection.ColorIndex <> 16) Then ActiveCell.Offset(-1, 0).Select
Do Until Selection.ColorIndex = 16
Loop

End Sub "
"

Je voudrais ensuite déclarer ce numero de ligne comme un nombre afin de comparer l'intégralité de mes cellules blanches à mes cellules grises. Je vous remercie pour votre aide.

6 réponses

  1. ccm81 Messages postés 11033 Statut Membre 2 434
     
    bonjour
    un exemple à adapter
    ' pour test colonne 1 
    lifin = Cells(Rows.Count, 1).End(xlUp).Row 
    ligrise = 0 
    For li = 1 To lifin 
      If Cells(li, 1).Interior.ColorIndex = 16 Then ligrise = li 
    Next li 
    MsgBox ("derniere ligne grise : " & ligrise)

    bonne suite
    1
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    bonjour
    ta procedure étant certainement lancée à partir d'un module général ou d'un module d'une autre feuille, il manque aux cells(li,co) la référence à la feuille cible
    la constante nomF(est à adapter à ton cas)

    Const nomF = "Feuil2"    
    
    Public Sub DerLigneGrise()    
    ' pour test colonne C    
    With ActiveWorkbook.Sheets(nomF)    
      lifin = .Range("C" & Rows.Count).End(xlUp).Row    
      ligrise = 0    
      For li = 1 To lifin    
        If .Range("C" & li).Interior.ColorIndex = 16 Then ligrise = li    
      Next li    
      MsgBox ("derniere ligne grise : " & ligrise)    
    End With    
    End Sub

    RQ. de plus, ton code ne peut pas fonctionner
    1. For li = Lifin To 1
    1.1. ici, lifin n'est pas connu
    1.2. ta boucle est sensée décrémentér li à chaque tour donc il manque(rait) step -1
    lifin = Cells(Rows.Count, 3).End(xlUp).Row
    2. ligrise = 0
    ligrise ne doit pas être mis à 0 à chaque tour (si on ne trouve pas d'autre ligne grise, tu vas perdre la dernière trouvée)

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

    tiré de mon grenier, ce code te donne la ligne de la dernière cellule rouge d'une feuille ( les couleurs sont saisies manuellement et vides)

    Application.FindFormat.Clear  
        Application.FindFormat.Interior.ColorIndex = 3  
        ligne_dercellrouge = Cells.Find(What:="", after:=Range("A" & Rows.Count), SearchFormat:=True, searchdirection:=xlPrevious).Row


    à adapter
    Michel
    1
  4. sishley Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour,

    Merci pour votre réponse.

    J'ai bien essayé votre méthode. J'ai adapté à mon code et après j'ai voulu tester qu'elle marchait bien en afichant le compte tenu de la dernière cellule grise dans l'autre case mais ça marquait erreur 1004 defini par l'objet ou l'application.

    Sub select_cell()
    '
    ' select_cell Macro
    '
    'Dim ne As Range
    Workbooks("Classeur1.xlsm").Sheets("RECAPT6B").Activate
    Lifin = Range("C6653").Row
    For li = Lifin To 1
    ligrise = 0
    If Cells(li, 3).Interior.ColorIndex = 16 Then ligrise = li
    Next li
    Workbooks("Classeur1.xlsm").Sheets("Delai").Activate
    Cells(49, 3) = Cells(ligrise, 3).Value

    End Sub

    J'ai aussi essayer directement avec

    select_cell Macro
    '
    Workbooks("Classeur1.xlsm").Sheets("RECAPT6B").Activate
    For li = Lifin To 1
    lifin = Cells(Rows.Count, 3).End(xlUp).Row
    ligrise = 0
    If Cells(li, 3).Interior.ColorIndex = 16 Then ligrise = li
    Next li
    Workbooks("Classeur1.xlsm").Sheets("Delai").Activate
    Cells(49, 3) = Cells(ligrise, 3).Value

    End Sub'
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. sishley Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
     
    Merci pour vos deux réponses. J'ai testé la solution de ccm81 et elle marche c'est l'indice couleur qui était faux ( c'est 15 ) en réalité. Merci encore

    @michel_m Je n'ai pas du coup cherché à utiliser votre fonction mais je vous remercie pour votre réponse.
    0
  7. ccm81 Messages postés 11033 Statut Membre 2 434
     
    re

    Adaptation du code (poussiéreux peut être, mais efficace) de Michel (cordiales salutations à toi)
    Une fonction qui renvoie la dernière cellule de couleur coul, de la colonne col, de la feuille nomF

    Public Function DerLiCoulDansCol(coul As Long, nomF As String, col As String)   
      Application.FindFormat.Clear   
      Application.FindFormat.Interior.ColorIndex = coul   
      With ActiveWorkbook.Sheets(nomF)   
        DerLiCoulDansCol = .Cells.Find(What:="", after:=Range(col & Rows.Count), SearchFormat:=True, searchdirection:=xlPrevious).Row   
      End With   
    End Function

    et au niveau de l'appel un exemple
    Dim DerLiGrise As Long   
    DerLiGrise = DerLiCoulDansCol(16, "Feuil2", "C")

    > michel : et ton searchdirection=xlPrevious me fait penser que j'aurais du partir du bas en remontant (la honte)

    bonne fin de journée
    0