IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Pb de SpecialCells combinées [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut Pb de SpecialCells combinées
    Bonjour à tous,

    Je fais suite à une discussion menée conjointement avec Menhir.

    Le but était de parcourir un Range SpeciallCells, ici sur 1 colonne, depuis sa dernière cellule.

    Celle-ci peut s'obtenir par ailleurs en considérant la chaine de caractères de son adresse.
    C'est la "ruse" que j'ai adoptée.

    Mais.

    Ma 1ère idée était donc de combiner 2 retours de cellules spéciales.

    SpecialCells(lignes vides).SpcialCells(la dernière cellule)
    Le résultat retourné est faux.

    Ma question est de savoir pourquoi.

    Merci par avance pour vos retours.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    Sub remplit_vides()
     
    Dim lastrow As Long
    Dim rngspéc As Range
    Dim premspéc_row As Integer
    Dim dernspéc_row As Integer
    Dim i As Integer
     
    Dim lacolonne As String
    lacolonne = "C"
     
    Application.ScreenUpdating = False
     
    With Worksheets("LAFEUILLE")
     
            lastrow = .Cells(.Rows.Count, 2).End(xlUp).Row
     
            With .Range(lacolonne & "3:" & lacolonne & lastrow)
     
                    On Error Resume Next
                    Set rngspéc = .SpecialCells(xlCellTypeBlanks)
                    On Error GoTo 0
     
                    If rngspéc Is Nothing Then GoTo lend_de_lasub
     
                    Debug.Print rngspéc.Address
                    premspéc_row = rngspéc.Cells(1, 1).Row
                    Debug.Print premspéc_row
     
                    'Ne fonctionne pas!?
                    dernspéc_row = rngspéc.SpecialCells(xlCellTypeLastCell).Row
                    Debug.Print dernspéc_row
     
                    With rngspéc
                            dernspéc_row = Right(.Address, Len(.Address) - InStrRev(.Address, "$"))
                    End With
                    Debug.Print dernspéc_row
     
     
            End With
     
     
            For i = dernspéc_row To premspéc_row Step -1
     
                    If Not (Intersect(rngspéc, .Cells(i, 3)) Is Nothing) Then
     
                            With .Cells(i, 3)
                                Debug.Print .Address
                                .Value = .Offset(1, 0).Value
                            End With
     
                    End If
     
            Next i
     
    lend_de_lasub:
     
            Set rngspéc = Nothing
     
    End With
     
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    je te rappelle que la constante xlCellTypeLastCell concerne non pas la dernière cellule d'une plage spécifiée, mais celle du UsedRange

  3. #3
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Sur un exemple

    B4, B5 informées
    B6 Vide
    B7 informées
    B8 vide
    B9 informée

    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print Worksheets(1).Range("B4:B7").SpecialCells(xlCellTypeBlanks).Address
    retourne
    $B$6
    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print Worksheets(1).Range("B4:B9").SpecialCells(xlCellTypeBlanks).Address
    retourne bien
    $B$6,$B$8
    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print Worksheets(1).Range("B4:B9").SpecialCells(xlCellTypeBlanks).SpecialCells(xlCellTypeLastCell).Address
    retourne
    B9
    Pour ma part, je m'attendais à
    B8
    .
    Ce qui signifie que la 2ème méthode SpecialCells(xlCellTypeLastCell) rend la 1ère inefficace.

    Et c'est cela qui m'étonne.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    la constante xlCellTypeBlanks de "SpecialCells()" retourne un plage de cellules vides (contiguës ou pas) donc, si tu appliques une recherche de dernière cellule utilisée (xlCellTypeLastCell) ça ne peut rien donné de concluant puisque la plage retournée avec xlCellTypeBlanks n'est justement pas utilisée !
    Une piste (il y a sûrement mieux) pour trouver la ligne de la dernière cellule vide de la plage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    Sub remplit_vides()
     
        Dim Plage As Range
        Dim DerPlage As String
        Dim DerCel As String
     
        Dim lastrow As Long
        Dim rngspéc As Range
        Dim premspéc_row As Integer
        Dim dernspéc_row As Integer
        Dim i As Integer
     
        With Worksheets("Feuil1")
     
            'en inversant le numéro de colonne 'ici, 3 et 2) la plage est définie
            'sur la dernière cellule non vide de la colonne 2
            Set Plage = .Range(.Cells(1, 3), .Cells(.Rows.Count, 2).End(xlUp))
     
            With Plage.Columns(2)
     
                On Error Resume Next
                Set rngspéc = .SpecialCells(xlCellTypeBlanks)
                If Err.Number <> 0 Then Exit Sub
                On Error GoTo 0
     
                premspéc_row = rngspéc.Cells(1, 1).Row
     
                'extrait la dernière plage
                DerPlage = Split(rngspéc.Address, ",")(UBound(Split(rngspéc.Address, ",")))
                'extrait la dernière cellule
                DerCel = Split(DerPlage, ":")(UBound(Split(DerPlage, ":")))
                'extrait le numéro de ligne
                dernspéc_row = Split(DerCel, "$")(2)
     
                Debug.Print "Première : " & premspéc_row; " --- Dernière : "; dernspéc_row
     
            End With
     
        End With
     
    End Sub

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    B4, B5 informées
    B6 Vide
    B7 informées
    B8 vide
    B9 informée
    Ta recherche de cellules vides c'est sur la colonne B ou C car dans ton premier code c'est la colonne C qui est visée

  6. #6
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut Thézé,

    J'ai juste voulu reporter un autre exemple dans mon post de réponse pour illustrer mon propos.
    Pas de problème.

    OK pigé.
    C'est ce que voulait signifier Unparia, je pense.

    OK pour ta méthode.
    Tu peux regarder la mienne.
    Nos deux méthodes ont en commun de traiter la chaine de caractères retournée par l'adresse.

    Merci à vous et Bon Week-End.

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour Marcel,

    OK pour ta méthode.
    Tu peux regarder la mienne.
    Nos deux méthodes ont en commun de traiter la chaine de caractères retournée par l'adresse.
    Je pensais que c'était ce que tu cherchais, j'ai juste donné une autre façon maintenant, il y a plus rapide pour avoir la première et dernière cellule vide d'un colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub Test()
     
        'première cellule vide de la colonne C
        MsgBox Cells(1, 3).End(xlDown).Row + 1
     
        'dernière cellule vide de la colonne C
        MsgBox Cells(Rows.Count, 3).End(xlUp).End(xlUp).Row - 1
     
    End Sub
    Il faut juste gérer l'absence de cellules vides et de valeurs !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] Combiner fonction d'agrégation et DISTINCT .
    Par p@radox dans le forum Langage SQL
    Réponses: 5
    Dernier message: 02/12/2004, 17h11
  2. [flux] héritage combiné d'ifstream et d'ofstream
    Par suizokukan dans le forum SL & STL
    Réponses: 5
    Dernier message: 08/11/2004, 17h09
  3. [langage] combiner s et tr ?
    Par schnecke dans le forum Langage
    Réponses: 2
    Dernier message: 06/10/2004, 13h46
  4. Combiner plusieurs textures avec couches alpha
    Par TibobiT dans le forum OpenGL
    Réponses: 2
    Dernier message: 01/05/2004, 15h20
  5. [VB6] Combiner 2 styles avec MSChart
    Par khany dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 29/04/2003, 09h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo