Condition tableau VBA

Bonjour,

J'ai réalisé une macro qui stocke dans un tableau dynamique les numéros de ligne de certaine cellules.
A la fin je voudrais que, si le tableau contient un unique élément que certaines cellules soit égale à des cellules de la ligne stockées.
Le problème se situe à ce niveau apparament "Cells(tab_bd(0), 6)", tab_bd(0) est censé représenté l'unique élément du tableau et donc le numéro de la ligne qui m'intéresse, mais ça ne marche pas.
De plus, pour dire que le tableau contient un unique élément j'ai utilisé "UBound(tab_bd) = 0", je ne sais pas si c'est bon aussi...

If UBound(tab_bd) = 0 Then
Cells(i, 29).Value = Cells(tab_bd(0), 6).Offset(0, 23).Value
End If

Merci d'avance

8 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour,
    Ubound est egal a la definition du tableau soit par: ex dim S(12), Ubound(S)=12
    Dim S() et un ReDim,Ubound prend la valeur definie par ReDim.

    Pour savoir si vous n'avez qu'une ligne dans votre tableau, testez tab_bd(1)=0 en prenant soin de faire un Erase tab_bd avant chaque tour de programme.

    Bonne suite
    1. Merci de ces précisions, mais ça ne marche toujours pas il me dit que ça n'appartient pas à la sélection. Je vais joindre le code complet, peut-être que l'erreur est plus en amont.

      Sub Completor()

      Dim Wbk As Workbook
      Dim cell As Range
      Dim plage As Range
      Dim line_insertion As Integer

      Set Wbk = Workbooks("Test nutrition.xls")
      Set plage = Wbk.Worksheets("Structure").Range("F6:" & Range("F6").End(xlDown).Address)

      Dim tab_bd()
      ReDim tab_bd(line_insertion)

      line_insertion = 0

      For i = 3 To Cells(3, 6).End(xlDown).Row

      If Cells(i, 36) = 0 Then
      Erase tab_bd
      For Each cell In plage

      If i <> cell.Row And cell.Offset(0, 30) <> 0 Then

      If (Cells(i, 6).Value = cell.Value) And (Cells(i, 5).Value = cell.Offset(0, -1).Value) And (Cells(i, 7).Value = cell.Offset(0, 1).Value) Then
      ReDim tab_bd(line_insertion)
      tab_bd(line_insertion) = cell.Row
      line_insertion = line_insertion + 1

      End If

      End If

      Next cell

      If tab_bd(1) = 0 Then
      Cells(i, 29).Value = Cells(tab_bd(0), 6).Offset(0, 23).Value
      Cells(i, 30).Value = Cells(tab_bd(0), 6).Offset(0, 24).Value
      Cells(i, 31).Value = Cells(tab_bd(0), 6).Offset(0, 25).Value
      Cells(i, 32).Value = Cells(tab_bd(0), 6).Offset(0, 26).Value
      Cells(i, 33).Value = Cells(tab_bd(0), 6).Offset(0, 27).Value
      Cells(i, 34).Value = Cells(tab_bd(0), 6).Offset(0, 28).Value
      Cells(i, 35).Value = Cells(tab_bd(0), 6).Offset(0, 29).Value
      Cells(i, 36).Value = Cells(tab_bd(0), 6).Offset(0, 30).Value
      Cells(i, 37).Value = Cells(tab_bd(0), 6).Offset(0, 31).Value
      End If

      End If

      Next i

      End Sub
      1. Re,

        le premier ReDim tab_bd(line_insertion) ne sert a rien.

        Au deuxieme ReDim tab_bd(line_insertion):
        vous effacez a chaque tour les donnees de votre tableau

        ReDim Preserve tab_bd(line_insertion) pour redimensionner en gardant les donnees precedentes.

        A suivre
        1. Re,
          Une solution avec test Ubound(Tab_bd)=0 (tout est dans la definition de la variable tab_bd et pas d'erase)

          Sub Completor() 
          
            Dim Wbk As Workbook 
            Dim cell As Range 
            Dim plage As Range 
            Dim line_insertion As Integer 
            Dim tab_bd 
          
            Set Wbk = Workbooks("Test nutrition.xls") 
            Set plage = Wbk.Worksheets("Structure").Range("F6:" & Range("F6").End(xlDown).Address) 
          
            For i = 3 To Cells(3, 6).End(xlDown).Row 
              line_insertion = 0 
              If Cells(i, 36) = 0 Then 
                ReDim tab_bd(0) 
                For Each cell In plage 
                  If i <> cell.Row And cell.Offset(0, 30) <> 0 Then 
                    If (Cells(i, 6).Value = cell.Value) And _ 
                       (Cells(i, 5).Value = cell.Offset(0, -1).Value) And _ 
                       (Cells(i, 7).Value = cell.Offset(0, 1).Value) Then 
                      ReDim Preserve tab_bd(line_insertion) 
                      tab_bd(line_insertion) = cell.Row 
                      line_insertion = line_insertion + 1 
                    End If 
                  End If 
                Next cell 
          
                If UBound(tab_bd) = 0 Then 
                  Cells(i, 29).Value = Cells(tab_bd(0), 6).Offset(0, 23).Value 
                  Cells(i, 30).Value = Cells(tab_bd(0), 6).Offset(0, 24).Value 
                  Cells(i, 31).Value = Cells(tab_bd(0), 6).Offset(0, 25).Value 
                  Cells(i, 32).Value = Cells(tab_bd(0), 6).Offset(0, 26).Value 
                  Cells(i, 33).Value = Cells(tab_bd(0), 6).Offset(0, 27).Value 
                  Cells(i, 34).Value = Cells(tab_bd(0), 6).Offset(0, 28).Value 
                  Cells(i, 35).Value = Cells(tab_bd(0), 6).Offset(0, 29).Value 
                  Cells(i, 36).Value = Cells(tab_bd(0), 6).Offset(0, 30).Value 
                  Cells(i, 37).Value = Cells(tab_bd(0), 6).Offset(0, 31).Value 
                End If 
              End If 
            Next i 
          End Sub 
          


          Bonne suite
          1. Bonjour,

            Merci de votre aide, mais il y toujours un problème à cette ligne:
            Cells(i, 29).Value = Cells(tab_bd(0), 6).Offset(0, 23).Value
            Il me dit "erreur définie par l'application ou l'objet"
            1. Vraiment personne pour m'aider pls?
            2. Contributeur
              Bonjour,

              si tu joignais un fichier ça motiverait peut-être pour regarder.
              cjoint.com et coller ici le lien fourni

              eric
            3. Ok, voici un fichier exemple: http://cjoint.com/?3GgmMGj6h7Y
            4. Contributeur
              re,

              il me semble que c'est ton fichier initial sans tenir compte des remarques et propositions de f894009.
              On reverra ça lorsque tu en auras tenu compte

              eric
            5. Oui, en effet je me suis tromper de version. Le voila:
              http://cjoint.com/?3GgnOeYfBqb
          2. Le bug est corrigé mais le programme ne fait pas ce que je veux. Je m'explique, l'objectif de ce programme est de remplir la partie surligné en jaune de la manière suivante:
            Il parcourt la colonne AJ et dès qu'il trouve une case vide, il compare les cellules "Cat Name", "Name" et "Name2" de cette ligne avec le reste de la liste:
            1er cas: S'il trouve une concordance parfaite avec une autre ligne dont les cases AD:AL sont remplie, il recopie ces données.
            2ème cas: S'il trouve une concordance parfaite avec plusieurs autres lignes, il inscrit dans la case AD, le numéro des lignes trouvées.
            3ème cas: Il ne trouve rien et dans ce cas il me dit "not found" dans la case AD.

            Pour l'instant ce que j'ai essayé de faire était le premier cas, mais il ne marche (la ligne 15 devrait être complétée, mais il ne se passe rien).
            1. Le tableau servait à stocker les numéros de lignes trouvée, s'il n'avait qu'un élément on était dans le cas 1, aucun élément cas 3 et plusieurs éléments cas 2. C'est pour ça que j'ai pensé à l'utilisation d'un tableau.
            2. Re,

              1er cas : Meat and Poultry Chicken Broilers & egg-producing ce groupe de cellule est unique sur la premiere ligne vide de AJ donc ??????
            3. Donc, on le compare au reste de la liste et comme il n'y a pas d'autre ligne avec les mêmes cat name, name et name2, on écrit "not found" en AD10.
            4. En fait, dès qu'on tombe sur un AJ vide, on compare à tous les autres éléments de la liste. Si on ne trouve qu'une seule autre ligne (donc au total ça fait deux avec la ligne de référence) avec les cat name, name et name2 identiques et dont la cellule AJ N'EST PAS VIDE, alors on recopie les données qui nous intéresse.
            5. Contributeur
              Pas trop le temps de regarder dans le détail mais...
              pourquoi F6 dans :
              Set plage = Wbk.Worksheets("Structure").Range("F6:" & Range("F6").End(xlDown).Address) 
              et pas F3 ?

              et
              il compare les cellules "Cat Name", "Name" et "Name2"... qui sont en D:F
              Alors pourquoi :
                        If (Cells(i, 6).Value = cell.Value) And _  
                           (Cells(i, 5).Value = cell.Offset(0, -1).Value) And _  
                           (Cells(i, 7).Value = cell.Offset(0, 1).Value) Then
              qui sont E:G ?

              eric
          3. Je ne sais par quelle miracle, mais le 1er cas fonctionne maintenant alors que je n'ai touché à rien de plus. Je vais essayé de programmer les autres cas.
            1. Contributeur
              Bon, je te laisse avancer alors, le fichier que tu as déposé ne sera plus valable...
              eric
          4. ça y est finalement ça marche, je vous joint le code si vous voulez jetez un oeil.
            En tout cas merci beaucoup pour votre aide f894009 et eriiic.

            Sub Completor()

            Dim Wbk As Workbook
            Dim cell As Range
            Dim plage As Range
            Dim line_insertion As Integer
            Dim tab_bd
            Dim msg As String

            Set Wbk = Workbooks("Test nutrition.xls")
            Set plage = Wbk.Worksheets("Structure").Range("F3:" & Range("F3").End(xlDown).Address)

            Wbk.Worksheets("Structure").Activate

            For i = 3 To Cells(3, 6).End(xlDown).Row
            line_insertion = 0
            If Cells(i, 36) = 0 Then
            ReDim tab_bd(0)
            For Each cell In plage
            If i <> cell.Row And cell.Offset(0, 30) <> 0 Then
            If (Cells(i, 6).Value = cell.Value) And (Cells(i, 5).Value = cell.Offset(0, -1).Value) And (Cells(i, 7).Value = cell.Offset(0, 1).Value) Then
            ReDim Preserve tab_bd(line_insertion)
            tab_bd(line_insertion) = cell.Row
            line_insertion = line_insertion + 1
            Else
            Cells(i, 30).Value = "not found"
            End If
            End If
            Next cell

            If UBound(tab_bd) = 0 And line_insertion = 1 Then
            Cells(i, 30).Value = Cells(tab_bd(0), 6).Offset(0, 24).Value
            Cells(i, 31).Value = Cells(tab_bd(0), 6).Offset(0, 25).Value
            Cells(i, 32).Value = Cells(tab_bd(0), 6).Offset(0, 26).Value
            Cells(i, 33).Value = Cells(tab_bd(0), 6).Offset(0, 27).Value
            Cells(i, 34).Value = Cells(tab_bd(0), 6).Offset(0, 28).Value
            Cells(i, 35).Value = Cells(tab_bd(0), 6).Offset(0, 29).Value
            Cells(i, 36).Value = Cells(tab_bd(0), 6).Offset(0, 30).Value
            Cells(i, 37).Value = Cells(tab_bd(0), 6).Offset(0, 31).Value
            Cells(i, 38).Value = Cells(tab_bd(0), 6).Offset(0, 32).Value
            ElseIf UBound(tab_bd) > 0 Then
            For Z = 0 To UBound(tab_bd)
            msg = msg & tab_bd(Z) & ", "
            Next Z
            Cells(i, 30).Value = msg
            End If
            End If
            Next i
            End Sub
            1. Bonjour,
              Si programme termine:

              'Remplacez
              Cells(i, 30).Value = Cells(tab_bd(0), 6).Offset(0, 24).Value
              Cells(i, 31).Value = Cells(tab_bd(0), 6).Offset(0, 25).Value
              Cells(i, 32).Value = Cells(tab_bd(0), 6).Offset(0, 26).Value
              Cells(i, 33).Value = Cells(tab_bd(0), 6).Offset(0, 27).Value
              Cells(i, 34).Value = Cells(tab_bd(0), 6).Offset(0, 28).Value
              Cells(i, 35).Value = Cells(tab_bd(0), 6).Offset(0, 29).Value
              Cells(i, 36).Value = Cells(tab_bd(0), 6).Offset(0, 30).Value
              Cells(i, 37).Value = Cells(tab_bd(0), 6).Offset(0, 31).Value
              Cells(i, 38).Value = Cells(tab_bd(0), 6).Offset(0, 32).Value
              'par
              Range(Cells(tab_bd(0), 6).Offset(0, 24), Cells(tab_bd(0), 6).Offset(0, 32)).Copy Cells(i, 30)
              'ou copie sans de format cellule
              Range(Cells(i, 30), Cells(i, 38)).Value = Range(Cells(tab_bd(0), 6).Offset(0, 24), Cells(tab_bd(0), 6).Offset(0, 32)).Value

              Bonne suite