Function de renvoie d'une plage de donnée multi segment.

alex1256 Messages postés 10 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 23 mai 2012 - 22 mai 2012 à 11:19
alex1256 Messages postés 10 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 23 mai 2012 - 23 mai 2012 à 14:21
Bonjour à tous,

comme énoncé, je cherche à crée une function qui renvoie une plage de donnée à plusieurs segments de la sorte: Range([C30:C44], [C53:C57],...)
Tout ca en fonction de la couleur des cellules d'une colonne qui peux varier.
Voir dans l'exemple du fichier ci dessous pour mieux comprendre:
Classeur1.
Je souhaiterais l'utiliser dans une autre fonction pour que mon fichier ne soit pas figé niveau plage et dimension pour les traitement en avale.

Mon algo se presente sous la forme suivant, j'espere qu'il est clair:

fonction RangUnit()
set PlageTraitement = range(A0:A65665);
couleur_de_ref = 38;
rangeTemp=NULL as range;
DebutTemp=NULL;
FinTemp=NULL;

for each cellule in range PlageTraitement
 if cellule.colorIndex == color ref
  if DebutTemp ==Null
   DebutTemp = cellule.adresse; (renvoi l'adresse de la cellule A3,A5 A675...)
  End if
 if cellule.colorIndex==Cellule-1.colorIdex
  FinTemp=cellule.adresse;
 else if rangeTemps==NULL{
RangeTemp=range(DebutTemp:FinTemp)
DebutTemp=FinTemp=NULL
 else RangeTemp=Range(RangeTemp,Range(DebutTemp:FinTemp))
end if 
next cellule
end fonction


Je voudrais savoir si cette algo est viable est faisable, et si c'est la bonne façon de procéder.

Je vous remercie d'avance pour votre aide.

Alex

10 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 mai 2012 à 12:17
Salut

La syntaxe est un peu singulière.
Ce n'est pas du VBA.
En VBA, je t'aurai dit de correctement déclarer ta fonction, comme ceci :
Function RangUnit() As Range
mais comme le nom du mot "fonction" n'est déjà pas le bon, inutile de penser à ce que ça corrige le problème.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
alex1256 Messages postés 10 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 23 mai 2012
22 mai 2012 à 13:44
Le code exposé était plus à titre informatif en tant qu'algo qu'en tant que code VBA.
La vrai question est au bas de mon 1er post ou j'ajouterais que si il y a une façon plus robuste et/ou plus propre de faire avant que je me lance dans le code je suis open.

ps:Je sais très bien que la syntaxe et plus que singulière comme tu dis (mixte entre algo et code )
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 mai 2012 à 16:59
Bonjour,
Je n'ai pas ouvert ta pièce jointe (des raisons, notamment de sécurité, font que jue n'ouvre jamais un classeur dont je ne suis pas l'auteur).
La lecture de tes explications me conduit tout simplement à ouvrir ton aide VBA sur le mot : Application.Union (méthode). La seule lecture de cette rubrique me parait largement suffisante.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
alex1256 Messages postés 10 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 23 mai 2012
23 mai 2012 à 09:53
Hey,

Comme je le pensais, mon algo est plus au moins au point. J'ai codé comme je le pensais, mon code fonctionne. Je vous met le code ici:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  MsgBox UnitsRange.Address
End Sub
Function UnitsRange() As Range

Dim Plage As Range, Cellule As Range, RangeTemp As Range
Dim Couleur_de_ref As Integer, Cellule_1 As Integer
Dim DebutTemp As Variant
Dim FinTemp As Variant
Set Plage = Range("A1:A157")
Couleur_de_ref = 38

For Each Cellule In Plage.Cells
    If Cellule.Interior.ColorIndex = 38 Then
        If DebutTemp = "" Then
            DebutTemp = Cellule.AddressLocal
        ElseIf Cellule.Interior.ColorIndex = Cellule_1 Then
            FinTemp = Cellule.Address
        ElseIf RangeTemp Is Nothing Then
        Set RangeTemp = Range(Range(DebutTemp), Range(FinTemp))
            MsgBox "La 1ere address: " & RangeTemp.Address
            
            DebutTemp = ""
            FinTemp = ""
        Else
            RangeTemp = Union(RangeTemp, Range(DebutTemp, FinTemp))
            MsgBox DebutTemp + FinTemp
            DebutTemp = ""
            FinTemp = ""
            
        End If
    End If
    Cellule_1 = Cellule.Interior.ColorIndex
    'MsgBox "Debut" & DebutTemp & "Fin" & FinTemp & "cellule-1" & Cellule_1
    
Next Cellule
MsgBox "Le range final:" & RangeTemp.Address
Set UnitsRange = RangeTemp
Range("H6").Value = RangeTemp.Address

End Function


Pour info suplémentaire, je vais utiliser cette fonction à la place du range dans un
If Not Intersect(Range([B22:B29], [B46:B52]), Target) Is Nothing And Target.Count = 1 Then

Qui est pour l'instant ici juste activé au click droit.

Ps: Si vous pouvez me dire si c'est pas trop mal codé? Ca fait pas longtemps que j'apprend ce langage. merci

Alex
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 mai 2012 à 10:11
Si vous pouvez me dire si c'est pas trop mal codé

Ma réponse est : très vraisemblablement mal codé. Sans même connaître tous les tenants et aboutissants.
Déjà, cette ligne :
ElseIf Cellule.Interior.ColorIndex = Cellule_1 Then

alors que rien ne peut garantir que l'on n'entre pas d'entrée de jeu dans ce cas elseif sans que cellule_1 n'ait donc encore reçu une valeur.
Mais ce n'est pas tout, loin de là !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
alex1256 Messages postés 10 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 23 mai 2012
23 mai 2012 à 10:35
Merci de ta réponse.
Je me suis aussi rendu compte après différent test que ca ne fonctionnait pas parfaitement. Le 1er range il le detecte avec exactitude mais quand j'il arrive au 2nd, 3eme et plus, il zape à chaque fois la 1ere ligne du range (je n'ai pas encore reussi à résoudre ce problème). Ce qui confirme probablement ce que tu dit!

Si vous avez des idées pour rendre mon code plus robuste je suis ouvert à toute proposition!

Alex
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 mai 2012 à 11:02
Si vous avez des idées pour rendre mon code plus robuste je suis ouvert à toute proposition!

Il faudrait pour cela connaître parfaitement tes tenants et aboutissants. Un exposé clair et très précis (technique et sans "phrasages")
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
alex1256 Messages postés 10 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 23 mai 2012
23 mai 2012 à 11:21
Je vais essayé de faire le plus clair possible, j'avais pas pensé que tu n'ouvrirais pas mon doc pour comprendre mes attentes plus rapidement.

Mon doc se presente comme cela:

Equipement1
Unité -
-
-
Connectique
-
-
-
-
-
Equipement2
Unité -
-
-
-
-
Connectique
-
-

Ect...
Tout ses equipements on un catalogue commun en fonction du type (unité ou connectique).
Mon but et donc de chercher la plage pour les unités d'une part et des connectiques de l'autre (sachant que la plage est variable) pour rendre mon tableau non figé et ouvert au modification si on ajoute une ou plusieurs unité, equipement ect...
Tout est déjà en place niveau validation, liste au niveau des macro.
J'ai donc pensé chercher ses différentes plage en définissant une couleur pour chaque type (connectique et unité), ce qui me parait le plus simple à mon goût.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 mai 2012 à 11:48
C'est déjà un peu (pas très) plus clair.
Avec ce "peu" là, toutefois, il m'est possible de t'orienter vers une conception assez différente et nettement plus adaptée que tes "couleurs".
Je vais te donner une piste :
Lorsque tu nommes une plage (plage nommée) :
- toute insertion dans cette plage fait qu'elle s'étend spontanément
- comme toute plage, une plage nommée a une adresse, etc ...
Je te laisse penser sur ces bases.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
alex1256 Messages postés 10 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 23 mai 2012
23 mai 2012 à 14:21
Merci, c'est à vrai dire, meilleur et plus efficase que mon idée de départ et j'y avais déjà songé.
Ca marche parfaitement sauf quand on ajoute une ligne à la fin de la plage, il me faut l'ajouté au mieux entre la dernière et celle d'avant.

Si je pars sur cette solution ci (qui fonctionne sans problème), il faudrait que je crée une macro qui, quand je remplisse la derniere ligne, en ajoute une entre les 2 derniere et copie la derniere dans celle au dessus. (J'avais vu il y a longtemps un document qui s'adapté automatiquement quand on remplissait la derniere ligne, il en ajoutait une en adaptant le range (mais je ne retrouve plus))
Par contre je ne sais comment procéder quand on a un range multiple
Mon doc est ainsi:
0
Rejoignez-nous