XL 2010 Une fonction qui n'apprécie pas les boucles

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Une fonction me permet d'obtenir l'adresse de la dernière cellule d'un tableau, que celle-ci soit vide ou pas.
La fonction marche bien quand elle est utilisée isolément : elle renvoie, comme souhaité, le nom de la colonne et le numéro de ligne (par ex. "P54").
Quand j'utilise cette même fonction dans une boucle, curieusement elle ne me renvoie que le numéro de ligne.
Comment forcer la fonction à bien renvoyer ce que l'on attend quand elle est traitée dans une boucle ?
Sur la PJ, c'est nettement plus explicite.
 

Pièces jointes

  • Problème.xlsm
    20.9 KB · Affichages: 8
Solution
J'ai réglé le problème intuitivement, mais j'avoue ne pas l'avoir tout à fait compris...
En d'autres terme : ça plante, je vois où, logiquement je modifie un truc, mais sans trop savoir pourquoi ça plantait.

D'abord, je me suis dit que c'était peut-être la fonction. J'en rédige une autre à la brut de décoffrage :
VB:
Function LastCelAddressTable$(tableau As Range)
'*************************************************************************************
'Renvoie l'adresse de la dernière cellule d'un tableau que celle-ci soit vide ou pas.
'Magic_Doctor
'*************************************************************************************
'- tableau : un tableau d'une ou plusieurs colonnes

    Dim posFirstCol%, posFirstRow%, nbCol As Byte...

Magic_Doctor

XLDnaute Barbatruc
J'ai réglé le problème intuitivement, mais j'avoue ne pas l'avoir tout à fait compris...
En d'autres terme : ça plante, je vois où, logiquement je modifie un truc, mais sans trop savoir pourquoi ça plantait.

D'abord, je me suis dit que c'était peut-être la fonction. J'en rédige une autre à la brut de décoffrage :
VB:
Function LastCelAddressTable$(tableau As Range)
'*************************************************************************************
'Renvoie l'adresse de la dernière cellule d'un tableau que celle-ci soit vide ou pas.
'Magic_Doctor
'*************************************************************************************
'- tableau : un tableau d'une ou plusieurs colonnes

    Dim posFirstCol%, posFirstRow%, nbCol As Byte, lastCol As Range, nbRow%, nameCol$

    posFirstCol = tableau.Column
    posFirstRow = tableau.Row
    nbCol = tableau.Columns.Count
    nbRow = tableau.Rows.Count
    Set lastCol = tableau.Columns(nbCol)
    nameCol = NomCol(posFirstCol + nbCol - 1)
  
    LastCelAddressTable = nameCol & nbRow + posFirstRow - 1
End Function
Ma foi, elle marche. Je la substitue à la prédédente. Ça plante toujours !
Voici la modification que j'ai faite :
VB:
    For i = 1 To 3
        adresseLastCel(i) = CStr(DERCEL(Evaluate("ListeItems" & i)))
        col(i) = NomCol(Evaluate("ListeItems" & i).Column)
        lgn(i) = ExtractNumber(adresseLastCel(i)) 'si mis en REM ça marche (en M3 : colonne & ligne, sinon uniquement la ligne...)
        adresseFirstCel(i) = col(i) & lgn(i)
    Next
VB:
    For i = 1 To 3
        adresseLastCel(i) = CStr(DERCEL(Evaluate("ListeItems" & i)))
        col(i) = NomCol(Evaluate("ListeItems" & i).Column)
        lgn(i) = ExtractNumber(adresseLastCel(i)) 'si mis en REM ça marche (en M3 : colonne & ligne, sinon uniquement la ligne...)
        adresseLastCel(i) = CStr(DERCEL(Evaluate("ListeItems" & i)))
        adresseFirstCel(i) = col(i) & lgn(i)
    Next
Bon, l'essentiel c'est que ça marche.
 

Pièces jointes

  • Fin du Problème.xlsm
    22.5 KB · Affichages: 3
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour Magic_Doctor,

Tu utilises un code inutilement compliqué pour ce que tu veux faire, prends celui-ci :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [L3]) Is Nothing Then Exit Sub
Dim c As Range, P As Range
Set c = Cells.Find("?*" & CStr([L3]), , xlValues, xlWhole)
If c Is Nothing Or CStr([L3]) = "" Then [M3] = "": Exit Sub
Set P = c.MergeArea
Do
    Set c = c(2)
Loop While c.Borders(1).LineStyle <> xlNone
[M3] = Range(P, c(0)).Address(0, 0)
End Sub
Salut patricktoulon.

A+
 

Pièces jointes

  • Problème(1).xlsm
    18.3 KB · Affichages: 6

job75

XLDnaute Barbatruc
Comme Magic_Doctor aime bien les fonctions :
VB:
Function Adresse_tableau(ref As Range) As String
Dim c As Range, P As Range
Set c = ref.Parent.Cells.Find("?*" & CStr(ref), , xlValues, xlWhole)
If c Is Nothing Or CStr(ref) = "" Then Adresse_tableau = "": Exit Function
Set P = c.MergeArea
Do
    Set c = c(2)
Loop While c.Borders(1).LineStyle <> xlNone
Adresse_tableau = ref.Parent.Range(P, c(0)).Address(0, 0)
End Function
 

Pièces jointes

  • Problème(2).xlsm
    19.1 KB · Affichages: 4

Discussions similaires

Réponses
3
Affichages
279

Statistiques des forums

Discussions
312 084
Messages
2 085 192
Membres
102 809
dernier inscrit
Sandrine83