XL 2013 Dans un With faire référence à l'objet With ?

Dudu2

XLDnaute Barbatruc
Bonjour à tous,

Question qui peut paraître étrange mais dont les conditions se posent à moi de temps en temps.
Dans un With, comment faire référence à l'objet cité dans le With autrement que par lui-même ou par un artifice ?
Exemple:
VB:
Sub a()
    With ThisWorkbook.Worksheets("Feuil1")
        .Cells(10, 1).Value = "Dernière ligne utilisée de la feuille ->"
      
        'Objet de la question, syntaxe non valide:
        '.Cells(10, 4).Value = b(.)
      
        'Méthode détournée
        .Cells(10, 4).Value = b(.Cells(1, 1).Parent)
    End With
End Sub

Function b(WS As Worksheet)
    b = WS.UsedRange.Row + WS.UsedRange.Rows.Count - 1
End Function

Merci pour vos avis éclairés.
 
Solution
Bonjour
Non. With n'est pas un objet, mais une instruction appliquée à un objet.
Ce bloc With ne peut donc contenir que des membres de l'objet qu'il concerne

Il t'est bien évidemment possible de faire face de plusieurs manières. La plus simple est probablement celle-ci (en utilisant la propriété Name de ta feuille):

VB:
    With ThisWorkbook.Worksheets("Feuil1")
        .Cells(10, 1).Value = "Dernière ligne utilisée de la feuille ->"
        .Cells(10, 4).Value = b(.Name)
    End With

et la fonction (donc transformée) appelée :
VB:
Function b(WS As String) As Long
    b = Worksheets(WS).UsedRange.Row + Worksheets(WS).UsedRange.Rows.Count - 1
End Function

jmfmarques

XLDnaute Accro
Bonjour
Non. With n'est pas un objet, mais une instruction appliquée à un objet.
Ce bloc With ne peut donc contenir que des membres de l'objet qu'il concerne

Il t'est bien évidemment possible de faire face de plusieurs manières. La plus simple est probablement celle-ci (en utilisant la propriété Name de ta feuille):

VB:
    With ThisWorkbook.Worksheets("Feuil1")
        .Cells(10, 1).Value = "Dernière ligne utilisée de la feuille ->"
        .Cells(10, 4).Value = b(.Name)
    End With

et la fonction (donc transformée) appelée :
VB:
Function b(WS As String) As Long
    b = Worksheets(WS).UsedRange.Row + Worksheets(WS).UsedRange.Rows.Count - 1
End Function
 

Dudu2

XLDnaute Barbatruc
Bonjour jmfmarques,

En effet, ta solution est une alternative. Même si dans ce cas, le niveau de qualification "transporté" par l'argument n'inclue plus le Workbook.

D'ailleurs, si j'ai posé la question, je suis plus que sceptique sur l'existence d'une syntaxe dédiée car le "." est fait pour introduire une propriété ou méthode donc seul, il est forcément de trop. Et absent, il ne reste plus rien, et rien c'est pas pas grand chose :p !
C'était pour passer le temps :rolleyes:

Confirnement vôtre,
JP

Edit: j'ai parlé de "l'objet With" et il fallait lire évidemment "l'objet introduit par le With"
 
Dernière édition:

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 305
Messages
2 087 084
Membres
103 459
dernier inscrit
Arnocal