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 :

Distinguer le nombre de plages non contiguës dans une feuille


Sujet :

Macros et VBA Excel

  1. #61
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    non je ne l'ai pas raté mais partout ailleurs sauf une seul fois il est dit le contraire

    pris sur Msdn
    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
    Paramètres
    TypeType: Microsoft.Office.Interop.Excel.XlCellType
    Requis XlCellType . Les cellules à inclure. Peut être l'un des suivants XlCellType constantes:
    •
    xlCellTypeAllFormatConditions . Les cellules de ne importe quel format.
    •
    xlCellTypeAllValidation . Cellules ayant les critères de validation.
    •
    xlCellTypeBlanks . Les cellules vides.
    •
    xlCellTypeComments . Les cellules contenant des notes.
    •
    xlCellTypeConstants . Les cellules contenant des constantes.
    •
    xlCellTypeFormulas . Les cellules contenant des formules.
    •
    xlCellTypeLastCell . La dernière cellule de la plage utilisée.
    •
    xlCellTypeSameFormatConditions . Les cellules ayant le même format.
    •
    xlCellTypeSameValidation . Les cellules ayant les mêmes critères de validation.
    •
    xlCellTypeVisible . Toutes les cellules visibles.
    ValeurType: System.Object
    Facultatif objet . Si type est soit xlCellTypeConstants ou xlCellTypeFormulas , cet argument est utilisé pour déterminer quels types de cellules à inclure dans le 
    
    résultat. Ces valeurs peuvent être additionnées pour retourner plus d'un type. La valeur par défaut est de sélectionner toutes les constantes ou des formules, quel
    
     que soit le type. Peut être l'un des suivants XlSpecialCellsValue constantes:
    
    xlErrors
    •
    xlLogical
    •
    xlNumbers
    •
    xlTextValues
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  2. #62
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    Oui.
    Tu vois bien que c'est dans le 1er paramètre que tu choisis XlCellType avec xlCellTypeConstants ou xlCellTypeFormulas (ou ...).
    Et que si tu choisis un de ces 2 là tu peux compléter avec le type de résultat voulu dans XlSpecialCellsValue.
    Si tu prends xlCellTypeConstants avec xlErrors+xlLogicalxlNumbers+xlNumbers+xlTextValues tu prends toutes les constantes (comme avec le 2nd paramètre absent) mais ils ne te disent pas que ça changera ou étendra le 1er paramètre qui reste xlCellTypeConstants.
    Tu récupères les constantes valeurs d'erreur, booléennes, numériques et textes.

    eric

  3. #63
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Bonjour,
    Patrick : pas de soucis de mon côté concernant ton test avec la propriété HasFormula qui fait effectivement le travail.

    Concernant ta proposition et si je mets de côté l'intérêt d'utiliser un dictionnaire dans ce cas précis, prévoir dans ta procédure le cas :
    - où la feuille est vide
    - où la feuille ne comporte que des formules
    sinon cela plante.

    J'essayerai de tester plus avant plus tard mais a priori, excepté les 2 cas cités mes 1er tests n'ont pas révélé de dysfonctionnement.
    A+
    David

  4. #64
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour Davido

    Concernant ta proposition et si je mets de côté l'intérêt d'utiliser un dictionnaire dans ce cas précis
    je vois que tu n'a toujours pas compris ma démarche

    le dico evite de devoir passer par une double boucle sur les cells qui peut être long en cas de grande plage a traiter


    1 speciallcell +xltype me donne la plage:on obtiens un string
    2 split le string 'beaucoup moins long puisque les plage contiguës donnent dans le srting (lettre X:lettre et X) sauf quelques unes isolées qui donnent (lettre:XY)
    3 boucle sur string
    si une plage de 200 cells plage contient 10 régions par exemple la boucle sur le range .address tourne 10 fois (sur 10 portion du string )
    4 teste dico sur région et inscription vrai région contiguë et currentregion

    5 boucle sur dico 10 régions donc 10 tours et la dans cette boucle je renseigne mon object et ses propriété (propert)

    si on passe par les cells on boucle sur le nombre de cells que contient lea plage précisée en paramètre + X fois sur les régions déjà ciblées

    ou dans le cadre de la boucle sur les cellules.value2=vbnullstring :boucle sur 200 cells et on obtiens le range(reel cell sutilisées) et c'est tout ce que je fait avec specialcell et xlpye

    Maintenant si tu vois toujours pas l'intérêt je ne sais plus quoi dire
    ma méthode est peu orthodoxe c'est vrai mais elle a l'avantage de donner un résultat exact (région contiguës)ce qui n'est pas le cas des autres proposition puisqu'elles donnent le currentregion

    et puis pourquoi parler de ce qui est ortodoxe ou pas puisque l'on parle de créer une fonction qui n'existe pas
    ces object étant des object range même si je traite la plage en string

    en gros et pour faire simple
    ma boucle dico donne
    1 la plage contigu
    2 le current region de la plage contiguë
    3 le count des régions contigues
    4 le range exact utilisé (sans les cellules blanches )
    je ne sais plus quoi dire pour te convaincre
    et vu la structure de mon code
    il serait facile d'ajouter des (propert)dans la déclaration des type
    et dans la boucle sur string et comparaison dico renseigner ces nouveaux éléments
    mafeuilleUsedRange.aeraformuleincells(X)' te donnerait si la plage contigues (X) contient ou pas des formules
    enfin bref on pourrait ajouter plein de truc dans ce genre et on aurait même pas a modifier la structure de base du code; je l'ai conçu comme ca pour cette raison

    citation de la question initiale de Philipe
    Bonjour,
    Lorsque l'on détermine une plage non contiguë comme par exemple shtDb_2.Range("A1:H8,I12:K19"), il est possible de parcourir ces plages grâce à la collection Areas.
    Ce que je cherche désespérément mais sans être certain que cela soit possible, c'est de pouvoir déterminer les plages non contiguës en me basant sur la propriété UsedRange
    Dans mon exemple, lorsque j'écris ShtDb_2.UsedRange j'obtiens comme adresse bien entendu $A$1:$K$19. Ce que je souhaiterais c'est obtenir $A$1:$H$8,$I$12:$K$19

    $A$1:$K$19 currentregion voir meme le usedrange

    $A$1:$H$8,$I$12:$K$19 region contigues

    Pour finir si tu trouve un moyen de faire ce que ma fonction fait en une seule boucle mais sur les cells je suis preneur :je risque d'attendre longtemps
    c'est plus clair??
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #65
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour Patrick,
    le dico evite de devoir passer par une double boucle sur les cells qui peut être long en cas de grande plage a traiter
    Je te donne raison sur ce point, le dico ou l'emploie d'une collection fait gagner une boucle mais le résultat final sera identique.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #66
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour Phillippe

    oui ce point on est d'accords on pourra toujours y arriver avec une double voir triple boucle imbriquées ou successives

    mais je prend le paramètre du temps d'exécution en compte surtout dans ce cas ou on pourrait être amenés a traiter une plage assez grande


    Bonjour Davido:
    Concernant ta proposition et si je mets de côté l'intérêt d'utiliser un dictionnaire dans ce cas précis, prévoir dans ta procédure le cas :
    - où la feuille est vide
    - où la feuille ne comporte que des formules
    sinon cela plante.
    ne cherche pas c'est réglé
    change la partie with plage pour celle ci:
    et au cas ou le case else ne remplirait pas sa fonction on débloque la ligne "If isNull"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     With plage
            If plage.Rows.count <= 1 Then MsgBox "La feuille " & plage.Parent.Name & " est  vide": Exit Function
            Select Case plage.HasFormula
            Case True: Set rngUsed = .SpecialCells(xlCellTypeFormulas)
            Case False: Set rngUsed = .SpecialCells(xlCellTypeConstants)
            Case Else: Set rngUsed = Union(.SpecialCells(xlCellTypeConstants), .SpecialCells(xlCellTypeFormulas))
            End Select
            'If IsNull(plage.HasFormula) Or plage.HasFormula = True Then Set rngUsed = Union(.SpecialCells(xlCellTypeConstants), .SpecialCells(xlCellTypeFormulas))
        End With
    luky luke l'homme qui code plus vite que son clavier
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #67
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Re

    Ok Patrick mais as-tu vraiment besoin de faire cela ?
    Si le but est de récupérer soit les plages contiguës sans les cellules vides, soit les différents CurrentRegion du UsedRange tu peux les avoir via une boucle dès la sortie de la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    With plage      
          Set rngUsed = .SpecialCells(xlCellTypeConstants)
          If IsNull(plage.HasFormula) Or plage.HasFormula = True Then Set rngUsed =    Union(rngUsed, .SpecialCells(xlCellTypeFormulas))
    End With
    Si tu veux récupérer les plages contiguës sans les cellules vides :
    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
     
         With plage      
           Set rngUsed = .SpecialCells(xlCellTypeConstants)
           If IsNull(plage.HasFormula) Or plage.HasFormula = True Then Set rngUsed =    Union(rngUsed, .SpecialCells(xlCellTypeFormulas))
        End With
     
        For i = 1 To rngUsed.Areas.count
          If region Is Nothing Then
            Set region = rngUsed.Areas.Item(i)
            Debug.Print region.Address
          Else
            Set region = Union(region, rngUsed.Areas.Item(i))
            Debug.Print region.Address
          End If
        Next i
    Si tu veux récupérer les différents CurrentRegion
    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
     
           With plage      
               Set rngUsed = .SpecialCells(xlCellTypeConstants)
               If IsNull(plage.HasFormula) Or plage.HasFormula = True Then Set rngUsed =    Union(rngUsed, .SpecialCells(xlCellTypeFormulas))
        End With
     
        For i = 1 To rngUsed.Areas.count
          If region Is Nothing Then
            Set region = rngUsed.Areas.Item(i).CurrentRegion
            Debug.Print region.Address
          Else
            Set region = Union(region, rngUsed.Areas.Item(i).CurrentRegion)
            Debug.Print region.Address
          End If
        Next i
    Cette boucle te les ramène non (regarde le contenu que te ramène les Debug.Print au fur et à mesure du déroulement de la macro) ?
    Donc qu'est-ce que t'apporte le fait de passer par un dictionnaire ?
    Cela ne te fait-il pas faire un traitement en plus pour récupérer quelque chose que tu as déjà ?

    A+

  8. #68
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re Davido
    tu la voit la ligne jaune ?

    message:
    object requis
    Pièce jointe 173274
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #69
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Oui je la vois et où est le problème ?
    Tu veux dire que tu n'utilises un dictionnaire que dans le seul but d'éviter cette condition ?
    A+

  10. #70
    Invité
    Invité(e)
    Par défaut
    Bonjour Philippe,
    j'ai trouvé ça ça fonctionne apparemment j'ai rien vérifié!
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    Sub test()
    Dim a As Range
    Set a = UsedAreas(ActiveSheet.UsedRange)
    End Sub
    '#####################################################################
    'UsedAreas  : Function that returns only the used reagions in a range
    'If called without any arguments, it will return the used regions in
    'the ActiveSheet.
    '#####################################################################
    'Author     : Ejaz Ahmed
    'Email      : StrugglingToExcel@outlook.com
    'Date       : 15 June 2014
    'Website    : https://strugglingtoexcel.wordpress.com/
    '#####################################################################
    Function UsedAreas(Optional ByRef WhichRange As Range) _
        As Range
     
    'Declare Runction level Variables and Objects
    Dim ConstantsRange As Range 'Stores all the cells that have values
    Dim FormulaRange As Range 'Stores all the cells that have formula
    Dim UsedRange As Range 'Stores Used Area
    Dim ContentRange As Range 'Includes Used Area's CurrentRegion
    Dim EachArea As Range 'Used in the Loop
     
    'If the user did not pass any range to the function, use the
    'sheet's used range.
    If WhichRange Is Nothing Then
        Set WhichRange = Application.ActiveSheet.UsedRange
    End If
     
    'The SpecialCells Method includes the entire sheet's UsedRange
    'if called from a single cell. So only proceed if the user selected
    'more than one cell
    If WhichRange.Count > 1 Then
        'Ignore the errors produced if there are no cells with Formula
        'or Constants
        On Error Resume Next
        Set ConstantsRange = WhichRange.SpecialCells(xlCellTypeConstants)
        Set FormulaRange = WhichRange.SpecialCells(xlCellTypeFormulas)
        Err.Clear
        On Error GoTo 0
     
        'Combine both the Ranges together
        If Not ConstantsRange Is Nothing Then
            Set UsedRange = ConstantsRange
        End If
     
        If Not FormulaRange Is Nothing Then
            If UsedRange Is Nothing Then
                Set UsedRange = FormulaRange
            Else
                Set UsedRange = Application.Union( _
                    UsedRange, FormulaRange)
            End If
        End If
     
        'We dont need these ranges anymore, forget them to save memory
        Set FormulaRange = Nothing
        Set ContentRange = Nothing
     
        'We already have all the cells that have stuff in them, but there
        'may be blank cells that are actually part of a table, but do not
        'contain data. Therefore, we loop through the areas and include the
        'current regions
        If Not UsedRange Is Nothing Then
            'Set the Final Range to the first Area, so we dont have to check
            'if it is not empty later in the loop
            Set ContentRange = UsedRange.Cells(1, 1).CurrentRegion
            For Each EachArea In UsedRange.Areas
                'Check if the Area is already in the Final Range
                If Application.Intersect(EachArea, ContentRange) _
                    Is Nothing Then
                    'Include its current region if it is not already in the
                    'final range
                    Set ContentRange = Application.Union( _
                        ContentRange, EachArea.CurrentRegion)
                End If
            Next EachArea
        End If
    End If
     
    'If the selection had used areas, return it, or
    'just return the Range that was passed to the function
    If ContentRange Is Nothing Then
        Set UsedAreas = WhichRange
    Else
        Set UsedAreas = ContentRange
    End If
     
    End Function

  11. #71
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Re
    non ca nest pas ca

    la macro plante tout bonnement pourtant région est bien nothing au départ mais chez moi j'ai le message object requis

    en fait c'est comme si je demandais a la macro de faire
    si le (truc je sais pas quoi) exist ou pas then

    hors si moi je le sais pas la macro le sera pas a ma place
    en tout cas c'est comme ca que la fonction se comporte sinon ca serait trop facile
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  12. #72
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    Re
    non ca nest pas ca

    la macro plante tout bonnement pourtant région est bien nothing au départ mais chez moi j'ai le message object requis

    en fait c'est comme si je demandais a la macro de faire
    si le (truc je sais pas quoi) exist ou pas then

    hors si moi je le sais pas la macro le sera pas a ma place
    en tout cas c'est comme ca que la fonction se comporte sinon ca serait trop facile
    Bon, et comme cela tu as bien toutes les plages, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Set region = rngUsed.Areas.Item(1)    
        Debug.Print region.Address
     
        If rngUsed.Areas.count > 1 Then
          For i = 2 To rngUsed.Areas.count
            Set region = Union(region, rngUsed.Areas.Item(i))
            Debug.Print region.Address
          Next i
        End If
    A+

  13. #73
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    le dico evite de devoir passer par une double boucle sur les cells
    Dans ma proposition #42 et la dernière de David tu n'as qu'une seule boucle qui est sur les areas.
    Ta proposition est intéressante pour l'exercice par lui-même, ou si beaucoup d'areas. Au niveau pratique, s'il y a 10 ou 20 areas, l’intérêt de gagner 0.1s pour une proc lancée peut-être 1 ou 2 fois par ouverture est tout relatif.

    eric

  14. #74
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Re

    Bon j'ai quand meme trouver le moyen en une seule boucle de teterminer le current region et lecellUsed de cette region ce que philipe demandais au depart
    finalement on était pas loin
    le principe
    comme Davido l'a proposé on boucle sur le sheet(X).usedrange.Areas.count

    avec specialcells on elimnine les indésirables ca on va pas y revenir c'est bouclé

    et a chaque item des aeras on compare le currentregion a oldregion(variable de stype string)
    si le currentregion et different alors la on rigole (c'est pour ca que je disais qu'on était pas loin)
    je repasse cette region a la moulinette de specialcells
    on obtiens ainsi la réelle region contigues de cellulle utilisées

    en une seul boucle


    y fallait y penser quand même hein!!!
    code de la fonction
    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
    Sub testfonction1()
    fonctiontest1 ActiveSheet.UsedRange
    End Sub
    Function fonctiontest1(plage)
     Dim oldregion As String, RngUsed As Range, aerat As Range, contigu As Range
      With plage
           Set RngUsed = .SpecialCells(xlCellTypeConstants)
           If IsNull(plage.HasFormula) Or plage.HasFormula = True Then Set RngUsed = Union(RngUsed, .SpecialCells(xlCellTypeFormulas))
        End With
        For i = 1 To RngUsed.Areas.count
         Set aerat = RngUsed.Areas(i).CurrentRegion
               If aerat.HasFormula = False Then Set contigu = aerat.SpecialCells(xlCellTypeConstants)
           If IsNull(aerat.HasFormula) Or aerat.HasFormula = True Then Set contigu = aerat.SpecialCells(xlCellTypeFormulas)
            If contigu.CurrentRegion.Address <> oldregion Then
           Debug.Print "cellules contigues utilisée= " & contigu.Address & "   et sa currentregion est  " & contigu.CurrentRegion.Address
        oldregion = contigu.CurrentRegion.Address
        End If
        Next i
    End Function
    ouais fallait vraiment y penser
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  15. #75
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re adaptation a ma pseudoclasse (propert)
    Re et voila maintenant on adapte a mon principe de pseudoclasse (propert)
    voila la fonction
    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
    Type propert
        aeraByContigu(1 To 1000) As Range
        aeraAllSUsedcells As Range
        aeraByCuRegion(1 To 1000) As Range
    End Type
    Public maFeuilleUsedRange As propert
     
    Function maFeuilleaeracount(Optional plage As Range) As Long
        Dim oldregion As String, RngUsed As Range, aerat As Range, contigu As Range, NBit As Long, i As Long, OK As Boolean
    OK = plage Is Nothing = False: Set plage = IIf(OK, plage, ActiveSheet.UsedRange)
     
        With plage
            Set RngUsed = .SpecialCells(xlCellTypeConstants)
            If IsNull(plage.HasFormula) Or plage.HasFormula = True Then Set RngUsed = Union(RngUsed, .SpecialCells(xlCellTypeFormulas))
        End With
        Set maFeuilleUsedRange.aeraAllSUsedcells = RngUsed
        For i = 1 To RngUsed.Areas.count
            Set aerat = RngUsed.Areas(i).CurrentRegion
            If aerat.HasFormula = False Then Set contigu = aerat.SpecialCells(xlCellTypeConstants)
            If IsNull(aerat.HasFormula) Or aerat.HasFormula = True Then Set contigu = aerat.SpecialCells(xlCellTypeFormulas)
            If contigu.CurrentRegion.Address <> oldregion Then
                NBit = NBit + 1
                Set maFeuilleUsedRange.aeraByContigu(NBit) = contigu
                Set maFeuilleUsedRange.aeraByCuRegion(NBit) = aerat.CurrentRegion
                'Debug.Print "cellules contigues utilisée= " & contigu.Address & "   et sa currentregion est  " & contigu.CurrentRegion.Address
                oldregion = contigu.CurrentRegion.Address
            End If
        Next i
        maFeuilleaeracount = NBit
    End Function
    et voila un exemple de comment s'en servir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub testfonction1()
       Dim nb, i As Long
       nb = maFeuilleaeracount
    For i = 1 To nb
    Debug.Print maFeuilleUsedRange.aeraByContigu(i).Address
    Next
    End Sub
    résultat dans le debug:
    $D$11:$D$13
    $J$13,$I$12:$I$14,$K$13:$K$16
    $C$20:$C$21,$B$22:$C$24
    $F$25:$F$27,$G$25:$G$28
    vous préférez celle la???????
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  16. #76
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re petit souci encore avec next version
    Re
    quelqu'un saurait comment tester le .SpecialCells(xlCellTypeConstants) de la même manière que hasformula
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  17. #77
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function GetConstants(Rg As Range) As Range
             On Error Resume Next
         Set GetConstants = Rg.SpecialCells(xlCellTypeConstants)
    End Function
     
     
    Sub Test()
        Dim Rc As Range
        Set Rc = GetConstants(ActiveSheet.UsedRange)
        If Rc Is Nothing Then Beep
        Set Rc = Nothing
    End Sub
    Voir aussi cette autre fonction
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  18. #78
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    @Marc-L
    Un Set d'oublié dans la fonction
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  19. #79
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    Bonjour MarcL et Mercatog

    donc non elle n'existe pas a par le test nothing
    Merci

    une dernière question concernant ce sujet

    quand je liste le currentregion d'un .usedrange.areas.count et que je tombe sur une cellule orpheline (toute seule rien autour)
    le currentregion me donne la précédente areas(X).currentregion

    est ce normal ???? non mais quelle en est la raison ?
    exemple ici
    pour D12 = currentregion =d7:f8
    Pièce jointe 173492
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  20. #80
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Citation Envoyé par mercatog Voir le message
    @Marc-L
    Un Set d'oublié dans la fonction

    Merci ‼ J'avais "testé" avec une feuille vide …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/08/2014, 18h25
  2. [XL-2003] calcule le nombre de ligne non vide dans une colonne donnée
    Par aefmaaradji dans le forum Excel
    Réponses: 2
    Dernier message: 27/07/2010, 15h08
  3. nombre d'argument non specifie dans une fonction
    Par elmcherqui dans le forum C++
    Réponses: 2
    Dernier message: 27/05/2008, 18h10
  4. Réponses: 5
    Dernier message: 22/02/2008, 19h34
  5. nombre de valeurs non nulles dans une tables
    Par 080983 dans le forum SQL
    Réponses: 33
    Dernier message: 27/08/2007, 12h04

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