Comment trouver toutes les valeur d'une colonne non continue [Fermé]

Signaler
Messages postés
270
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
12 avril 2021
-
Messages postés
218
Date d'inscription
jeudi 2 mai 2013
Statut
Membre
Dernière intervention
15 juillet 2019
-
Bonjour,

J'ai une macro qui trouve les valeurs présente dans la colonne C à partir de la ligne 5 et copie tous les numéro trouvés sur une autre feuille selon le type qui est déterminé avec la colonne 4 .

Tout ce passe bien si mes valeurs sont continue, mais dès qu'il y a une cellule vide, la macro arrête de compter le nombre de ligne même si j'ai d'autres valeurs après.

Est-ce possible de trouver toutes les valeurs de ma colonne C même si elles ne sont pas continue?

Je pense qu le problème vient de ma ligne qui détermine la "plage"!

Voici mon code:
Sub CopieFeuillets()
' Macro de Copie & de Tri

    Dim f As Worksheet
    
    Application.EnableEvents = False
    Application.ScreenUpdating = False

    For Each f In ActiveWorkbook.Worksheets
        f.Unprotect
    Next

   With Sheets("Coordonnées")
        For i = 1 To 5
            On Error Resume Next
            Erase critères
            On Error GoTo 0
            Select Case i
            
            Case 1
                wsn = "FORAGE"
                critères = Array("F", "FC", "FS", "FSZ", "FCR")
                Col = "A" ' colonne dans laquelle mettre le n° de sondage, est également la colonne pour le tri
               PL = 8 'première ligne des données dans wsn
               tabtri = "A" & PL & ":N" ' tableau à trier
           Case 2
                wsn = "CPTU"
                critères = Array("C", "CR", "FC", "M")
                Col = "A"
                PL = 7
                tabtri = "A" & PL & ":O"
            Case 3
                wsn = "Piézomètres"
                critères = Array("Z", "FSZ", "FZ")
                Col = "B"
                PL = 8
                tabtri = "A" & PL & ":M"
            Case 4
                wsn = "Inclinomètres"
                critères = Array("I")
                'critères = "I"
                Col = "B"
                PL = 7
                tabtri = "A" & PL & ":H"
            Case 5
                wsn = "Tromino"
                critères = Array("V")
                Col = "B"
                PL = 8
                tabtri = "A" & PL & ":J"
                
            End Select
            '---------- modif 09/05/2015 --------------
            'filtre critere
            .Range("$A$4:$N$64").AutoFilter Field:=4, Criteria1:=critères, Operator:=xlFilterValues         'on filtre les données de coordonnées
            'mise en memoire plage
            Set plage = .Range(.Range("C5"), .Range("C5").End(xlDown)).SpecialCells(xlVisible)
            'si critere n'existe pas: NbCel=1048512----> max ligne excel2007 a 2013
            NbCel = plage.Count
            If NbCel < MaxLigInfos Then     'test si moins de ligne que const MaxLigInfos
                Set ws = Sheets(wsn)    ' ws = référence de la feuille
                nl = ws.Cells(Rows.Count, Col).End(xlUp).Row    ' nl pointeur de dernière ligne utilisée dans la feuille basé sur colonne col
                If nl <= PL Then nl = PL + 1
                For Each r In plage   ' on parcourt toutes les cellules sélectionnées de la colonne  C, (r=cellule en cours)
                    Set re = ws.Range(Col & ":" & Col).Find(r.Value, lookat:=xlWhole)    'on recherche le n°de sondage dans la colonne col
                    If re Is Nothing Then    'si non trouvé
                        'ajoute une nouvelle ligne avant derniere ligne
                        ws.Rows(nl).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
                        'derniere ligne + 1
                        ws.Cells(nl, Col) = ws.Cells(nl - 1, Col)
                        ws.Cells(nl - 1, Col) = r.Value  ' on met le numéro de sondage en colonne col
                    End If
                Next r
                With ws.Range(tabtri & nl)
                    .Sort key1:=.Cells(1, Col), order1:=xlAscending, Header:=xlNo
                End With
            Else
                xx = UBound(critères)
                Crit = "<"
                For x = 0 To xx
                    Crit = Crit & critères(x) & ";"
                Next x
                'Crit = Crit & ">"
                'MsgBox "Aucun sondages " & Crit & " trouvés & copiés !!!!!!", vbInformation
            End If
        Next i
        If Worksheets("Coordonnées").AutoFilterMode Then
            Worksheets("Coordonnées").AutoFilterMode = False
        End If
    End With
    
    For Each f In ActiveWorkbook.Worksheets
        f.Protect , AllowFormattingCells:=True, AllowFormattingRows:=True
    Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub


Merci pour votre aide!

2 réponses

Messages postés
15818
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 avril 2021
688
Messages postés
15818
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 avril 2021
688
VBA n'est pas mon fort, je ne sais pas.
Il faudra attendre qu'un autre jette un oeil.
Messages postés
270
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
12 avril 2021
1 >
Messages postés
15818
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 avril 2021

Ok, merci beaucoup!!
Messages postés
15818
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 avril 2021
688
CurrentRegion est un Range, alors j'ai essayé ça
DerniereLigne = Range("C:C").End(xlDown).Row
et ça marche avec mon tableau de test
Messages postés
270
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
12 avril 2021
1 >
Messages postés
15818
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 avril 2021

Bonjour,

Effectivement c'est un range, mais moi dans mon tableau, j'ai des cellules vides au travers des cellules avec des valeurs. Donc, avec votre méthode, il arrête à la première cellule vide de la colonne, comme cette ligne de code
Set plage = .Range(.Range("C5"), .Range("C5").End(xlDown)).SpecialCells(xlVisible)


Alors, je veux trouver la dernière ligne avec une valeur en ne tenant pas compte des cellules vides.

Merci!
Utilisateur anonyme >
Messages postés
270
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
12 avril 2021

 
Bonjour bassmart, cela t'aidera peut-être :

  Dim dlig As Long  ' dernière ligne, selon la colonne C :
  dlig = Range("C" & Rows.Count).End(xlUp).Row

Cordialement.  😊
 
Messages postés
218
Date d'inscription
jeudi 2 mai 2013
Statut
Membre
Dernière intervention
15 juillet 2019
19
Bonjour,

Un truc peut-être ...

Placer un colonne contenant une valeur continue, qui pourrait être
masquer de démasquer au moment de définir la sélection à parcourir.

Ce peut être n'importe quoi comme valeur [ A ] [ 1 ] ...

C'est ce que je fais toujours...

K