Grouper des zones de cellules disjointes

Bonjour,

Je souhaite créer une fonction qui prend comme paramètre un ensemble de cellules (par exemple : "A1:A3;B4;A12:A17") où chaque zone peut contenir une ou plusieurs cellules. Ensuite ma fonction doit agir sur chacune des cellules A1, A2, A3, B4, A12, ..., A17

Voici ce que j'ai fait :

Function test(gpe_plg)
    'gpe_plg contient par exemple "A1:A3;B4;A12:A17"
    Dim i As Integer 
    Dim strPlages() As String 
    Dim rangec As Range, ranged As Range

    strPlages = Split(gpe_plg, ";") 'tableau de chaines
    For i = LBound(strPlages) To UBound(strPlages)
        Set ranged = Worksheets("Diplômes").Range(strPlages(i))
        Set rangec = Union(rangec, ranged) 'regroupement de plages
    Next i
    'Action sur chaque cellule
    For Each cellule In rangec
        If cellule.Value = 1 Then
            '...
        End If
    Next
End Function

Pour l'instant, tous mes essais se soldent par un #valeur! ou autre.

Si quelqu'un pouvait m'aider un peu ... avant de ne plus avoir d'ongles, ce serait sympa.

Michel

Hello,

Voici un exemple :

Public Function RemplissagePlage(strPlage As String)
    Dim rngTmp As Range, rngCellules As Range
    Set rngTmp = Range(strPlage)
    For Each rngCellules In rngTmp
        rngCellules.Value = 2
    Next rngCellules
End Function
RemplissagePlage("a1:a3,b4,c5:c8")

Une réponse aussi rapide ... génial !

Problème j'ai fait un copié/collé de ce code sans rien changer.
Dans une feuille vide, je choisis la cellule A1, je saisis =RemplissagePlage(
puis je sélectionne à la souris la zone A5:A7, je ferme la parenthèse, je valide et j'obtiens #VALEUR!

Dans le doute je rajoute an 1ère ligne de la fonction MsgBox "Ok"

Le message "Ok" s'affiche bien puis #VALEUR!

je précise, avec le debugeur, l'erreur apparait à l'exécution de la ligne

rngCellules.Value = 2

Hello,

Que veux tu faire exactement avec la plage sélectionnée ?

J'ai sans soute mal posé ma question. Dans la mesure où le paramètre est une ou plusieurs plages de cellules sélectionnées à la souris, ce ne doit pas être une chaîne de caractères. J'ai modifié ainsi le code :

Public Function RemplissagePlage(rngPlage As Range)
    Dim rngCellules As Range
    n = 0
    For Each rngCellules In rngPlage
        If rngCellules.Value = 2 Then
            n = n + 1
        End If
    Next rngCellules
    RemplissagePlage = n
End Function

Avec la zone A5:A10 ça fonctionne j'obtiens bien le nombre de 2 présents dans cette zone

Par contre si je saisis A5:A10;B6:B8 à la souris, j'ai toujours la même erreur #VALEUR!

Pour chaque cellule, j'ai besoin de récuperer le nombre de valeurs distinctes présentes dans la 1ère ligne.

Exemple : Dans la sélection "A8:C8;H8;Z8:AB8", il y a des VRAI /FAUX. Je ne m'interesse qu'à celle qui contiennent un VRAI. Ma fonction doit renvoyer le connaître le nombre de valeurs distinctes présentes dans les cellules A1, B1, C1, H1, Z1, AA1, AB1 (je suppose qu'il y a un VRAI en A8, en B8, ...)

Pour l'instant, cela fonctionne avec un seul ensemble de valeurs situées les une à côté des autres, voilà mon code :

Function nbUvDistinctsObtenus(plageCellules As Range)
    Dim cellule As Range
    'Dim cellNomUv As Range
    d = ""
    nbUv = 0
    nomuv = ""

    For Each cellule In plageCellules
        If cellule.Value = 1 Then
            ' il a un VRAI
            Set nomuv = Worksheets("Diplome").Cells(1, cellule.Column)
            If InStr(d, nomuv) = FAUX Then
                d = nomuv + d
                nbUv = nbUv + 1
            End If
        End If
    Next
    nbUvDistinctsObtenus = nbUv
End Function

La ligne 1 contient des noms d'UV qui peuvent se répéter, la colonne 1 contient des noms d'étudiants, et à l'intersection il y a des VRAI/FAUX selon que l'UV est acquis ou pas.

peux tu envoyer un fichier exemple avec le résultat souhaité stp ?

Malheureusement non, je ne peux diffuser le fichier car il est bourré de données personnelles et cela va être trop compliqué d'isoler une feuille des autres car la feuille qui m'intéresse prend ses données dans d'autres ...

Finalement, j'en ai refait un simplifié en fichier joint, tout se passe dans la colonne J

3test.xlsm (8.83 Ko)

Hello,

Voici

3test-3.xlsm (18.10 Ko)

Génial, j'ai appris plein de trucs, je ne connaissais pas : ParamArray varSelection() As Variant ...

et je crois que c'était ça le hic.

Merci beaucoup

Hello,

ParamArray permet de passer en paramètre une ou plusieurs valeurs, et ensuite, il permet de parcourir une à une ces valeurs.

Dans notre cas, les valeurs sont les plages

Rechercher des sujets similaires à "grouper zones disjointes"