Erreur Objet requis

Bonjour a tous, est-ce que quelqu'un a une idée pourquoi j'ai une erreur "objet requis" a la 2ieme ligne ?

set tablo1 = Sheets("ASS").Range("I3:I" & Sheets("ASS").Range("A" & 65536).End(xlUp).Row)
tablo1.Cells(1, 1).Interior.ColorIndex = 4

set tablo1 = Sheets("ASS").Range("I3:I" & Sheets("ASS").Range("A" & 65536).End(xlUp).Row)

Euh...range qui demarre en i et la derniere ligne calculé en A, c'est normal?

tablo1.Cells(1, 1).Interior.ColorIndex = 4

Cell(1,1) correspond a la 1ere ligne, 1ere colonne donc A1 et ton tableau demarre en I (Sheets("ASS").Range("I3....))

Salut, oui c'est normal pour le end up.

La colonne que je voulais dans mon tableau est i.

Je croyais que lorsqu'on met dans un tableau, des cellules, il n'y a plus de lieu avec les cellules excel, mais seulement le tableau, c'est du moins ce que crois qu'on m'a dit tout a l'heure.

Si tu as raison, donc la colonne i d'excel reste i dans le tableau?

ca coute rien d'essayer, un simple "msgbox tablo1.Cells(1, 1).value/tablo1.Cells(1, "I").value" te renseignera

j'ai essaye et j'ai un message objet requis, pour chacune des lignes. Pourtant tablo1 fonctionne bien dans mon sub.

Par ailleurs, cet instruction fonctionne bien: If tablo1(i - X, 1) = tablo2(i2 - Y, 1) Then

Remarque que i est une variable qui scan toute les lignes de ma colonne de mon tableau, et non la colonne "i"

   MsgBox tablo1.Cells(1, 1).Value
        MsgBox tablo1.Cells(1, "I").Value

Houlà ! Stop ! Arrêtez les confusions !

Tablo1.Cells(1, 1) c'est la cellule I3 après ton affectation.

Tu peux t'en assurer avec un Msgbox Tablo1.Cells(1, 1).Address

La syntaxe Cells(1, "I") n'est pas une bonne syntaxe et est à éviter (même si souvent elle fonctionne). Préférer :

Tablo1.Cells(1, 9)

Cette expression renverra la cellule Q3 !

Toutefois, si tu es en erreur sur cette ligne tu ne verras rien ! Rien dans le code ne permet de déceler la source de l'erreur, il faut voir le fichier où cette erreur est renvoyée.

Cordialement.

Merci pour ces éclaircissement.

j'ai essayé Msgbox Tablo1.Cells(1, 1).Address et j'ai le meme probleme objet requis que dans tablo1.Cells(1,1).interior.colorindex=4

On dirait que la syntaxe n'est pas approprié pour mon tableau. Note qu'il ne possede qu'une seule colonne. tablo1 fonctionne tres bien dans mon sub jusqu'au 2 instructions suivantes

set tablo1 = Sheets("ASS").Range("I3:I" & Sheets("ASS").Range("A" & 65536).End(xlUp).Row)

 Msgbox Tablo1.Cells(1, 1).Address
tablo1.Cells(2, 1).Interior.ColorIndex = 4

Voici mon sub complet:

Sub passe1()
              'la comparaison s'effectue sur une fenetre de 10 mnémoniques (5 au dessus et 5 en dessous) de chaque coté lorsqu'on a trouvé 2 mnémoniques identique
              'il faut trouvé  3 mnémoniques identiques dans la fenetre de recherche de chaque tableau pour assumer qu'il sagit bien de la meme mnémonique
              'la fenetre de gauche représente la version actuel (feuille ASS) (tableau 1)
    Dim plage1 As Integer
    Dim plage2 As Integer
    Dim nombre As Integer  'nbre de cellules identiques trouvées
    tablo1 = Sheets("ASS").Range("I3:I" & Sheets("ASS").Range("A" & 65536).End(xlUp).Row) 'la version actuelle (fenetre de gauche)
    tablo2 = Sheets("ASS2").Range("I3:I" & Sheets("ASS2").Range("A" & 65536).End(xlUp).Row) 'la version ancienne (fenetre de droite)
    limit1 = UBound(tablo1, 1) 'derniere cellule du tableau
    limit2 = UBound(tablo2, 1) 'derniere cellule du tableau
   'on cherche les mnémoniques du tableau 1 qui ne sont pas présentes dans le tableau 2:
    nombre = 0
    For i = 1 To limit1 'pour chacune des mnémonique du tableau 1
    nombre = 0
    If tablo1(i, 1) > 0 Then 's'il y a une mnémonique
        For i2 = 1 To limit2
            If tablo1(i, 1) = tablo2(i2, 1) Then  'on a trouver une mnémonique identique quelque part dans tableau 2
                  nombre = 0
                  plage1 = 5
                  plage2 = 5
                 'on vérifie pour chacune des 5 cellules suivante du tableau 1, si on trouve dans l'une des 5 cellules suivante du tableau 2
                  For X = 1 To plage1 'pour chacune des 5 cellules suivante du tableau 1
                       If (i + X) <= limit1 Then 'si on ne déborde pas du tableau
                            If tablo1(i + X, 1) > 0 Then  's'il y a une mnémonique
                                 For Y = 1 To plage2 'pour chacune des 5 cellules suivantes du tableau 2
                                      If (i2 + Y) <= limit2 Then 'si on ne déborde pas du tableau
                                          If tablo2(i2 + Y, 1) > 0 Then  's'il y a une mnémonique
                                             If tablo1(i + X, 1) = tablo2(i2 + Y, 1) Then
                                                 nombre = nombre + 1  'on cumule les cellules identiques trouvées
                                             End If
                                          Else: plage2 = plage2 + 1
                                          End If
                                       End If
                                 Next Y
                            Else: plage1 = plage1 + 1
                            End If
                       End If
                       If nombre > 2 Then: GoTo 1  'la recherche est suffisante pour confirmer
                  Next X
                 'on vérifie pour chacune des 5 cellules précédente du tableau 1, si elle se trouve dans l'une des 5 cellules prédedentes dans le tableau 2
                  plage1 = 5
                  plage2 = 5
                  For X = 1 To plage1 ''pour chacune des 5 cellules précedentes, du tableau 1
                       If (i - X) > 0 Then 'si on ne déborde pas du tableau
                            If tablo1(i - X, 1) > 0 Then  's'il y a une mnémonique
                                 For Y = 1 To plage2 'pour chacune des 5 cellules précedente du tableau 2
                                      If (i2 - Y) > 0 Then ''si on ne déborde pas du tableau
                                          If tablo2(i2 - Y, 1) > 0 Then 's'il y a une mnémonique
                                              If tablo1(i - X, 1) = tablo2(i2 - Y, 1) Then
                                                  nombre = nombre + 1 'on cumule les cellules identiques trouvées
                                              End If
                                          Else: plage2 = plage2 + 1
                                          End If
                                      End If
                                  Next Y
                            Else: plage1 = plage1 + 1
                            End If
                        End If
                        If nombre > 2 Then GoTo 1 'la recherche est suffisante pour confirmer
                   Next X
             End If
             If nombre > 2 Then 'on suppose que la mnémonique dans le tableau 2 est la bonne, donc on recherche la cellule suivante dans tableau 1
                GoTo 1
             End If
        Next i2 'on vérifie la cellule suivante du tableau 2
       MsgBox tablo1.Cells(1, 1).Address
       Set tablo1.Cells(1, 1).Interior.ColorIndex = 4 'la mnémonique n'a pas été trouvé dans tableau 2:, donc on colore en vert
       'Sheets("ASS2").Rows(i + 2).Insert 'on ajoute une ligne vide au meme endroit dans tableau 2
       'Sheets("ASS2").Range("i" & i + 2).Interior.ColorIndex = 4 'on colore également du coté tableau 2
    End If
1   Next i 'on vérifie mnémonique suivante en tableau 1

Je n'ai pas vu les variables tablo déclarées.

Tu lui affectes un objet, as-tu testé que l'affectation s'était bien faite ?

Non, elle ne sont pas déclarés et je suis surpris que ca marche ailleurs dans le sub. Je suis partis de l'idée d'un membre.

Est-ce qu'il faut mettre option explicit ou quelque chose comme ca pour qu'on soit obliger de déclarer?

Que veux tu dire par affecter un objet?

Dans cette ligne d'instruction de mon sub, aucun probleme, le contenu de tablo1 et tablo2 est toujours présent.

If tablo1(i + X, 1) = tablo2(i2 + Y, 1) Then

Est-ce que tablo1 est vraiment un tableau, puisque je n'ai pas défini de dimension.

Si tu mets Option Explicit cela t'oblige à déclarer toutes les variables.

Mais il est tout de même recommandé de les déclarer sans cela.

Pas déclaré, tablo1 est de type Variant. Peut accepter un objet, mais toujours préférable (sauf exception) d'avoir une variable Objet et même de type Range...

Tu peux tester la présence d'une référence d'objet avec :

MsgBox tablo1 Is Nothing

qui te renverra Vrai ou Faux. Si Vrai c'est l'affectation n'a pas eu lieu et que la variable est vide.

Tu as aussi :

MsgBox IsEmpty(variable)

qui permet de tester si une variable de type Variant a été initialisée ou non.

J'ai essayé les 2 msgbox, le premier me donne mon erreur, soit "objet requis"

Pour le 2ieme, je dois mettre quoi dans "variable" pour tester?

tablo1 puisque c'est ta variable.

Donc, tablo1 est une variable de forme tableau?

Mes test me donnent:

MsgBox tablo1 Is Nothing

"erreur, objet requis"

MsgBox IsEmpty(tablo1) "faux"

Est-ce que tu as une piste?

Je résume mon probleme: Je ne comprend pas pourquoi j'arrive a voir les éléments de tablo1 mais je suis incapable de vérifier la couleur a l'intérieur d'un élément, car je me retrouve avec l'erreur "Objet requis"

If tablo1(i, 1) > 0 And tablo1.Cells(i, 1).Interior.ColorIndex <> 4 Then

's'il y a quelque chose et qu'il n'y a pas de couleur vert

Set tablo1.Cells(1, 1).Interior.ColorIndex = 4 

J'ai vu ça au passage : Set ne s'utilise que pour l'affectation de références d'objets, pas de valeurs de propriétés.

Par ailleurs tu devrais déclarer tes variables, avec un type précis, ça éclaircira peut-être.

Je n'arrive pas a declarer tablo1 et tablo2 avec un type qui fonctionne dans mon sub. J'ai essayé range et string.

Tu lui affectes une plage, c'est nécessairement un type Range !

Si tu as toujours la même erreur, il faut regarder si tes feuilles existent, ont bien les noms que tu lui donnes dans ton code, et s'il y a des données dans les colonnes utilisées pour dimensionner ta plage.

Les feuilles existent et font le travail car tablo1(i,1) est toujours bon, j'ai vérifier avec le mode étapte par étape.

If tablo1(i, 1) > 0 And tablo1.Cells(i, 1).Interior.ColorIndex <> 4 Then

J'ai l'impression que ma variable tableau est employé dans 2 types de code différent car si je déclare en Variant, j'ai l'erreur objet requis,dans l'instruction en haut et si je déclare range ou meme string, j'ai plutot "erreur de compilation" dans l'instruction suivante:

LIMIT1=UBOUND (tablo1,1)

Puisque je n'ai pas trouvé, j'ai utilisé une recherche dans excel au lieu de la faire a partir d'un tableau. Ca regle mon probleme.

Merci pour t'etre penché sur mon probleme, ca m'a permis de comprendre plusieurs choses.

Capucin.

Cela fait partie des erreurs enquiquinantes parce que la solution se trouve assez souvent ailleurs que là où apparaît l'erreur...

Mais si tu contourne, c'est OK.

Rechercher des sujets similaires à "erreur objet requis"