Parcourir un tableau recursivement

Parcourir un tableau recursivement - VB/VBA/VBS - Programmation

Marsh Posté le 25-01-2010 à 13:56:55    

Bonjour,
 
Je souhaire en VBA uniquement pouvoir generer un tableau dynamiquement.
 
Je connais :
 

  • Taille de départ (8,8)
  • Tableau à 2 dimensions


Je voudrai lire les valeurs de ce tableau et comparer chaque ligne.
Si une ligne ENTIERE est > à une ligne --> on supprimer la ligne et la colonne correspondante
 
Exemple :
 

Code :
  1. ligne 1 : 1 1 1 1 1 1 1 1
  2. ligne 2 : 2 2 2 2 2 2 2 2
  3. ligne 3 : 0 0 0 0 0 0 0 0
  4. .....


 
Je parcours mon tableau :  
 
Premier passage : on compare ligne1 et ligne2 --> ligne 1 est inférieur.
Deuxieme passage : on compare ligne1 et ligne3 --> toute la ligne 1 est superieur à la ligne 3
 
Donc je veux regénérer un tableau sans la ligne 3 et ni la colonne 3 ce qui veut dire que mon tableau devient en dimension (7,7).
Et je recommence jusqu'a ce qu'il n'y est plus de ligne superieur.
 
 
Je n'y arrive pas algorythmiquement
Je peche sur comment generer le tableau
 
 
Je pensai à un programme principal  avec 2 fonction
 

  • fonction LireTableau()  avec un "if" --> si toute la ligne < ligne comparer alors GenererTableau(tab,ligne,colonne)  


 

  • fonction GenereTableau(AncienTableau(),colonneEnlever,ligneEnlever)


Un petit coup de pouce...  
 
 
 
 
 
 

Reply

Marsh Posté le 25-01-2010 à 13:56:55   

Reply

Marsh Posté le 25-01-2010 à 14:05:04    

Pas besoin de récursion. Deux boucles imbriquées suffisent :
 
1. Loop until on n'a rien trouvé à supprimer
2. Loop from 1 to n until il faut supprimer quelque chose

Reply

Marsh Posté le 25-01-2010 à 14:20:07    

Comment je fais alors pour relire mon tableau  avec les nouvelles valeurs?
Ce que je cherche à faire c'est comment regenerer le tableau en fait sans les valeurs de la ligneSupprime et la colonneSupprime
 
LireTableau
 
Parcourir tableau(i,j)
Si tableau(i,j) > tableau (i+1,j+1)
 genererUnNouveauTableau(sans la ligne i+1 et colonne j+1)
FinSi
 
 

Reply

Marsh Posté le 25-01-2010 à 14:43:43    

Quel genre de tableau est-ce ?
Un tableau d'entiers basic, ou un tableau Excel, ou une table Access ?
 
Si c'est un tableau basic, on supprime une ligne (ou une colonne) en faisant un décalage, lequel se fait en recopiant la ligne (ou la colonne) suivante à l'emplacement de la ligne (ou de la colonne) suprimée, idem pour la ligne (ou la colonne) voisine, etc., et on diminue le nombre total de lignes (ou de colonnes). On peut faire un redim, mais ce n'est peut-être pas nécessaire.

Reply

Marsh Posté le 25-01-2010 à 14:51:16    

Au final ca sera un tableau excel...
 
Mais je veux pouvoir le faire avec un tableau d'entier basic
Justement c'est ça que je n'arrive pas à faire.

Reply

Marsh Posté le 25-01-2010 à 15:14:22    

Avec un tableau Excel, c'est plus facile, car il existe des commandes pour effacer une ligne (ou une colonne), et on n'a donc pas besoin de programmer le décalage.
 
Qu'est qui est difficile ?
L'algorithme a été défini. Chaque partie de l'algorithme est faisable. Où est le blocage ? Dans quel partie ?

Reply

Marsh Posté le 25-01-2010 à 17:20:10    

olivthill a écrit :

Avec un tableau Excel, c'est plus facile, car il existe des commandes pour effacer une ligne (ou une colonne), et on n'a donc pas besoin de programmer le décalage.
 
Qu'est qui est difficile ?
L'algorithme a été défini. Chaque partie de l'algorithme est faisable. Où est le blocage ? Dans quel partie ?


 
Genre avec un Worksheets.range(H6).value = null  ?
 
Mieux montrer mon sale code...  et je pense que tu vas vite comprendre pourquoi je m'embrouille...
 
JE fais plein de SI imbriquer...  
 
 
 

Code :
  1. m = 0
  2. Dim ligne0()
  3. Dim ligne1()
  4. Dim ligne2()
  5. Dim ligne3()
  6. Dim ligne4()
  7. Dim ligne5()
  8. Dim ligne6()
  9. Dim ligne7()
  10. Dim ligne0_active As Boolean
  11. Dim ligne1_active As Boolean
  12. Dim ligne2_active As Boolean
  13. Dim ligne3_active As Boolean
  14. Dim ligne4_active As Boolean
  15. Dim ligne5_active As Boolean
  16. Dim ligne6_active As Boolean
  17. Dim ligne7_active As Boolean
  18. Dim trouver As Boolean
  19. Dim sortir_comparaison As Boolean
  20. Dim nbrLigne As Integer
  21. Dim tour As Integer
  22. Dim tour0 As Integer
  23. Dim tour1 As Integer
  24. Dim tour2 As Integer
  25. Dim tour3 As Integer
  26. Dim tour4 As Integer
  27. Dim tour5 As Integer
  28. Dim tour6 As Integer
  29. Dim tour7 As Integer
  30. nbrLigne = 7
  31. For m = 0 To 7
  32. tour0 = 0
  33. tour1 = 0
  34. tour2 = 0
  35. tour3 = 0
  36. tour4 = 0
  37. tour5 = 0
  38. tour6 = 0
  39. tour7 = 0
  40. tour = 0
  41. trouver = False
  42. sortir_comparaison = False
  43. ligne0_active = True
  44. ligne1_active = True
  45. ligne2_active = True
  46. ligne3_active = True
  47. ligne4_active = True
  48. ligne5_active = True
  49. ligne6_active = True
  50. ligne7_active = True
  51. p = 0
  52. l = -2
  53. k = 6
  54. k2 = 0
  55. i = 0
  56.     For i = 0 To nbrLigne
  57.     l = l + 2
  58.         ReDim Preserve ligne0(i)
  59.         ReDim Preserve ligne1(i)
  60.         ReDim Preserve ligne2(i)
  61.         ReDim Preserve ligne3(i)
  62.         ReDim Preserve ligne4(i)
  63.         ReDim Preserve ligne5(i)
  64.         ReDim Preserve ligne6(i)
  65.         ReDim Preserve ligne7(i)
  66.    
  67. 'ICI JE REGARDE SI LA LIGNE EST ACTIVE ET SI LA CELLULE NE CONTIENT PAS "-" ALORS J'INCERE DANS LE TABLEAU LA VALEUR
  68.         If ligne0_active = True & ActiveSheet.Range(colonne(l) & k + 0) <> "-" Then
  69.             ligne0(i) = ActiveSheet.Range(colonne(l) & k + 0)
  70.         End If
  71.        
  72.         If ligne1_active = True & ActiveSheet.Range(colonne(l) & k + 1) <> "-" Then
  73.             ligne1(i) = ActiveSheet.Range(colonne(l) & k + 1)
  74.         End If
  75.        
  76.         If ligne2_active = True & ActiveSheet.Range(colonne(l) & k + 2) <> "-" Then
  77.             ligne2(i) = ActiveSheet.Range(colonne(l) & k + 2)
  78.         End If
  79.        
  80.         If ligne3_active = True & ActiveSheet.Range(colonne(l) & k + 3) <> "-" Then
  81.             ligne3(i) = ActiveSheet.Range(colonne(l) & k + 3)
  82.         End If
  83.            
  84.         If ligne4_active = True & ActiveSheet.Range(colonne(l) & k + 4) <> "-" Then
  85.             ligne4(i) = ActiveSheet.Range(colonne(l) & k + 4)
  86.         End If
  87.            
  88.         If ligne5_active = True & ActiveSheet.Range(colonne(l) & k + 5) <> "-" Then
  89.             ligne5(i) = ActiveSheet.Range(colonne(l) & k + 5)
  90.         End If
  91.            
  92.         If ligne6_active = True & ActiveSheet.Range(colonne(l) & k + 6) <> "-" Then
  93.              ligne6(i) = ActiveSheet.Range(colonne(l) & k + 6)
  94.         End If
  95.            
  96.         If ligne7_active = True & ActiveSheet.Range(colonne(l) & k + 7) <> "-" Then
  97.             ligne7(i) = ActiveSheet.Range(colonne(l) & k + 7)
  98.         End If
  99.            
  100.     Next i
  101. i = 0
  102.     For i = 0 To nbrLigne
  103.    
  104.         If trouver = False Then
  105.        
  106.             'ligne1
  107.              If ligne0(i) >= ligne1(i) Then
  108.                 If sortir_comparaison = False Then
  109.                     If ligne1_active = True Then
  110.                         If tour1 = 7 Then
  111.                             For j = 0 To 7
  112.                                 ligne1(j) = "-"
  113.                                 ActiveSheet.Range(colonne(j * 2) & k + 1).Value = "-"
  114.                                 k2 = k + j
  115.                                 ActiveSheet.Range("L" & k2).Value = "-"
  116.                                 ligne1_active = False
  117.                                 trouver = True
  118.                                 sortir_comparaison = True
  119.                                
  120.                             Next j
  121.                             nbrLigne = nbrLigne - 1
  122.                         Else
  123.                             tour1 = tour1 + 1
  124.                         End If
  125.                     End If
  126.                 End If
  127.             End If
  128.            
  129.             'ligne2
  130.             If (ligne0(i) >= ligne2(i)) Then
  131.                 If sortir_comparaison = False Then
  132.                     If ligne2_active = True Then
  133.                         If tour2 = 7 Then
  134.                             For j = 0 To 7
  135.                                 ligne2(j) = "-"
  136.                                 ActiveSheet.Range(colonne(j * 2) & k + 2).Value = "-"
  137.                                 k2 = k + j
  138.                                 ActiveSheet.Range("N" & k2).Value = "-"
  139.                                 ligne2_active = False
  140.                                 trouver = True
  141.                                 sortir_comparaison = True
  142.                                
  143.                             Next j
  144.                             nbrLigne = nbrLigne - 1
  145.                         Else
  146.                             tour2 = tour2 + 1
  147.                         End If
  148.                     End If
  149.                 End If
  150.             End If
  151.            
  152.             'ligne3
  153.             If (ligne0(i) >= ligne3(i)) Then
  154.                 If sortir_comparaison = False Then
  155.                     If ligne3_active = True Then
  156.                         If tour3 = 7 Then
  157.                             For j = 0 To 7
  158.                                 ligne3(j) = "-"
  159.                                 ActiveSheet.Range(colonne(j * 2) & k + 3).Value = "-"
  160.                                 k2 = k + j
  161.                                 ActiveSheet.Range("P" & k2).Value = "-"
  162.                                 ligne3_active = False
  163.                                 trouver = True
  164.                                 sortir_comparaison = True
  165.                            
  166.                             Next j
  167.                             nbrLigne = nbrLigne - 1
  168.                         Else
  169.                             tour3 = tour3 + 1
  170.                         End If
  171.                     End If
  172.                 End If
  173.             End If
  174.            
  175.             'ligne4
  176.             If ligne0(i) >= ligne4(i) Then
  177.                 If sortir_comparaison = False Then
  178.                     If ligne4_active = True Then
  179.                         If tour4 = 7 Then
  180.                             For j = 0 To 7
  181.                                 ligne4(j) = "-"
  182.                                 ActiveSheet.Range(colonne(j * 2) & k + 4).Value = "-"
  183.                                 k2 = k + j
  184.                                 ActiveSheet.Range("R" & k2).Value = "-"
  185.                                 ligne4_active = False
  186.                                 trouver = True
  187.                                 sortir_comparaison = True
  188.                                
  189.                             Next j
  190.                             nbrLigne = nbrLigne - 1
  191.                         Else
  192.                             tour4 = tour4 + 1
  193.                         End If
  194.                     End If
  195.                 End If
  196.             End If
  197.            
  198.             'ligne5
  199.             If (ligne0(i) >= ligne5(i)) Then
  200.                 If sortir_comparaison = False Then
  201.                     If ligne5_active = True Then
  202.                         If tour5 = 7 Then
  203.                             For j = 0 To 7
  204.                                 ligne5(j) = "-"
  205.                                 ActiveSheet.Range(colonne(j * 2) & k + 5).Value = "-"
  206.                                 k2 = k + j
  207.                                 ActiveSheet.Range("T" & k2).Value = "-"
  208.                                 ligne5_active = False
  209.                                 trouver = True
  210.                                 sortir_comparaison = True
  211.                                
  212.                             Next j
  213.                             nbrLigne = nbrLigne - 1
  214.                         Else
  215.                             tour5 = tour5 + 1
  216.                         End If
  217.                     End If
  218.                 End If
  219.             End If
  220.            
  221.             'ligne6
  222.             If (ligne0(i) >= ligne6(i)) Then
  223.                 If sortir_comparaison = False Then
  224.                     If ligne6_active = True Then
  225.                         If tour6 = 7 Then
  226.                             For j = 0 To 7
  227.                                 ligne6(j) = "-"
  228.                                 ActiveSheet.Range(colonne(j * 2) & k + 6).Value = "-"
  229.                                 k2 = k + j
  230.                                 ActiveSheet.Range("V" & k2).Value = "-"
  231.                                 ligne6_active = False
  232.                                 trouver = True
  233.                                 sortir_comparaison = True
  234.                                
  235.                             Next j
  236.                             nbrLigne = nbrLigne - 1
  237.                         Else
  238.                             tour6 = tour6 + 1
  239.                         End If
  240.                     End If
  241.                 End If
  242.             End If
  243.            
  244.             'ligne7
  245.             If (ligne0(i) >= ligne7(i)) Then
  246.                 If sortir_comparaison = False Then
  247.                     If ligne7_active = True Then
  248.                         If tour7 = 7 Then
  249.                             For j = 0 To 7
  250.                                 ligne1(j) = "-"
  251.                                 ActiveSheet.Range(colonne(j * 2) & k + 7).Value = "-"
  252.                                 k2 = k + j
  253.                                 ActiveSheet.Range("Y" & k2).Value = "-"
  254.                                 ligne7_active = False
  255.                                 trouver = True
  256.                                 sortir_comparaison = True
  257.                                
  258.                             Next j
  259.                             nbrLigne = nbrLigne - 1
  260.                         Else
  261.                             tour7 = tour7 + 1
  262.                         End If
  263.                     End If
  264.                 End If
  265.             End If
  266.            
  267.            
  268.         End If
  269.        
  270.    
  271.     Next i
  272. Next m


