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 !
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]
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 + 😎
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 😎
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
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 😎
- 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