Lecture .Row d'un .Range : indice 1 décalé

Bonsoir à toute la communauté.

C'est mon premier post sur ce forum, je n'ai vraiment pas l'habitude de demander de l'aide mais j'ai beau retourner le problème dans tous les sens, je n'y arrive pas...

Je ne suis pas un pro de VBA mais j'ai quelques notions de base.

Le Problème : j'ai un index (issu d'une cellule : idComp) d'un sheet qui est utilisé (genre comme une Foreign Key) pour une lecture dans un autre sheet.

Il y a 1 boucle For...Next imbriquée dans une autre boucle For...Next.

En gros : 1 indice du sheet1 correspond à plusieurs lignes (rows) du sheet2. Une fois que les rows du sheet 2 ont été parcourues, on passe à l'indice suivant du sheet1...

Ce qui ne va pas : disons que j'ai l'ID 15 du sheet1 à retrouver dans le sheet2 colonne "A". Il est situé en A1, A2 et A3 puis on passe à un autre ID.

À la récup du Row de mon Range.Find, je n'ai pas 1, 2 et 3 pour l'ID1 puis 4, 5, 6, 7 pour l'ID2 mais 2, 3 et 1 puis tout va bien pour le reste : 4, 5, 6,...

Voilà le code qui est compris dans une Function :

//Désolé pour le code mais j'ai supprimé tous les commentaires ainsi que certaines variables trop explicites.

Option Explicit

Dim itemTree as String
Dim lastCompRow, idComp As Integer
With Worksheets("sheet2").range("A:A") 'testé avec "A1", "A1:A200" idem
    Dim cellTask As range
    Dim nbOccurTask, rowTask As Integer
    Set cellTask = .Find(what:=idComp, lookat:=xlWhole) 'utilisé searchDirection, searchOrder en vain...
    If cellTask Is Nothing Then
        itemTree = itemTree & "Aucune correspondance." & vbCrLf
    Else
        itemTree = itemTree & "---Du texte ici : " & vbCrLf
        nbOccurTask = Application.WorksheetFunction.CountIf(Worksheets("sheet2").range("A1:A200"), idComp)

        For k = 1 To nbOccurTask 'boucle imbriquée
            rowTask = cellTask.Row 'Help Here : en debug : rowTask = 2,3,1... 
            'Affichage du niveau sup
            If k <> 1 Then
                'verifie corespondance ID précédent - si idem -> pas d'affichage
                If Worksheets("sheet2").Cells(rowTask, 4) <> _
                   Worksheets("sheet2").Cells(rowTask - 1, 4) Then
                     ' /!\ et donc ici si rowTask = 1 (quand k=1 normalement)
                     ' alors rowTask - 1 = 0 et Cells(0,1) ben...ça n'existe pas!!!
                    itemTree = itemTree & "(" & Worksheets("sheet2").Cells(rowTask, 5) & ")" & vbCrLf
                End If
            Else
                'sinon affichage par défaut de la première catégorie
                itemTree = itemTree & "(" & Worksheets("sheet2").Cells(rowTask, 5) & ")" & vbCrLf
            End If
            itemTree = itemTree & Worksheets("sheet2").Cells(rowTask, 3) & vbCrLf

            Set cellTask = .FindNext(cellTask)
        Next k
    End If
End With

'Voilà ensuite le itemTree est affiché dans un lbl.Text

Voilà, j'espère avoir été clair.... Merci d'avance pour vos lumières, les miennes sont éteintes ;p

xlsNewbie ;D

Bonsoir,

Pas le temps de regarder... mais :

À la récup du Row de mon Range.Find, je n'ai pas 1, 2 et 3 pour l'ID1 puis 4, 5, 6, 7 pour l'ID2 mais 2, 3 et 1 puis tout va bien pour le reste : 4, 5, 6,...

ceci est normal : une recherche Find sur Range("A:A") commence en A2 et se termine en A1...

Cordialement.

Bonsoir,

Ok, c'est un fonctionnement "stupide" ;p

Y-a-t'il un moyen de le faire (A1, A2, A3) sans passer par une variable genre Array à trier pour avoir le résultat directement ?

Merci...dodo o_O

Introduis l'argument After, pour démarrer à la dernière cellule de la colonne, la recherche devrait alors commencer par A1 :

Set cellTask = .Find(idComp, .Cells(.Cells.Count, 1), , xlWhole)

Cordialement.

Bonjour,

J'ai donc utilisé l'arg After, ça fonctionne, j'ai bien le premier Row de mon Range qui est la cellule A1.

Merci infiniment MFerrand, tu me retires une épine du pied ;D

Bonne journée.

Rechercher des sujets similaires à "lecture row range indice decale"