Reply

Marsh Posté le 26-01-2010 à 13:19:02    

olivthill a écrit :

Pas besoin de récursion. Deux boucles imbriquées suffisent :
 
1. Loop until on n'a rien trouvé à supprimer
2. Loop from 1 to n until il faut supprimer quelque chose


 Loop from 1 to n unti  
 
n represente quoi...
 
BOn j'ai recommencé un exemple test mais je ne vois pas ou est ce que je dois supprimer une ligne :
 

Code :
  1. Do While ligneASupprimer = True
  2.         Do While resultatLigne > resultatLigneCompare
  3.        
  4.             If nouveau(numeroLigne, numeroColonne) > nouveau(numeroLigneCompare + 1, numeroColonne) Then
  5.            
  6.             End If
  7.            
  8.         Loop
  9.     Loop


Message édité par PsYKrO_Fred le 26-01-2010 à 13:20:33
Reply

Marsh Posté le 26-01-2010 à 15:36:57    

Voici le code qui correspond à l'exemple, mais il faudra peut-être l'adapter un peu.

Sub ReduireTableau()
  nb_col = 8
  nb_lig = 8
  ' 1. Loop until on n'a rien trouvé à supprimer
  Do
    qqchose_a_sup = False
    ' 2. Loop from 1 to n until il faut supprimer quelque chose
    For i = 2 To nb_lig
      ' Voir si la première ligne est superieure à la ligne en cours
      est_sup = True
      For j = 1 To nb_col
         If (Cells(1, j) <= Cells(i, j)) Then
           est_sup = False
           Exit For
         End If
      Next j
      If (est_sup = True) Then
        Cells(i, 1).EntireRow.Delete
        nb_lig = nb_lig - 1
        Cells(1, i).EntireColumn.Delete
        nb_col = nb_col - 1
        qqchose_a_sup = True
        Exit For
      End If
    Next i
  Loop While qqchose_a_sup = True
End Sub


Reply

Marsh Posté le 26-01-2010 à 18:55:15    

olivthill a écrit :

Voici le code qui correspond à l'exemple, mais il faudra peut-être l'adapter un peu.

Sub ReduireTableau()
  nb_col = 8
  nb_lig = 8
  ' 1. Loop until on n'a rien trouvé à supprimer
  Do
    qqchose_a_sup = False
    ' 2. Loop from 1 to n until il faut supprimer quelque chose
    For i = 2 To nb_lig
      ' Voir si la première ligne est superieure à la ligne en cours
      est_sup = True
      For j = 1 To nb_col
         If (Cells(1, j) <= Cells(i, j)) Then
           est_sup = False
           Exit For
         End If
      Next j
      If (est_sup = True) Then
        Cells(i, 1).EntireRow.Delete
        nb_lig = nb_lig - 1
        Cells(1, i).EntireColumn.Delete
        nb_col = nb_col - 1
        qqchose_a_sup = True
        Exit For
      End If
    Next i
  Loop While qqchose_a_sup = True
End Sub




 
 
Merci beaucoup je pense que je dois l'adapter evidemment mais je ne vois pas à quel moment tu lui passe les valeurs du tableau en fait...  
 
Dois je remplacer Cells(1,j) avec Tableau(i,j) ?

Reply

Marsh Posté le 26-01-2010 à 18:55:15   

Reply

Marsh Posté le 27-01-2010 à 09:46:51    

Citation :

Dois je remplacer Cells(1,j) avec Tableau(i,j) ?


Ca dépend dans quellle ligne.
 
Dans la ligne If (Cells(1, j) <= Cells(i, j)) Then , Cells(1, j) désigne le contenu de la cellule de la ligne 1, colonne j. Donc, ici, on peut effectivement remplacer la cellule Excell par une cellule de tableau basic.
 
Dans la ligne Cells(i, 1).EntireRow.Delete, Cells(i, 1) désigne un objet qui n'a pas d'équivalent en basic. Cette ligne devra être remplacée par une boucle pour faire le décalage dont je parlais plus haut.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed