Range qui n'est pas un Objet ?

Bonjour consoeurs, confrères

J'ai de la difficulté à comprendre une situation qui s'oppose au bon fonctionnement de mon programme.

Alors ça va comme suis ;

Function PersonnalJob()
    Dim i As Variant
    Dim FirstTask As Variant
    For Each i In NameListing
        FirstTask = Range(i).Offset(columnOffset:=1)
        MsgBox IsObject(i)
        MsgBox IsObject(Range(i))
        MsgBox IsObject(FirstTask)
        MsgBox IsObject(Range(FirstTask))
    Next
End Function

Il semblerait que FirstTask ne soit pas un objet. Mais pourquoi ?

Théoriquement, OffSet devrait retourner un Range. J'ai tord ?

Si quelqu'un pouvait m'expliquer pourquoi FirstTask n'est pas un Range, et comment faire qu'il le soit serait très apprécier

Merci de votre lecture !

Voici le code entier, si vous en avez besoin :

Function OccupedCell() As Variant
    Dim FL1 As Worksheet, NoCol As Integer
    Dim NoLig As Long, Var As Variant
    Dim VarList As Variant
    Dim x As Variant
    VarList = Array()
    x = 0
    Set FL1 = Worksheets("Heures réelles")
    NoCol = 4 'lecture de la colonne 4
    For NoLig = 1 To Split(FL1.UsedRange.Address, "$")(4) 'Ten qu'une ligne existe, ajoute 1 a NoLig
        Set Var = FL1.Cells(NoLig, NoCol) 'Var = cellule presentement questionne

        If IsEmpty(Var) = False Then 'Si il y a qqc dans la cellule..
            ReDim Preserve VarList(x) 'Ajoute un slot a VarList
            VarList(x) = Var.Address 'Ajoute l'addresse de la cellule presentement questionne au nouveau slot cree
            x = x + 1

        End If
    Next
    Set FL1 = Nothing
    OccupedCell = VarList 'Resultat : Une liste de toutes les cellule contenant du stock est cree
    Exit Function
End Function

Function NameListing()
    Dim prevAddress As Variant
    Dim rng As Range
    Dim rngStart As Range
    Dim rngEnd As Range
    Dim index As Integer
    Dim arrayLen As Integer
    Dim k As Variant
    Dim NameRange() As Variant
    Dim y As Variant
    Dim j As Variant
    Set NameFL = Worksheets("AllNames")

    y = 0
    j = 0

    prevRange = OccupedCell()
    arrayLen = UBound(prevRange) - LBound(prevRange) 'Trouve la longeur de prevRange (array)

     For Each k In prevRange
        If Not IsError(Application.Match(Range(k), NameFL.Range("A:A"), False)) Then 'Si k est dans Range("A:A") ; suite des events
            ReDim Preserve NameRange(j)
            NameRange(j) = k
            j = j + 1
            End If
        y = y + 1
    Next
    NameListing = NameRange
    Exit Function
End Function

Function NumberOfItems()
    Dim dict As Scripting.Dictionary
    Set dict = New Scripting.Dictionary
    For Each i In NameListing
            Set rng = Range(i)
            If rng.MergeCells Then
                Set rng = rng.MergeArea
                Set rngStart = rng.Cells(1, 1)
                Set rngEnd = rng.Cells(rng.Rows.Count, rng.Columns.Count)
                rngDiff = rngEnd.Row - rngStart.Row + 2
                dict.Add i, rngDiff
            Else
            MsgBox "Not merged area"
        End If
    Next
    Set NumberOfItems = dict
    Exit Function
End Function

Function PersonnalJob()
    Dim i As Variant
    Dim FirstTask As Variant
    For Each i In NameListing
        FirstTask = Range(i).Offset(columnOffset:=1)
        MsgBox IsObject(i)
        MsgBox IsObject(Range(i))
        MsgBox IsObject(FirstTask)
        MsgBox IsObject(Range(FirstTask))
    Next
End Function

Sub Activater()
    Sheets("Heures réelles").Activate
    PersonnalJob
End Sub

- Binimo, l'Apprenti

bonjour,

pour attribuer une instance d'objet à une variable il faut utiliser l'instruction set, si tu ne le fais pas VBA essaiera de mettre dans la variable l'information la plus judicieuse en fonction du contexte. dans la majorité des cas ce sera l'attribut value.

donc si tu fais :

FirstTask = Range(i).Offset(columnOffset:=1)

tu mets la valeur de Range(i).Offset(columnOffset:=1) dans la variable firsttask

si tu fais

set Firsttask=Range(i).Offset(columnOffset:=1)

firsttask devient un pointeur vers Range(i).Offset(columnOffset:=1) et non une copie de l'instance (dans le cas de range)

Merci, cela fonctionne !

Rechercher des sujets similaires à "range qui pas objet"