Comment trouver toutes les valeur d'une colonne non continue

Fermé
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 - 2 nov. 2016 à 18:56
Kalissi Messages postés 218 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 15 juillet 2019 - 8 nov. 2016 à 22:23
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

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
2 nov. 2016 à 20:09
0
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 1
7 nov. 2016 à 21:25
Merci beaucoup pour le lien Whismeril, mais je ne réussi pas à le mettre au bon endroit dans mon code.

J'ai essayé avec la fonction CurrentRegion sur la ligne:
Set plage = .Range(.Range("C5"), .Range("C5").CurrentRegion.End(xlDown)).SpecialCells(xlVisible)
, mais j'ai un petit problème, il prend aussi la première valeur de la colonne "A".

D'où vient se problème?

Merci!
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
7 nov. 2016 à 21:59
VBA n'est pas mon fort, je ne sais pas.
Il faudra attendre qu'un autre jette un oeil.
0
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 1 > Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024
8 nov. 2016 à 13:53
Ok, merci beaucoup!!
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
8 nov. 2016 à 15:29
CurrentRegion est un Range, alors j'ai essayé ça
DerniereLigne = Range("C:C").End(xlDown).Row
et ça marche avec mon tableau de test
0
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 1 > Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024
8 nov. 2016 à 17:05
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!
0
Kalissi Messages postés 218 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 15 juillet 2019 20
8 nov. 2016 à 22:23
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
0