Manipuler Range en tenant compte de sa feuille d'origine

  • Initiateur de la discussion Initiateur de la discussion JNP
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

JNP

XLDnaute Barbatruc
Bonjour le forum 🙂,
Ça faisait un bail que je n'avais pas ouvert une discussion, mais là, j'avoue que je tourne en rond depuis un bout de temps 😱...
Bien que j'ai pu disputer certains sur le forum, je ne posterai pas de fichier exemple, vu que ma question est plutôt généraliste 😛.
J'aime beaucoup utiliser des fonctions personnalisées, et souvent, je les utilise en fonctions de feuilles, et j'apprécie de traiter des Range plutôt que d'utiliser les adresses en String.
Il y a peu, pour simplifier l'écriture d'une fonction pour un post XLD, j'ai eu envie d'utiliser un Range Colonne (si vous préférez, rentrer A:A plutôt A1:A30).
Donc j'ai créé une fonction pour récupérer ma colonne réduite à la portion utilisée :
Code:
Function Retaille(Plage As Range) As Range
Set Retaille = Plage.Resize(Plage.Cells(Plage.Count).End(xlUp).Row)
End Function
Mon problème est que je n'arrive pas à ôter les entêtes 🙁...
Rezise est la seule fonction que j'ai trouvé qui me renvoie la plage en conservant la feuille.
D'ailleurs, je n'ai pas trouvé de propriété pour Range qui me renvoie la feuille où elle se trouve 😱...
Si vous avez des idées, je suis preneur 😉.
Bon WE 😎
 
Re : Manipuler Range en tenant compte de sa feuille d'origine

Hello JNP,

Retaille sans Entête:

Code:
Function Retaille(Plage As Range) As Range
Dim rng as range
With Plage
Set rng = .Resize(.Cells(.Count).End(xlUp).Row)
end with
Set Retaille=rng.Offset(1).Resize(rng.Rows.count-1)
End Function

[Edition] Réduction

Code:
[COLOR=blue]Function[/COLOR] Retaille(Plage [COLOR=blue]As[/COLOR] Range) [COLOR=blue]As[/COLOR] Range
    [COLOR=blue]With[/COLOR] Plage
        [COLOR=blue]With[/COLOR] .Resize(.Cells(.Count).[COLOR=blue]End[/COLOR](xlUp).Row)
            [COLOR=green]'+.rows.Count>1 évite l'erreur s'il n'y a qu'une ligne dans la plage[/COLOR]
            [COLOR=blue]Set[/COLOR] Retaille = .Offset(1).Resize(.Rows.Count + (.Rows.Count > 1))
        [COLOR=blue]End[/COLOR] [COLOR=blue]With[/COLOR]
    [COLOR=blue]End[/COLOR] [COLOR=blue]With[/COLOR]
[COLOR=blue]End[/COLOR] [COLOR=blue]Function[/COLOR]

Pour la Feuille:

Code:
Set Feuille = Plage.Parent

A+
 
Dernière modification par un modérateur:
Re : Manipuler Range en tenant compte de sa feuille d'origine

