comment faire une boucle un nb de fois variable ?

Phillip

XLDnaute Occasionnel
Bonjour,

Voilà mon problème. Je vérifie dans un tableau que chaque colonne ne comporte pas plus de x ligne (ici 50). Si elle en comporte plus de 50, j'en laisse 50 et j'insére 3 colonne et je colle le surplus, et je recommence....Mon problème c'est que je fais un boucle un nombre de fois maximum, qui ne peux être connu QU'APRES avoir inséré toutes mes colonnes....! J'ai mis, (voir ci-dessous) que ma boucle s'execute 1 fois, puis juste avant le next, j'incrémente ma valeur max...mais ma boucle ne s'éxecute qu'une fois !! Comment faire simplement, sans tout réécrire ? Merci !!


' boucle pour compter le nombre de lignes, trier et rajouter des colonnes
col = 1
newboucle2 = 1
For I = 1 To newboucle2
plig = 4
'compter le nombre de lignes, pour décider de séparer ou pas
Set AC = Cells(plig, col)
While AC <> ''
plig = plig + 1
Set AC = Cells(plig, col)
Wend

nblig = plig - 1


'Si j'ai moins 50 lignes, je trie simplement
If nblig <= 50 Then
Set sort150 = Range(Cells(4, col), Cells(2000, col + 1))
sort150.Select
Selection.Sort Key1:=sort150, Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

'pour couper et coller les lignes en trop
Else
Cells(4, col + 3).Select
Selection.EntireColumn.Insert
Selection.ColumnWidth = 26.29
Cells(4, col + 4).Select
Selection.EntireColumn.Insert
Selection.ColumnWidth = 17.29
Cells(4, col + 5).Select
Selection.EntireColumn.Insert
Selection.ColumnWidth = 3.5
Range(Cells(51, col), Cells(nblig, col + 1)).Select
Selection.Cut
Cells(4, col + 3).Select
ActiveSheet.Paste
Range(Cells(3, col + 3), Cells(3, col + 4)).Value = entetecol
End If


'boucle pour compter le nombre de colonnes apres insertion de colonnes
Dim newboucle2max As Range
Set newboucle2max = Cells(4, newboucle2)
While newboucle2max <> ''
newboucle2 = newboucle2 + 3
Set newboucle2max = Cells(4, newboucle2)
Wend
newboucle2 = newboucle2 - 2


col = col + 3


nblig = 0
Next
 

Hervé

XLDnaute Barbatruc
Re:comment faire une boucle un nb de fois variable

Bonjour

une proposition en pièce jointe,

désolé, mais je ne sais pas travailler avec les macros des autres, alors j'ai fait à ma manière :eek:

je limite le travail de la macro à 50 colonnes, à toi d'adapter.

j'espère que j'ai pas encore commis une zopette, sinon je suis bon pour payer ma tournée de duvel :)

Option Explicit
Sub Bouton2_QuandClic()
Dim i As Byte
Dim derligne As Integer

For i = 1 To 50
If Cells(4, i) <> '' Then
&nbsp; &nbsp; derligne = Cells(65536, i).End(xlUp).Row
&nbsp; &nbsp;
If derligne <= 50 Then
&nbsp; &nbsp; &nbsp; &nbsp; trier (i)
&nbsp; &nbsp;
Else
&nbsp; &nbsp; &nbsp; &nbsp; Columns(i + 1).Insert
&nbsp; &nbsp; &nbsp; &nbsp; Range(Cells(51, i), Cells(derligne, i)).Cut Cells(4, i + 1)
&nbsp; &nbsp; &nbsp; &nbsp; trier (i)
&nbsp; &nbsp;
End If
End If
Next i
End Sub

Public Function trier(i)
Range(Cells(4, i), Cells(50, i)).Sort Key1:=Cells(4, i), Order1:=xlAscending, Header:=xlGuess, _
&nbsp; &nbsp; &nbsp; &nbsp; OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
&nbsp; &nbsp; &nbsp; &nbsp; DataOption1:=xlSortNormal
End Function


Salut
[file name=Classeur1_20050520111229.zip size=12689]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Classeur1_20050520111229.zip[/file]
 

Pièces jointes

  • Classeur1_20050520111229.zip
    12.4 KB · Affichages: 15

Phillip

XLDnaute Occasionnel
Re:comment faire une boucle un nb de fois variable

Génial ! Concis, efficace ! Merci !

Je ne connaissait pas :

1) Cells(65536, i).End(xlUp).Row
2) Range(Cells(51, i), Cells(derligne, i)).Cut Cells(4, i + 1)...

Cependant, la macro ne marche que si on retire DataOption1:=xlSortNormal des paramètres de tri...

La seule chose qui me gêne dans le postulat c'est que i=50, c'est à dire à la fois la limite max de colonnes et de lignes.

Si je voulais avoir un max de 100 lignes, ou pourquoi pas 95 (je ne sais pas ce que mon client (mon père ;) veut), je ne peux pas traiter 100 ou 95 fois mes colonnes, car j'en insère 3 à chaque fois, et je plante à la colonne 256 du tableau....

Jai contourné le problème en utilisant un do....while, et en incrémentant i de3 à chaque fois (sinon mon i+1 n'atteignait jamais ma valuer max, et je plantait en bord de feuille également...

C'est moins beau, plus long, mais ça marche (je crois !)

' boucle pour compter le nombre de lignes, trier et rajouter des colonnes
col = 1
newboucle2 = 1
I = 1
Do While I <= newboucle2
plig = 4
'compter le nombre de lignes, pour décider de séparer ou pas
Set AC = Cells(plig, col)
While AC <> ''
plig = plig + 1
Set AC = Cells(plig, col)
Wend

nblig = plig - 1


'Si j'ai moins 50 lignes, je trie simplement
If nblig <= 50 Then
Set sort150 = Range(Cells(4, col), Cells(2000, col + 1))
sort150.Select
Selection.Sort Key1:=sort150, Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

'pour couper et coller les lignes en trop
Else
Cells(4, col + 3).Select
Selection.EntireColumn.Insert
Selection.ColumnWidth = 26.29
Cells(4, col + 4).Select
Selection.EntireColumn.Insert
Selection.ColumnWidth = 17.29
Cells(4, col + 5).Select
Selection.EntireColumn.Insert
Selection.ColumnWidth = 3.5
Range(Cells(51, col), Cells(nblig, col + 1)).Select
Selection.Cut
Cells(4, col + 3).Select
ActiveSheet.Paste
Range(Cells(3, col + 3), Cells(3, col + 4)).Value = entetecol
End If
'boucle pour compter le nombre de colonnes apres insertion de colonnes
Dim newboucle2max As Range
Set newboucle2max = Cells(4, newboucle2)
While newboucle2max <> ''
newboucle2 = newboucle2 + 3
Set newboucle2max = Cells(4, newboucle2)
Wend
newboucle2 = newboucle2 - 2



col = col + 3


nblig = 0
I = I + 3
Loop
 

Robert

XLDnaute Barbatruc
Repose en paix
Re:comment faire une boucle un nb de fois variable

Salut Philip, Hervé, le forum,

Trop fort et trop rapide ce Hervé... Il m'énerve... Inspiré de son superbe travail voici une macro qui te permet de déterminer le nombre maximum de lignes et qui vérifie si le nombre choisi est acceptable par rapport au nombre maximum de colonnes :

Option Explicit 'oblige à déclarer toutes le variables

Sub Macro1()
Dim colD As Integer 'déclare la variable colD (colonne du Début)
Dim lf As Long 'déclare la variable lf'déclare la variable lf (Ligne de Fin)
Dim a As Integer 'déclare la variable a
Dim q As Byte 'déclare la variable q
Dim x As Byte 'déclare la variable x
debut: 'balise
a = InputBox('le maximim de lignes', 'Tapez ici') 'définit la variable a
colD = 1 'définit la variable colD
lf = Cells(65536, colD).End(xlUp).Row 'définit la variable lf
If lf > a Then 'condition1 : si le nombre de lignes est supérieur au maximum
If lf Mod a > 0 Then 'condition2 :si le reste de la division de lf pas a (maximum de lignes) est positif
q = Int(lf / a) + 1 'q = (entier de la division de lf par q) +1
Else 'sinon
q = Int(lf / a) 'q = entier de la division de lf par q
End If 'fin condition2
If q > 86 Then 'condition3 : si q est supérieur à 85 (86*3=258 colonnes, impossible)
MsgBox 'Vous devez augmenter le nombre de lignes.' 'message
GoTo debut 'retoune à l'inputbox via la balise 'Debut'
End If 'fin de la condition 3
For x = 1 To q 'boucle sur q fois
'rajoute et dimensionne 3 colonnes
Columns(colD + 3).Select
Selection.Insert Shift:=xlToRight
Selection.ColumnWidth = 3.5
Selection.Insert Shift:=xlToRight
Selection.ColumnWidth = 17.29
Selection.Insert Shift:=xlToRight
Selection.ColumnWidth = 26.29
'coupe et copie à parir du maximum
Range(Cells(a + 1, colD), Cells(lf, colD)).Cut Cells(4, colD + 3) '(merci Hervé)
'trie la colonne
Range(Cells(4, colD), Cells(a, colD)).Sort Key1:=Cells(4, colD), _
Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom
colD = colD + 3 'redéfinit la variable colD
Next x 'prochaine fois de la boucle
End If 'fin de la condition1
Range('A1').Select 'sélectionne la cellule A1
End Sub
 

mutzik

XLDnaute Barbatruc
Re:comment faire une boucle un nb de fois variable

Bonjour Philipp, Robert, Hervé et le forum

Plus basiquement, j'aimerais savoir à quoi cela doit servir pour (éventuellement) proposer une autre solution car, il me semble qu'avec ce genre de procédures, tu arriveras vite aux 256 colonnes et tu seras toujours emm...bêté

Si tu pouvais nous expliquer ... avec un fichier joint

à+
Bertrand
 

Discussions similaires

Réponses
25
Affichages
1 K
Réponses
12
Affichages
717

Statistiques des forums

Discussions
314 013
Messages
2 104 552
Membres
109 078
dernier inscrit
Nikitoklass