XL 2013 Recherche d'une plage de cellules dans une ligne ou une colonne

Daniel Desch

XLDnaute Nouveau
Bonjour à tous,

Je suis débutant sur les macros vba et je cherche à écrire une fonction qui pour une ligne ou une pour colonne me renvoie une plage de cellules contenant toutes des données numériques comprises entre 2 valeurs données (par exemple disons 12 et 15000 dans l'exemple ci-joint) :

La fonction doit retourner H5-O5 pour la ligne 5, G6-L6 pour la ligne 6, I7-J7 pour la ligne 7... et une plage vide (je ne sais pas si ça existe) pour la ligne 8
De même
La fonction doit retourner C10-C17 pour la colonne C, D13-D17 pour la colonne D, E18-E18 pour la colonne E... et une plage vide (je ne sais pas si ça existe) pour la colonne F


Vous remerciant par avance de vos avis éclairés

Cordialement

Daniel
 

Pièces jointes

  • Recherche d'une plage de cellules dans une ligne ou une colonne.xlsx
    8.4 KB · Affichages: 21
Dernière édition:

Daniel Desch

XLDnaute Nouveau
Bonsoir,

Ce sujet n'a pas pour le moment trouvé réponse. Pourtant je pense que cela doit être assez facile de retourner le premier groupe de cellules répondant à un critère bien précis dans une colonne donnée ou dans une ligne donnée

Dans mon exemple j'avais pris comme exemple la recherche du premier range de valeurs numériques comprises entre 12 et 15000.
Mais cela pourrait être tout autre chose, par exemple trouver le premier range de cellules coloriées en vert, ou le premier range de cellules contenant des formules, etc.

Cordialement
 

job75

XLDnaute Barbatruc
Bonsoir Daniel Desch,
Ce sujet n'a pas pour le moment trouvé réponse.
Et vous ne savez pas pourquoi ? Alors je vous le dit, le problème posé n'est pas du tout clair :

- dans quelles cellules voulez-vous afficher les résultats ? Des exemples seraient souhaitables non ?

- pour la ligne 5 pourquoi ne pas traiter aussi la plage Q5:S5 ou les plages N6:O6 et Q6:S6 pour la ligne 6 ?

A+
 

job75

XLDnaute Barbatruc
Bon voyez les 2 fichiers joints avec ces 2 fonctions VBA :
VB:
Function MesZones(r As Range) As String
Dim P As Range
For Each r In r
    If r >= 12 And r <= 15000 Then Set P = Union(IIf(P Is Nothing, r, P), r)
Next
If Not P Is Nothing Then MesZones = P.Address(0, 0) 'renvoie les adresses de toutes les zones
End Function
VB:
Function MaZone(r As Range) As String
Dim P As Range
For Each r In r
    If r >= 12 And r <= 15000 Then Set P = Union(IIf(P Is Nothing, r, P), r)
Next
If Not P Is Nothing Then MaZone = P.Areas(1).Address(0, 0) 'renvoie l'adresse de la 1ère zone
End Function
 

Pièces jointes

  • MesZones(1).xlsm
    15.4 KB · Affichages: 4
  • MaZone(1).xlsm
    16.7 KB · Affichages: 4

Daniel Desch

XLDnaute Nouveau
Bonsoir job75,

La fonction que je cherchais, c'est la fonction Function MaZone(r As Range) As String
Elle me convient parfaitement. Elle retourne un String que je ne vais pas spécialement afficher mais que je vais utiliser comme un Range.

Mais la fonction Function MesZones(r As Range) As String
me sera également très utile dans d'autres cas et je vais m'en servir également, d'autant plus qu'elle fonctionne sur n'importe quel Range et pas forcément sur une ligne ou une colonne


Question complémentaire :
Est-il envisageable que la condition (r >= 12 And r <= 15000) puisse être passée en paramètre variable de ces 2 fonctions.
Je ne parle pas uniquement de passer 12 et 15000 en paramètre mais de pouvoir remplacer la condition dans son ensemble par un autre type de condition (exemples : liste de valeurs, nombre pair, nombre premier)


Merci en tout cas pour votre aide particulièrement efficace. En plus je suis à chaque fois étonné par la compacité du code.

Merci beaucoup
Bonne soirée
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Daniel Desch, job75 ;),

J'avais commencé. J'ai terminé donc je publie.

Je n'ai pas compris la même chose. Je me suis basé sur votre premier énoncé de question que vous avez modifié par la suite (la notion de sens de recherche a disparu, l'exemple de la plage de colonnes I:K a été supprimé !). Comment voulez-vous qu'on vous propose quelque chose qui se tient si vous changez la question sans prévenir? :mad::mad::mad::mad::mad:

Avec ce que j'avais compris (pour la recherche en ligne), on recherche dans les lignes (1ère ligne puis 2ème ligne, etc.) de la plage origine la première cellule respectant les critères. Cette cellule devient la cellule du coin supérieur gauche de la plage résultat. Ensuite, à partir de cette cellule, on étend cette plage vers la droite jusqu'à la cellule précédant la première cellule ne respectant plus les conditions.
On étend ensuite la plage trouvée, ligne par ligne, vers le bas tant que toutes les cellules de la ligne respectent les conditions.

Ce raisonnement aboutit à une fonction qui respecte les résultats que vous souhaitiez avant de modifier votre énoncé, à savoir:
Recherche par ligne:
La fonction doit retourner H5-O5 pour la ligne 5, G6-L6 pour la ligne 6, I7-J7 pour la ligne 7... et une plage vide (je ne sais pas si ça existe) pour la ligne 8
Pour les colonnes I:K, on doit retourner I5:K6
Recherche par colonne:
La fonction doit retourner C10-C17 pour la colonne C, D13-D17 pour la colonne D, E18-E18 pour la colonne E... et une plage vide (je ne sais pas si ça existe) pour la colonne F
Pour les colonnes I:K, on doit retourner I5:J7

'***************************************************************************************************************
Fonction à utiliser : Plage_Si(xrg, xMin, xMax, xSens)
paramètre 1 -> la plage à examiner
paramètre 2 -> la valeur minimum à considérer
paramètre 3 -> la valeur maximum à considérer
paramètre 4 -> c'est un paramètre optionnel
  • si paramètre 4 absent, on examine la plage par ligne: ligne 1 puis ligne 2, etc.
  • si paramètre 4 présent (égal à n'importe quoi), on examine la plage par colonne: colonne 1 puis colonne 2, etc.
La fonction retourne un RANGE
Si aucune cellule ne vérifie les condition alors Plage_Si retourne NOTHING
'***************************************************************************************************************
 

Pièces jointes

  • Daniel Desch- recherche plage- v3.xlsm
    29.3 KB · Affichages: 7
Dernière édition:

Daniel Desch

XLDnaute Nouveau
Bonjour @Daniel Desch, job75 ;),

J'avais commencé. J'ai terminé donc je publie.

Je n'ai pas compris la même chose. Je me base sur votre premier énoncé de question que vous avez modifié par la suite (la notion de sens de recherche a disparu, l'exemple de colonnes I à K a été supprimé !). Comment voulez-vous qu'on vous propose quelque chose qui se tient si vous changez la question sans prévenir? :mad::mad::mad::mad::mad:

Avec ce que j'avais compris (pour la recherche en ligne), on recherche dans les lignes (1ère ligne puis 2ème ligne, etc.) de la plage origine la première cellule respectant les critères. Cette cellule devient la cellule du coin supérieur gauche de la plage résultat. Ensuite, à partir de cette cellule, on étend cette plage vers la droite jusqu'à la cellule précédant la première cellule ne respectant plus les conditions.
On étend ensuite la plage trouvée, ligne par ligne, vers le bas tant que toutes les cellules de la ligne respectent les conditions.

Ce raisonnement aboutit à une fonction qui respecte les résultats que vous souhaitiez avant de modifier votre énoncé, à savoir:


'***************************************************************************************************************
Fonction à utiliser : Plage_SiEntre(xrg, xMin, xMax, xSens)
paramètre 1 -> la plage à examiner
paramètre 2 -> la valeur minimum à considérer
paramètre 3 -> la valeur maximum à considérer
paramètre 4 -> c'est un paramètre optionnel
  • si paramètre 4 absent, on examine la plage par ligne: ligne 1 puis ligne 2, etc.
  • si paramètre 4 présent (égal à n'importe quoi), on examine la plage par colonne: colonne 1 puis colonne 2, etc.
La fonction retourne un RANGE
Si aucune cellule ne vérifie les condition alors Plage_Si retourne NOTHING
'***************************************************************************************************************


Bonjour mapomme,


C'est vrai que n'ayant pas reçu de réponse, j'avais supprimé une partie de mon message car mon besoin immédiat ces jours-ci c'est de faire une recherche sur une ligne ou sur une colonne. Donc je me suis dit qu'en supprimant la partie la plus compliquée concernant la recherche que j'avais définie sur une plage j'obtiendrais peut-être plus vite une réponse.

Je vous prie de m'en excuser. Et je dois reconnaître que votre macro répond parfaitement au besoin que j'avais exprimé dans la première version de mon topic. Elle répond tout à fait aux règles que j'avais définies et dont j'aurai besoin pour traiter certains tableaux


Je vous remercie beaucoup pour cette fonction

Vous souhaitant une très bonne journée

Daniel
 

Discussions similaires

Statistiques des forums

Discussions
312 023
Messages
2 084 716
Membres
102 636
dernier inscrit
TOTO33000