Salut Hasco 🙂,
Pour la feuille, OK, j'avais essayé en MsgBox, mais j'avais pas pensé à utiliser un Set ou le .Name du Parent 😉.
Par contre, le OffSet me plante chez moi 😱 (j'avais aussi essayé d'après l'aide)...
Cette fois ci, je met le fichier en PJ 😀.
A + 😎
 

Pièces jointes

Re : Manipuler Range en tenant compte de sa feuille d'origine

Re,

Voici, j'avais déjà corrigé dans mon précédent post:

Code:
[COLOR=BLUE]Function[/COLOR] RetailleH(Plage [COLOR=BLUE]As[/COLOR] Range) [COLOR=BLUE]As[/COLOR] Range
    [COLOR=BLUE]With[/COLOR] Plage
        [COLOR=BLUE]With[/COLOR] .Resize(.Cells(.Count).[COLOR=BLUE]End[/COLOR](xlUp).Row)
            [COLOR=GREEN]'+.rows.Count>1 évite l'erreur s'il n'y a qu'une ligne dans la plage[/COLOR]
            [COLOR=BLUE]Set[/COLOR] RetailleH = .Offset(1).Resize(.Rows.Count + (.Rows.Count > 1))
        [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]With[/COLOR]
    [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]With[/COLOR]
[COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Function[/COLOR]

Testé sur ton fichier-> tout bon😀
A+
 
Re : Manipuler Range en tenant compte de sa feuille d'origine

Re JNP🙂
Banzai😉

Et en version finale, pour moi je ferai une chose comme ceci:
Code:
[COLOR=BLUE]Function[/COLOR] Retaille(Plage [COLOR=BLUE]As[/COLOR] Range, [COLOR=BLUE]Optional[/COLOR] [COLOR=BLUE]ByVal[/COLOR] bWithHeaders [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Boolean[/COLOR] = [COLOR=BLUE]False[/COLOR]) [COLOR=BLUE]As[/COLOR] Range
    [COLOR=BLUE]With[/COLOR] Plage
        [COLOR=BLUE]If[/COLOR] bWithHeaders [COLOR=BLUE]Then[/COLOR]
            [COLOR=BLUE]Set[/COLOR] Retaille = .Resize(.Cells(.Count).[COLOR=BLUE]End[/COLOR](xlUp).Row)
        [COLOR=BLUE]Else[/COLOR]
            [COLOR=BLUE]With[/COLOR] .Resize(.Cells(.Count).[COLOR=BLUE]End[/COLOR](xlUp).Row)
                [COLOR=GREEN]'+.rows.Count>1 évite l'erreur s'il n'y a qu'une ligne dans la plage[/COLOR]
                [COLOR=BLUE]Set[/COLOR] Retaille = .Offset(1).Resize(.Rows.Count + (.Rows.Count > 1))
            [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]With[/COLOR]
        [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]If[/COLOR]
    [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]With[/COLOR]
[COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Function[/COLOR]

Plutôt que deux fonctions séparées.

A+
 
Re : Manipuler Range en tenant compte de sa feuille d'origine

Re 🙂,
C'est sur quoi je travaillais 😛... Mais plutôt en passant le nombre de lignes d'entête par la fonction 😉.
Donc, grâce à toi, Hasco, le résultat est
VB:
Function RetailleColonne(Plage As Range, Optional Entête As Integer = 1) As Range
With Plage
With .Resize(.Cells(.Count).End(xlUp).Row)
Set RetailleColonne = .Offset(Entête).Resize(.Rows.Count + (.Rows.Count > 1) - Entête + 1)
End With
End With
End Function
pour les colonnes, et
VB:
Function RetailleLigne(Plage As Range, Optional Entête As Integer = 0) As Range
With Plage
With .Resize(1, .Cells(.Count).End(xlToLeft).Column)
Set RetailleLigne = .Offset(0, Entête).Resize(1, .Columns.Count + (.Columns.Count > 1) - Entête + 1)
End With
End With
End Function
pour les lignes 😀.
Sache que j'en ferai bon usage 😉.
Merci pour tout 🙂...
Banzai, merci quand même 😉.
Bonne suite de WE 😎
 
Dernière édition:
Re : Manipuler Range en tenant compte de sa feuille d'origine

Bonsoir à tous
Juste pour s'amuser... ...et parce qu'une plage vide contient zéro cellule non vide...
Code:
[COLOR="DarkSlateGray"][B]Sub test()
Dim Feuille As Worksheet, x As Object, msg$
  Set x = RetailleH(Sheets("Feuil1").Range("A:A"))
  msg = "RetailleH(Sheets(""Feuil1"").Range(""A:A""))" & vbLf & "est l"
  If Not x Is Nothing Then
    msg = msg & "a " & IIf(x.Count > 1, "plage ", "cellule ") & """" & x.Address(0, 0) & """."
  Else
    msg = msg & "'objet ""Nothing""."
  End If
  MsgBox msg
  Set Feuille = Retaille(Sheets("Feuil1").Range("A:A")).Parent
  MsgBox Feuille.Name
End Sub

Function Retaille(Plage As Range) As Range
  Set Retaille = Plage.Resize(Plage.Cells(Plage.Count).End(xlUp).Row)
End Function

Function RetailleH(Plage As Range) As Object
Dim rng As Range
  With Plage
    Set rng = .Resize(.Cells(.Count).End(xlUp).Row)
  End With
  On Error Resume Next
  Set RetailleH = rng.Offset(1).Resize(rng.Rows.Count - 1)
  If Err.Number <> 0 Then Set RetailleH = Nothing: Err.Clear
End Function[/B][/COLOR]
ROGER2327
#4326


Mercredi 11 Haha 138 (Sortie de Saint Lucas Cranach, apocalypticien, SQ)
25 Vendémiaire An CCXIX
2010-W41-6T21:47:52Z
 
Re : Manipuler Range en tenant compte de sa feuille d'origine

Re 🙂
Juste pour s'amuser... ...et parce qu'une plage vide contient zéro cellule non vide...
Excellente remarque .
Je n'avais pas assez poussé les tests dans cette direction, et effectivement, ma première fonction renvoyait un résultat érroné en cas d'absence de cellules renseignées .
Voici donc les fonctions corrigées avec votre aide :
VB:
Function RetailleColonne(Plage As Range, Optional Entête As Integer = 1) As Range
With Plage
With .Resize(.Cells(.Count).End(xlUp).Row)
On Error Resume Next
Set RetailleColonne = .Offset(Entête).Resize(.Rows.Count - Entête)
If Err.Number <> 0 Then Set RetailleColonne = Nothing: Err.Clear
End With
End With
End Function
et
VB:
Function RetailleLigne(Plage As Range, Optional Entête As Integer = 0) As Range
With Plage
With .Resize(1, .Cells(.Count).End(xlToLeft).Column)
On Error Resume Next
Set RetailleLigne = .Offset(0, Entête).Resize(1, .Columns.Count - Entête)
If Err.Number <> 0 Then Set RetailleLigne = Nothing: Err.Clear
End With
End With
End Function
Pour info, j'ai mis par défaut pour les entêtes 1 pour les colonnes et 0 pour les lignes car c'est le cas de figure que je rencontre le plus souvent 😉.
Quand à l'appellation ligne et colonne, j'ai considéré que colonne me renvoyait une colonne et ligne une ligne, mais cela aurait pu être le contraire vu que colonne me renvoie... un nombre de ligne, et réciproquement 😀...
Bon dimanche et encore merci 😎
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour