For i to next ...

Signaler
Messages postés
70
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
6 mars 2010
-
Messages postés
70
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
6 mars 2010
-
Bonjour à vous tous !
A nouveau sur le forum pour avoir solliciter encore votre aide.
Je vais tenter d'exposer ma problématique aussi clairement que possible.
Nous avons une liste qui peut varier dans laquelle nous voulons surligner un certain nombre de lignes sélectionnées selon un pas précis.
Exemple : une liste de 10 lignes, je veux 4 lignes (variable echantillon) qui seront déterminées toutes les x lignes .
x étant déterminé par le nombre de lignes (variable nombre) divisé par l'échantillon.
Ca marche à peu près avec ce bout de code , mais je voudrais que si ma liste est courte, il reprenne au début.

For i = 8 To Nombre + 7 Step Pas
          
        Rows(i).Select
        With Selection.Interior
             .ColorIndex = 6
             .Pattern = xlSolid
             .PatternColorIndex = xlAutomatic
        End With
       
     Next i

Merci encore pour votre aide.
-Dominike -

37 réponses

Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
Salut,

Tu fais un Do... Loop et tu incrémente et test i dans la boucle:

Do
    i = i + Pas
    If i > 10 Then i = 0
Loop

N'oublie pas de ressortir de la Loop une fois fini ;)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Salut
Toujours sur tes problèmes de poteaux et d'intervales ?
Tu n'as toujours pas réussit à nous faire une liste exemple de ce que tu veux réaliser.
Tes explications sont trop particulières, tu te perds à expliquer des détails ...

Sais-tu que sous Excel il y a un menu "Format", "Mise en forme automatique ..." ?

Et pourquoi pas faire simple et détaillé :
   i = 0
   For r = 8 To Nombre + 7   ' Pourquoi + 7, mystère
      i = i + 1
      If i > Pas Then i = 1
      Select Case i
         Case 1   ' 1ère ligne du groupe
            Coloriage couleur X
         Case 2   ' 2ème ligne du groupe
            Coloriage couleur Y
         Case 3, 4   ' 3ème et 4ème ligne du groupe
            Coloriage couleur Z
      ...
      End Select
   Next r

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
70
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
6 mars 2010

Merci à vous pour les tentatives de compréhension, mais mon sujet est effectivement un peu compliqué à expliquer.
J'ai des fichiers à convertir en xls et à remettre en page.
Mon fichier et les macros associées voudraient faire excatement ceci.
Ces fichiers ont chacun leur propre structure.
Le but que je recherche est identique pour chacun, mais avec des règles et variables différentes.
Ainsi. Pour un des fichiers qui peut comporter un nombre de lignes variables (variable nombre) selon les mois, un contrôle doit être réalisé selon les règles suivantes :
Exemple contrôle 2-2.
sélectionner le fichier (à partir de la combobox) 42903_22.EB4 (ici on peut repérer le fichier avec ..._22. Mise en page etc.. (ça ça va)
Il faut ensuite que la macro surligne un nombre de ligne déterminé par une variable (echantillon) tous les (variable pas) (pas = nombre total des lignes à considérer divisé par echantillon). Mais si le nombre de lignes à prendre en compte est supérieur il faut que le décompte reparte du haut.
Ex. Je dois surligner 5 lignes d'un total de 9 toutes les (arrondi 9/5). Il va donc falloir repartir du haut sinon nous n'aurons jamais les cinq échantillons.
Puis transmettre mes fichiers pour une meilleure appréhension ?
 Merci en tout cas.

-Dominike -
Messages postés
70
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
6 mars 2010

Si cela peut aider votre compréhension et m'aider par la même occasion, voici le code de mon module. Peut-être y verrez-vous clair ? :

Sub CTRL2_2()
'---- Contrôle RCIQT 2.1 -----------------------


    Application.ScreenUpdating = False
    Dim Pas As Double, Nombre As Double, CGEA As Double
   
   
    ' ----- Ouverture du fichier sélectionné  -----------------------------------
    Workbooks.OpenText Filename:=Fichier, Origin:=xlMSDOS, _
        StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
        xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, _
        Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 4), _
        Array(2, 4), Array(3, 1), Array(4, 4), Array(5, 1)), TrailingMinusNumbers:=True
    ' ------------ Détection du nombre d'affaire -----------------------------------
   
        Range("B1000").End(xlUp).Select
       
    ' --- Copie du nombre d'affaires pour détermination de la dernière variable -----
        Selection.Copy
        Range("A2").Select
        ActiveSheet.Paste
        Nombre = Range("A2").Value
       
    ' ==============================
        Range("D7").Select
        ActiveCell.FormulaR1C1 = "Date JGMT "
        Range("D7").Select
    ' ------------- Nouvelle Mise en page  ---------------------------------------
       
        ActiveWindow.ScrollRow = 1
        Cells.Select
        Application.CutCopyMode = False
    With Selection.Font
        .Name = "Times New Roman"
        .FontStyle = "Normal"
        .Size = 9
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With
    Range("A1").Select
    Columns("A:A").ColumnWidth = 12
    Columns("B:B").ColumnWidth = 12
    Columns("C:C").ColumnWidth = 52
    Columns("D:D").ColumnWidth = 10
    Columns("E:E").ColumnWidth = 22
    Columns("E:E").Select
    Selection.NumberFormat = "dd/mm/yy;@"
    With Selection
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    With ActiveSheet.PageSetup
        .PrintTitleRows = ""
        .PrintTitleColumns = ""
        .Orientation = xlLandscape
    End With
    ActiveSheet.PageSetup.PrintArea = ""
   
  
    '----------------------------------------------
        CGEA = (Echantillon)
        Pas = Round(((Nombre) / CGEA), 0)
      
    '----------------------------------------------
    For i = 8 To Nombre + 7 Step Pas

           ' parce que la première ligne du fichier qui m'intéresse est en ligne 8
           ' en ligne = nombre (le tableau attribue le N°1 à la ligne 8) + les 
           ' premières lignes

        Rows(i).Select
        With Selection.Interior
             .ColorIndex = 6
             .Pattern = xlSolid
             .PatternColorIndex = xlAutomatic
        End With
       
     Next i
 ' ---------------------------------------------------------------------
        Range("A2").Select
        ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
        ActiveWindow.Close False
End Sub

Merci pour votre patience et votre indulgence !

-Dominike -
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Re
Moi, je n'ai pas trouvé tes explications plus claires, imagine qu'on n'a pas tes données sous les yeux !
Ecris nous un exemple de données telles que tu les as dans ton dossier, en disant celle-ci est à surligner ou pas.
En regard de ces données, dis nous quelques sont tes variables clés : ton 'nombre' et ton 'Pas'
Ton code ne nous dira rien puisuq'il ne fonctionne pas (sinon, tu ne serais pas là)

"surligne un nombre de ligne déterminé par une variable (echantillon)" : Ok
Faudra t-il commencer à la première ligne ?
Disons Oui
Admettons que 'echantillon' vaille 3
Je vais donc surligner les lignes 1, 2 et 3

"tous les (variable pas)"
"pas = nombre total des lignes à considérer divisé par echantillon" :
"Nombre de lignes" : Nombre total de lignes du fichier ? Exemple : 53
"Divisé par échantillon" : Bon, 53 / 3 = 17 et quelques
Donc, je recommence le surlignage à 1 + 17 = 18ème ligne
Et je recommence à surligner 3 lignes : 18, 19 et 20
Je me redéplace à 18 + 17 = 35
Je surligne 35, 36 et 37
Je me redéplace à 35 + 17 = 52
Je surligne 52, 53 et 54
Là, comme il n'y a que 53 lignes maxi, il faudra penser à tester si le numéro de la ligne à surligner est dans la limite possible

"Mais si le nombre de lignes à prendre en compte est supérieur " : Supérieur à quoi ?
"il faut que le décompte reparte du haut" : le haut de quoi ?

Si mes exemples correspondent à ce que tu imagines, il te suffit de faire deux boucles imbriquées :
- Un "For-Next" (avec option Step) sur la vairable 'r' pour les lignes de 1 à 53 (toutes)
Exemple :
   For r = 1 To 53 Step (Int(53 / 3))   ' Le 'Int' pour oublier les virgules
   Next r
tournera avec les valeurs de r suivantes : 1, 18, 35 et 52
Super : ce sont les lignes sur lesquelles il faut commencer le surlignage !
- A chaque cycle de cette boucle, refaire une autre boucle "For-Next" qui comptera le nombre de lignes à surligner
Exemple :
   For t = r To (r + 3)
      ' Ici, coloriage
   Next t
Exemple : Si r vaut 18, t contiendra successibement 18, 19 et 20

Il ne reste plus qu'à imbriquer ces deux boucles l'une dans l'autre et à utiliser la variable t pour désigner la ligne à colorier et l'affaire est faite.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
70
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
6 mars 2010

Super fort ! Avec des explications confuses j'en conviens, une compréhension proche de la réalité :


"surligne un nombre de ligne déterminé par une variable (echantillon)" : Ok
Faudra t-il commencer à la première ligne ?
Disons Oui
Admettons que 'echantillon' vaille 3
Je vais donc surligner les lignes 1, 2 et 3non !

"tous les (variable pas)"
"pas = nombre total des lignes à considérer divisé par echantillon" :
"Nombre de lignes" : Nombre total de lignes du fichier ? Exemple : 53
"Divisé par échantillon" : Bon, 53 / 3 = 17 et quelques
Donc, je recommence le surlignage à 1 + 17 = 18ème ligne
<strike>Et je recommence à surligner 3 lignes : 18, 19 et 20
</strike>Je me redéplace à 18 + 17 = 35
Je surligne 35, 36 et 37
Je me redéplace à 35 + 17 = 52
Je surligne 52, 53 et 54
Là, comme il n'y a que 53 lignes maxi, il faudra penser à tester si le numéro de la ligne à surligner est dans la limite possible

"Mais si le nombre de lignes à prendre en compte est supérieur " : Supérieur à quoi ?
"il faut que le décompte reparte du haut" : le haut de quoi ? de ma liste

Si mes exemples correspondent à ce que tu imagines, il te suffit de faire deux boucles imbriquées :
- Un "For-Next" (avec option Step) sur la vairable 'r' pour les lignes de 1 à 53 (toutes)
Exemple :
   For r = 1 To 53 Step (Int(53 / 3))   ' Le 'Int' pour oublier les virgules
   Next r
tournera avec les valeurs de r suivantes : 1, 18, 35 et 52
Super : ce sont les lignes sur lesquelles il faut commencer le surlignage !
- A chaque cycle de cette boucle, refaire une autre boucle "For-Next" qui comptera le nombre de lignes à surligner
Exemple :
   For t = r To (r + 3)
      ' Ici, coloriage
   Next t
Exemple : Si r vaut 18, t contiendra successibement 18, 19 et 20

Il ne reste plus qu'à imbriquer ces deux boucles l'une dans l'autre et à utiliser la variable t pour désigner la ligne à colorier et l'affaire est faite.
--------------------------------
Certes je peux faire plus simple
--------------------------------
Une liste de 9
Un échantillon de 5
Je dois donc surligner 5 lignes selon un pas de 9/5 (1,8 arrondi à 2)
Ca veut dire :
Je surligne les lignes 2, 4, 6, 8 et je remonte à la ligne 1 pour avoir mon échantillon de 5. 
--------------------------------
Sûrement plus clair, non ?
Désolé de vous noyer d'informations qui polluent. Je vais m'appliquer à distinguer l'essentiel de ma problématique à l'avenir.
-Dominike -
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Re
En effet, les simples dernières lignes de ta dernière réponse nous éclaire plus que tout ce que tu as expliqué avant !
Les exemples valent parfois mieux que de longues explications.

Résumé des épisodes précédents :
   Je dois donc surligner 5 lignes selon un pas de 9/5 (1,8 arrondi à 2)
   Ca veut dire :
   Je surligne les lignes 2, 4, 6, 8 et je remonte à la ligne 1 pour avoir mon échantillon de 5

-1- Le calcul du Pas : Simple : 
   Dim Pas As Integer ' important pour les arrondis
   Pas = Nombre / Echantillons

-2- Comptage du nombre d'échantillons
Je ne connais pas ton projet mais apparemment le nombre de lignes surlignées est important.
   Dim Compteur As Integer
   Compteur = 0

-3- Faire une boucle :
Dans ton exemple, tu ne commences pas à la 1ere ligne mais la 2, c'est à dire 'Pas' :
   For r = Pas To Nombre Step Pas
      ' Ici, Coloriage de la ligne 'r'
      Compteur = Compteur + 1
   Next r

-4- Bilan :
Si le nombre de lignes colorisées est inférieure au nombre d'échantillons voulus, il faut recommencer en tête (ligne 1)
C'est à dire qu'on va refaire la même chose, mais en commençant à 1
   If Compteur < Echantillons Then
      For r = 1 To Nombre Step Pas
         ' Ici, Coloriage de la ligne 'r'
         Compteur = Compteur + 1
         ' On range les crayons de couleur si le compte est bon
         If Compteur >= Echantillons Then Exit For
      Next r
   End If

Ca devrait correspondre à ta demande, cette fois.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
Effectivement, je commence enfin à comprendre le but de cette histoire

Pour le Pas, pouquoi le déclarer en Integer? On peut très bien faire un pas qui n'est pas un entier, de cette façon on est sur d'en avoir le bon nombre en faisant la boucle une seule fois :
Dim Nombre As Integer = [Le nombre de lignes]
Dim Echantillons As Integer = [Le nombre d'échantillons qu'on veut]
Dim Pas As Double = Nombre / Echantillons

For i As Double = Pas To Nombre Step Pas
    Dim LaLigne As Integer = i  ' Pour avoir un nombre entier
    [Coloriage de la ligne LaLigne]  
Next i
Par ex pour 5 échantillons sur 9 lignes au total, ça nous donne:
1.8 = 2
3.6 = 4
5.4 = 5
7.2 = 7
9 = 9

Il y a tout de même un problème à prendre en compte: Le 9 ne sera pas pris si i vaut 9.00000001 par exemple (problème d'arrondis des nombre flotants). Plusieurs solutions, mais voici la plus simple et qui ne change pas le résultat :
For i As Double = Pas To Nombre + 0.1Step Pas

Voilà

PS. S'cuse pour la syntaxe .NET, mais tu devrais facilement pouvoir la convertir...
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
Hem, peut-être est-ce demandé d'avoir un pas régulier puis de recommencer à la 1ère ligne comme tu l'as expliqué, dans ce cas mon code ne sert à rien
Messages postés
70
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
6 mars 2010

Tout d'abord un grand merci à Jack et à Kévin.
Effectivement Kévin ton code ne correspond oas excatement à mon besoin et la soluce de Jack, qui m'a demandé quelques efforts d'adaptation me paraît fonctionner.
C'est ma foi vrai que subsiste un petit problème d'arrondi que je gère avec RoundUp, mais curieusement, il ne m'arrondi pas mon pas à l'entier supérieur mais inférieur. J'ai beau modifier As integer ou As Double, c'est idem.
Pour le fun, j'aimerai bien y parvenir.
En tout cas, Merci encore à Jack pour sa grande patience et son indulgence.

-Dominike -
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Mais de rien



 
Messages postés
70
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
6 mars 2010

Re bonjour à vous !
un peu dans le potage encore ce matin après quelques heures de nuit VBA infructueuses 
avec Dim Pas As Integer ou
         Dim Pas As Double et
Pas = Application.RoundUp((Nombre / Echantillon), 0) ou
Pas = Round((Nombre / CGEA), 0) ou
Pas = Int(Nombre / CGEA)


Je ne parviens pas à arrondir ma variable à l'entier supérieur (règle qui m'est imposée par un cahier des charges discutable, mais c'est comme ça).

Pouvez-vous m'aider encore un petit petit peu s'iou plait ?

-Dominike -
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Salut
Je ne suis pas très au fait des instructions VBA, mais "dans le temps" (lol), quand on voulait arrondir à l'entier supérieur, on ajoutait 0.5 à la valeur calculée :
Si avec 1.2 on veut un arrondi à 2 et pas 1 :
   Valeur = Int(Chiffre + 0.5)

Vois ce que tu peux en tirer.
Sinon, approfondis l'aide autour des fonctions proches de Round, tu sais, le lien "Voir aussi" dans les pages de l'aide.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
70
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
6 mars 2010

Re bonjour à vous (et le canard était toujours vivant !!!...)
Avec ce bout de code, je suis presque au bout et ceci n'aurait pas été possible sans votre aide, mais subiste un dernier problème.
Le bout de code et j'explique :
'----------------------------------------------
        Pas = Int(Nombre / Echantillon)
        If Pas <> Nombre / Echantillon Then Pas = Pas + 1
        Compteur = 0
    '----------------------------------------------
        For r = 7 + Pas To Nombre + 7 Step Pas
   ----------------------------------------------
    Ici c'est simplement parce que la première ligne qui m'intéresse dans le 
    tableau se trouve en ligne 8
   ----------------------------------------------
           Rows(r).Select
        With Selection.Interior
             .ColorIndex = 6
             .Pattern = xlSolid
             .PatternColorIndex = xlAutomatic
        End With
           Compteur = Compteur + 1
        Next r
       
      If Compteur < Echantillon Then
      For r = 8 To Nombre + 7 Step Pas
         Rows(r).Select
        With Selection.Interior
             .ColorIndex = 6
             .Pattern = xlSolid
             .PatternColorIndex = xlAutomatic
        End With
         Compteur = Compteur + 1
      '------ On range les crayons de couleur si le compte est bon
         If Compteur >= Echantillon Then Exit For
      Next r
   End If
--------------------------------------------------------------------
Si donc, j'ai une liste de 9 lignes et que ma variable Echantillon est 4
considérant un arrondi à l'entier supérieur, mon pas sera de 4.
Je surligne les 4 ème, 8ème, 12ème, 16ème lignes.
Mais il me manque un. Donc je compte 2 qui restent puis remonte en ligne 8 et dois dons surligner la deuxième ligne, dernière sélection de mon échantillon de 5 .
C'est ce dernier petit bout qui m'em... mouscaille.
Ai-je été plus clair ce coup-ci ?
Merci pour votre aide encore.
-Dominike -
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Re
<hr />        Pas = Int(Nombre / Echantillon)
        If Pas <> Nombre / Echantillon Then Pas = Pas + 1
Le If ne sert à rien. Tout dépend du type de la variable --> Dim As ?
<hr />      For r = 7 + Pas To Nombre + 7 Step Pas
Non, si tu dois décaler le n° de ta ligne, fais-le au moment d'utiliser la variable :
      Rows(r + 7).Select
<hr />Si donc, j'ai une liste de 9 lignes et que ma variable Echantillon est 4
considérant un arrondi à l'entier supérieur, mon pas sera de 4.
Non, il sera de 2
<hr />Je surligne les 4 ème, 8ème, 12ème, 16ème lignes
Ca va être dur si tu n'as que 9 lignes
<hr />Mais il me manque un. Donc je compte 2 qui restent (...)
Non, hélas, pas clair
<hr /> puis remonte en ligne 8 et dois dons surligner la deuxième ligne,
Là non plus
<hr />
Bref, si tu essayes de dire que "si la ligne est déjà surlignée, je dois surligner la suivante" alors il faut faire le test avant de surligner.
Ceci uniquement dans la deuxième partie, s'il manque des échantillons
<hr />
La prochaine fois :
- écris ta question sans la poster
- va faire pisser le chien (15 minutes)
- relis ta question : Si tu la comprends du premier coup, poste-la

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
70
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
6 mars 2010

Je n'ai pas de chien Jack, c'est peut-être pour ça...
Je corrige les erreurs  et réponds en rouge :
Re
<hr />        Pas = Int(Nombre / Echantillon)
        If Pas <> Nombre / Echantillon Then Pas = Pas + 1
Le If ne sert à rien. Tout dépend du type de la variable --> Dim As ?
<hr />      For r = 7 + Pas To Nombre + 7 Step Pas
Non, si tu dois décaler le n° de ta ligne, fais-le au moment d'utiliser la variable :
      Rows(r + 7).Select
<hr />Si donc, j'ai une liste de <strike>9</strike>18 lignes et que ma variable Echantillon est <strike>4</strike>  5
considérant un arrondi à l'entier supérieur, mon pas sera de 4.
<strike>Non, il sera de 2</strike>
<hr />Je surligne les 4 ème, 8ème, 12ème, 16ème lignes
<strike>Ca va être dur si tu n'as que 9 lignes</strike>
<hr />Mais il me manque un. Donc je compte 2 qui restent (...)
Car dernière ligne surlignée est la 16.<hr /> puis remonte en ligne 8 et dois donc compter encore 2 pour surligner la  4 ème ligne,

<hr />
C'est y mieux ????

-Dominike -
Messages postés
70
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
6 mars 2010

Je n'ai pas de chien Jack, c'est peut-être pour ça...
Je corrige les erreurs  et réponds en rouge :
Re
<hr />        Pas = Int(Nombre / Echantillon)
        If Pas <> Nombre / Echantillon Then Pas = Pas + 1
Le If ne sert à rien. Tout dépend du type de la variable --> Dim As ?
<hr />      For r = 7 + Pas To Nombre + 7 Step Pas
Non, si tu dois décaler le n° de ta ligne, fais-le au moment d'utiliser la variable :
      Rows(r + 7).Select
<hr />Si donc, j'ai une liste de <strike>9</strike>18 lignes et que ma variable Echantillon est <strike>4</strike>  5
considérant un arrondi à l'entier supérieur, mon pas sera de 4.
<strike>Non, il sera de 2</strike>
<hr />Je surligne les 4 ème, 8ème, 12ème, 16ème lignes
<strike>Ca va être dur si tu n'as que 9 lignes</strike>
<hr />Mais il me manque un. Donc je compte 2 qui restent (...)
Car dernière ligne surlignée est la 16.<hr /> puis remonte en ligne 8 et dois donc compter encore 2 pour surligner la  <strike>4 ème ligne</strike><strike>,</strike>  NON Pardon la 2ème ligne de ma liste (soit, la liste commence à la ligne 8, la ligne 10)

J'ai emprunté un chien..........

-Dominike -
Messages postés
70
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
6 mars 2010

Bonsoir à tous, je m'acharne mais fatigue un peu...
Pour reprendre mon problème
Ce code fonctionne. Ce n'est sûrement pas très joli,  mais ça marche !
'----------------------------------------------
        Pas = Int(Nombre / Echantillon)
        If Pas <> Nombre / Echantillon Then Pas = Pas + 1    
        Compteur = 0
    '----------------------------------------------
        For r = 7 + Pas To Nombre + 7 Step Pas
           Rows(r).Select
        With Selection.Interior
             .ColorIndex = 6
             .Pattern = xlSolid
             .PatternColorIndex = xlAutomatic
        End With
           Compteur = Compteur + 1
        Next r
       
      If Compteur < Echantillon Then
      For r = 8 + (CGEA - (Pas - 1)) To Nombre + 7 Step Pas
         Rows(r).Select
        With Selection.Interior
             .ColorIndex = 6
             .Pattern = xlSolid
             .PatternColorIndex = xlAutomatic
        End With
         Compteur = Compteur + 1
      '------ On range les crayons de couleur si le compte est bon
         If Compteur >= Echantillon Then Exit For
      Next r
   End If
'------------------------------------------------------------------------------
Mais ce serait trop simple, car ça me surligne une ligne déjà prise en compte au premier tour. Je voudrais que dans cette hypothèse, il prenne la suivante.
Je fais de mon mieux pour avancer seul, mais j'ai encore besoin d'aide.
Merci à vous !
 

-Dominike -
Messages postés
70
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
6 mars 2010

Bonsoir à tous, je m'acharne mais fatigue un peu...
Pour reprendre mon problème
Ce code fonctionne. Ce n'est sûrement pas très joli,  mais ça marche !
'----------------------------------------------
        Pas = Int(Nombre / Echantillon)
        If Pas <> Nombre / Echantillon Then Pas = Pas + 1    
        Compteur = 0
    '----------------------------------------------
        For r = 7 + Pas To Nombre + 7 Step Pas
           Rows(r).Select
        With Selection.Interior
             .ColorIndex = 6
             .Pattern = xlSolid
             .PatternColorIndex = xlAutomatic
        End With
           Compteur = Compteur + 1
        Next r
       
      If Compteur < Echantillon Then
      For r = 8 + (Echantillon - (Pas - 1)) To Nombre + 7 Step Pas
         Rows(r).Select
        With Selection.Interior
             .ColorIndex = 6
             .Pattern = xlSolid
             .PatternColorIndex = xlAutomatic
        End With
         Compteur = Compteur + 1
      '------ On range les crayons de couleur si le compte est bon
         If Compteur >= Echantillon Then Exit For
      Next r
   End If
'------------------------------------------------------------------------------
Mais ce serait trop simple, car ça me surligne une ligne déjà prise en compte au premier tour. Je voudrais que dans cette hypothèse, il prenne la suivante.
Je fais de mon mieux pour avancer seul, mais j'ai encore besoin d'aide.
Merci à vous !

-Dominike -
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
Tu peux faire un test dans
ta 2ème boucle pour voir si ta ligne est déjà surligné, et ne pas la
prendre en compte dans ce cas. Le problème, que faire si on ne tombe
sur plus aucune ligne à l'état normal?

Dim r As Integer


= 7 + Pas







Do


    Rows(r).Select
    If Selection.Interior.ColorIndex = 6
       ' Cette ligne est déjà surligné, passer à la prochaine
       r = r + 1
    Else
        ' Surligner cette ligne
        With Selection.Interior
            .ColorIndex = 6
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
        End With
        ' Incrémenter le compteur et passer au prochain
        Compteur = Compteur + 1
        r = r + Pas
    End If

    If r >
Nombre + 7 Then r = 8 + (
Echantillon - (Pas - 1))
    If Compteur >= Echantillon Then Exit Do





Loop





Dans ce cas, ça passe simplement a la prochaine ligne. Mais le pas suivant sera alors fais par rapport à la ligne qui a été surligné, et pas celle qui aurait du être surligné. Si ça ne doit pas faire ça, je propose 2 boucles imbriquées (la 1ère qui fais le pas, la 2ème qui cherche la prochaine ligne non surligné)...

C'est quoi précisément le résultat voulu, le but? Pourquoi avoir un pas fixe, pourquoi commencer à "Pas" pour la 1ère boucle et à 1 pour la deuxième, et pourquoi ne pas simplement prendre 'n' échantillions au hasard dans la liste?