Bonjour
Pour information, j'ai un souci ressemblant avec le renseignement d'une formule matricielle. Peut-être que la raison est la même, mais ce n'est pas certain : https://www.developpez.net/forums/d2.../#post11843870
Dans un nouveau classeur, j'ai tapé un texte quelconque en D6 du seul onglet du classeur. Mon but est de retrouver la dernière ligne utilisée du classeur : 6.
Je constate un résultat différent que je ne m'explique pas selon que le même code [SpecialCells(xlCellTypeLastCell).Address] est lancé directement depuis l'éditeur VBE ou depuis une formule dans une cellule qui lance la même fonction.
De ce que je comprends, l'instruction "SpecialCells(xlCellTypeLastCell)" n'est pas prise en compte suite à un appel par formule, ou je m'en sers mal / je n'ai pas compris quelque chose.
Dans la fenêtre d'exécution du VBE, voici ce que j'ai tapé et obtenu
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Sub sAdresseB2(sComment As String) sComment = Right(Space(25) & sComment, 25) Debug.Print sComment & " ---> " & "B2=>" & Range("B2").SpecialCells(xlCellTypeLastCell).Address & _ " - usedRange=>" & Format(Range("B2").Parent.UsedRange.SpecialCells(xlCellTypeLastCell).Address, "!@@@@@@@@@@") & _ " - cells=>" & Range("B2").Parent.Cells.SpecialCells(xlCellTypeLastCell).Address End Sub Function fAdresseB2(sComment As String) As Long Call sAdresseB2(sComment) End Function Sub test() Call sAdresseB2("procedure VBA") ' OK, la dernière cellule est bien évaluée -> lancement depuis le code Call fAdresseB2("lancé par fonction VBA") ' OK, appeler la fonction depuis le code fonctionne aussi Range("C3").Formula = "=fAdresseB2(""lancé par formule"")" ' KO, appeler la fonction depuis une formule dans une cellule End Sub
Dans le cas ou le code est lancé par une formule, j'imagine bien qu'il est possible de faire la somme du numéro de ligne de la première cellule du usedRange et d'y ajouter le nombre de ligne du usedRange -1. Je trouve cela bien lourd.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 ?Application.Version 16.0 call test procedure VBA ---> B2=>$D$6 - usedRange=>$D$6 - cells=>$D$6 lancé par fonction VBA ---> B2=>$D$6 - usedRange=>$D$6 - cells=>$D$6 lancé par formule ---> B2=>$B$2 - usedRange=>$C$3:$D$6 - cells=>$1:$1048576 ?Range("B2").SpecialCells(xlCellTypeLastCell).row + Range("B2").SpecialCells(xlCellTypeLastCell).rows.Count -1 6
Quelqu'un sait-il m'expliquer comment je peux obtenir le bon numéro de dernière ligne (6) lorsque la fonction est lancée depuis la formule d'une cellule ?
Quelqu'un peut-il m'expliquer la logique des 3 lastCell.address lorsque la fonction est lancée depuis une formule dans une cellule ?
Partager