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
A voir également:
Function de renvoie d'une plage de donnée multi segment.
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 )
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
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
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
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!
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
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.
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
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: