Loop sans Fin

Bonjour

j'avais écrit en tâtonnant cette routine.

elle ne marche plus... et tourne en boucle.

pouvez-vous m'expliquez pourquoi?

Merci à vous.

Sub MIXTE2Bal() 'procédure MIXTE dédoublement de lignes

Dim O_Cell As Object

Dim C_UI As String

Dim i, j As Integer

Dim o As Integer

Dim DL As Integer 'déclare la variable DL (Dernière Ligne)

'Application.ScreenUpdating = False

DL = ActiveSheet.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A de l'onglet F1

For o = 1 To DL 'mise en place du loop

C_UI = "MIXTE" 'valeur à chercher

ActiveSheet.UsedRange.Rows("2:" & ActiveSheet.UsedRange.Rows.Count).Select 'prend le tableau sans les entêtes

'Application.Goto Reference:="UI" ' "UI" est le nom de la zone de recherche

Set O_Cell = Selection.Find(C_UI) ' recherche de la valeur

If Not O_Cell Is Nothing Then 'si l'objet O_Cell contient les coordonnées de la cellule

'MsgBox "J'ai trouvé" 'message affiché

O_Cell.Select ' sélection de la cellule

'copier coller de la ligne du dessus

vlig = ActiveCell.Row

vzona = vlig & ":" & vlig

vzonb = vlig + 1 & ":" & vlig + 1 'dessous sinon avec - c'est dessus

Selection.EntireRow.Select

Selection.Insert Shift:=xlDown

Rows(vzonb).Select

Selection.Copy

Rows(vzona).Select

ActiveSheet.Paste

Cells(vlig, 1).Select

Application.CutCopyMode = False 'déselectionner ligne

'repositionne la selection

Cells(ActiveCell.Row, 1).Select

'décale la selection 1

ActiveCell.Offset(0, 5).Select

'changer la valeur MIXTE en RECETTES

ActiveCell.Value = "RECETTES"

'décale la selection 2

ActiveCell.Offset(1, 0).Select

'changer la valeur MIXTE en RECETTES

ActiveCell.Value = "DEPENSES"

'Vider Case Recettes - décale la selection et vide

ActiveCell.Offset(0, 4).Select

ActiveCell.Value = 0

'Vider Case Depenses - décale la selection et vide

ActiveCell.Offset(-1, -1).Select

ActiveCell.Value = 0

End If

Next o 'fin du loop

'Application.ScreenUpdating = True

End Sub

8problemedeloop.xlsm (486.38 Ko)

Bonjour,

c'est illisible. Utilise l'icone </> pour mettre en forme ton code et garder l'indentation.

Et décris ce qu'elle est sensée faire, ça aidera ceux qui voudront s'y pencher.

eric

Bonjour

Ta macro ne tourne pas en boucle sans fin. Elle est simplement très lente. Pour t'en convaincre, mets cette instruction juste avant "End Sub" et sois patient :

MsgBox "Travail terminé"

Tu aurais intérêt à l'optimiser en évitant les instruction de type "....Select" et "Selection...."

Bye !

Bonjour à tous,

Un essai beaucoup plus rapide ...

- si le mot "MIXTE" est toujours en colonne F ...

Sub MIXTE2Bal()      'procédure MIXTE dédoublement de lignes

Dim O_Cell As Object
Dim C_UI As String
Dim i, j As Integer
Dim o As Integer
Dim DL As Integer      'déclare la variable DL (Dernière Ligne)
Dim C
   'Application.ScreenUpdating = False

DL = ActiveSheet.Cells(Application.Rows.Count, "A").End(xlUp).Row      'définit la dernière ligne éditée DL de la colonne A de l'onglet F1

   With ActiveSheet.Range("F2:F" & DL)
      C_UI = "MIXTE"      'valeur à chercher
      Set C = .Find(C_UI, LookIn:=xlValues, LookAt:=xlWhole) ''' ou xlPart
      If Not C Is Nothing Then
         firstAddress = C.Address
         Do
            vlig = C.Row      ' détermine la ligne
            vcol = C.Column      ' détermine la colonne
            vzona = vlig & ":" & vlig      ' détermine ZoneA
            vzonb = vlig + 1 & ":" & vlig + 1      ' détermine Zone B en dessous sinon avec - c'est dessus
            Rows(vzona).EntireRow.Insert Shift:=xlDown      ' insère une ligne
            Rows(vzonb).Copy Rows(vzona)      ' copie la ligne de la ZoneB en ligne de la ZoneA
            Cells(vlig, vcol).Value = "RECETTES"      ' remplace texte
            Cells(vlig + 1, vcol).Value = "DEPENSES"      ' remplace texte
            Cells(vlig + 1, vcol + 4).Value = 0      ' cellule à 0
            Cells(vlig, vcol + 3).Value = 0      ' cellule à 0

            Set C = .FindNext(C)
            If C Is Nothing Then
               GoTo DoneFinding
            End If
         Loop While C.Address <> firstAddress
      End If
DoneFinding:

      .Cells(1, 1).Select
   End With
   'Application.ScreenUpdating = True
End Sub

ric

Merci à tous.

Vous êtes des Génies, et Ric c'est dieu

Il faut un bon processeur, mais ça marche nickel.

Re,

.Find(C_UI, LookIn:=xlValues)

il faudrait ajouter le paramètre lookat:=xlWhole ou xlPart

A faire systématiquement sinon on se retrouve avec les paramètres de la dernière recherche utilisateur qui ne correspond pas forcément à ce qu'on veut (tout ou partie du texte).

eric

Rechercher des sujets similaires à "loop fin"