Comment faire une boucle à longueur variable for... to [Résolu/Fermé]

Signaler
-
Messages postés
2
Date d'inscription
lundi 8 février 2016
Statut
Membre
Dernière intervention
8 février 2016
-
Bonjour,

Je me permets de m'adresser à vous car je ne trouve pas de solution à mon problème.

En fait, j'ai un tableau dans lequel j'exécute une fonction split.
J'ai un texte très long dans une cellule que je souhaite spliter en plusieurs cellules.
Tout va bien jusque là.

Seulement, j'aimerais à l'aide d'une macro que tout le tableau soit vérifier si il ne doit pas spliter une cellule.

J'ai donc une boucle mais qui devrait être variable.
Voilà mon code :


Sub textedescauto()
Dim n As Integer
Dim derlig As Variant
Dim recherche As Variant
Dim valeura As String

derlig = Sheets("Prix NET").Range("tableau1").Find("*", , , , , xlPrevious).Row
'Call Module3.EnregistrerTableau1

For n = 15 To derlig

    recherche = Application.VLookup(Sheets("Prix NET").Range("A" & n).Value, Sheets("Textes descriptifs").Range("Tableau3"), 1, False)
   On Error Resume Next
   
   If recherche = Error Then
   
   Else
     valeura = Sheets("Prix NET").Range("a" & n).Value
     If UCase(Sheets("Prix NET").Range("A" & n).Value) = UCase(recherche) Then
     Rows(n + 1).Insert
     Range("A" & n + 1).Value = Range("A" & n).Value
     Range("D" & n + 1).Value = "TD"
     n = n + 1
     y = n
     Call Module3.splittestprovi
     
     End If
    
    End If
    
    derlig = Sheets("Prix NET").Range("tableau1").Find("*", , , , , xlPrevious).Row
 
   
 Next n
 
End Sub

Sub splittestprovi()
'Scinde les cellules tous les ALT-Enter
'insère une ligne dans le tableau pour les nouvelles cellules
'insère une ligne dans la page proposition pour ne pas que le tableau soit trop petit
    
    Dim txt As String
    Dim i As Integer
    Dim n As Integer
    Dim Fullname As Variant
    Dim vide As Variant
        
    'déverouille la feuille
    
    'bloque le screenupdating pour ne pas ralentir et voir l'écran bouger tout seul
    
    Application.ScreenUpdating = False
    
    txt = Range("B" & y).Value

    Fullname = Split(txt, Chr(10))
    vide = " "
    For n = y To UBound(Fullname) + y
        Rows(n + 1).Insert
        Sheets("Proposition").Rows(n + 1).Insert
        Cells(i + y, 2).Value = Fullname(i)
        i = i + 1
    Next n
     
    'réactive le screenupdating
    Application.ScreenUpdating = True
    
    'reverouille la feuille
        
  
End Sub


Dans le fonctionnement du code, il commence au départ par rechercher l'existence d'une valeur dans une autre feuille afin d'exécuter la suite ou non.

Dans le cas où ma valeur est trouvée, il insère une ligne dans mon tableau et rajoute du texte dans la colonne 1 et 4.
J'ai une formule dans mon tableau qui rempli la colonne 2 automatiquement en fonction de ces variables (colonne 1 et 4).

La macro splitest fonctionne très bien mais comme elle insère des lignes dans mon tableau lors de son exécution, la taille de mon tableau initial varie.

Du coup, ma première macro s'arrête trop tot. Il faudrait pouvoir réactualiser la boucle en cours de fonctionnement... Mais je ne sais pas comment faire.

J'espère avoir pu m'exprimer correctement, ce n'est pas simple ^^

Merci


EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

Merci d'y penser dans tes prochains messages.

2 réponses

Messages postés
12185
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
21 septembre 2020
2 487
Bonjour,

Avec une variable déclarée au niveau module, tu peux la "réduire" dans toutes les procédures du module.

Regarde cet exemple, dans un nouveau classeur :
Option Explicit

Dim i As Integer

Sub test()
Dim cpt As Integer, monBool As Boolean
monBool = False
For i = 1 To 5
   Test_2 monBool
   MsgBox "i vaut : " & i
   cpt = cpt + 1
   If cpt = 3 Then monBool = True
Next
End Sub

Sub Test_2(Flag As Boolean)
If Not Flag Then i = 1
End Sub

Messages postés
2
Date d'inscription
lundi 8 février 2016
Statut
Membre
Dernière intervention
8 février 2016

J'ai du mal à comprendre ton code, j'ai testé, mais je comprends pas bien l'application du Flag.

Je comprends la logique de ton code qui maintient la valeur du i basse de manière à ne pas avancer dans le tableau.

Par contre, en quelque sorte ce que je souhaiterais faire varier moi c'est le "5" quand tu dis

for i = 1 to 5

C'est ce 5 qui change au fur et a mesure que j'ai inséré des lignes dans mon tableau. C'est à dire qu'après avoir inséré 10 lignes par exemple, il faudrait que je puisse transformer mon for i = 1 to 5 en

for i = 1 to 15

et qu'il continue à exécuter ma macro jusque 15 et pas jusque 5.

Au besoin, je peux éventuellement fournir mon fichier en mp

merci
Messages postés
12185
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
21 septembre 2020
2 487
J'ai dit des bêtises.
En fait, ton souci est ici, dans ta première macro :

Au lieu boucler de n = 15 To derlig, essaie l'invers
For n = derlig To 15 Step -1

Et s'il le faut, ajoute 1 à n quand nécessaire (n = n + 1)
Messages postés
2
Date d'inscription
lundi 8 février 2016
Statut
Membre
Dernière intervention
8 février 2016
>
Messages postés
12185
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
21 septembre 2020

Super !! Un tout grand merci !
C'était tout con en fait ... Pourquoi vouloir aller d'un point A à un point B variable alors que le chemin inverse est nettement plus simple ^^

(ps est il possible de modifier mon premier post ? je n'étais pas encore enregistrer sur le forum)