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 !