Mouvement de Cellules

Bonjour,

[Sous Excel 2007 / 2010]

J'ai un souci de mouvement de cellules, je m'explique j'ai une transposition de cellule à faire en fonction de valeur de colonnes référence.

J'ai environ 15000 à 20000 lignes.

J'ai beau essayer de transposer de faire des décalage de lignes etc etc bref je ne m'en sort pas et impossible de gérer 20000 lignes comme ça

Les couleurs dans les cellules ne sont là que pour le forum pour plus de clarté

Si vous avez une petite routine pour faire ça, ça serait vraiment un grand pas en avant pour moi dans ce monde vba !!!

j'avance mais là je bloque, j'arrive à faire mes tris et mes collage dans la feuil2 mais si la ref de la feuille "liste" en colonne A contient une seconde valeur identique,

par exemple en A2 j'ai 10001 puis en A3 10001 aussi je n'arrive pas à traiter cette ligne je passe en A4 !

Pour info j'increment une variable incr sur 10000 + incr

mon code :

Sub ref_100000_Feuil2()
Dim lig As Integer
Dim ligliste As Integer
Dim col As Integer
Dim txt As Double
Dim NBref As Integer
Dim incr As Integer

Application.ScreenUpdating = False
'MsgBox Oui + Non
Select Case MsgBox("effacer Feuil2 et les X ?", vbYesNo, "effacer Feuil2 ?")
    Case vbYes
         Sheets("liste").Select
         Range("D:D").ClearContents
         Sheets("Feuil2").Select
         Range("A:ZZ").ClearContents
         Sheets("liste").Select
    Case vbNo
    End Select
incr = 0
 For ligliste = 2 To 65
 Sheets("liste").Select
   Range("A2").Select
   If Cells(ligliste, 1) = "" And liglist < 65 Then
   Range("D:D").ClearContents
   'ElseIf liglist = 62 Then
   ElseIf Cells(ligliste, 1) = "fin" Then
   MsgBox "fin de colonne"
   Exit Sub
   End If

' 10000X
   If Cells(ligliste, 1).Text = "10000" & incr And Cells(ligliste, 4) = "" Then

' "X" => "pour valider ce qui est fait"
   Cells(ligliste, 4) = "X"
   txt = "10000" & incr
   NBref = Application.WorksheetFunction.CountIf(Range("A:A"), "=" & txt)
   Range(Cells(ligliste, 1), Cells(ligliste, 3)).Copy

' FEUIL2
   Sheets("Feuil2").Select
    Range("A1").Select
     ActiveSheet.Paste
     Application.CutCopyMode = False
For lig = 3 To 255
     If Cells(lig, 1) = "" Or Cells(lig, 1) = Range("A1") Then
     Cells(lig, 1) = Range("A1")
 For col = 2 To 255 Step 2
     If Cells(lig, col) = Range("A1") Then
     Cells(lig, col + 1) = Cells(lig, col + 1)
     Exit For
     ElseIf Cells(lig, col) = "" Then
     Cells(lig, col) = Range("B1")
     Cells(lig, col + 1) = Range("C1")
     Exit For
     Else
     Cells(lig, col + 2).Select
     End If
 Next col
  Range("A1:C1").ClearContents
    Exit For
     Else
     Cells(lig + 1, col).Select
     End If
 Next lig
    Cells(ligliste + 1, 1).Select

   End If
   'incr = incr + 1
 Next ligliste

 Application.ScreenUpdating = True
End Sub

Merci

Salut Gribouille

Essaye ce code et dis nous si cela te convient

Sub Tri()
  Dim DLig As Long, Lig As Long, LigF As Long, NCol As Long
  Dim Ref As String, ShtS As Worksheet
  ' Définir la feuille source
  Set ShtS = Sheets("Liste")
  ' Dernière ligne de la feuille Source
  DLig = ShtS.Range("A" & Rows.Count).End(xlUp).Row
  ' Avec la feuille sur laquelle on veut travailler
  With Sheets("Feuil2")
    .Activate
    ' Pour chaque ligne
    For Lig = 2 To DLig
      Ref = ShtS.Range("A" & Lig).Value
      ' En cas d'erreur on continue
      On Error Resume Next
      ' Chercher la ligne correspondante
      LigF = 0
      LigF = .Range("A:A").Find(What:=Ref, LookIn:=xlValues, LookAt:=xlWhole, _
        SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Row
      ' Si la ligne est trouvée
      If LigF <> 0 Then
        ' Calculer la prochaine colonne de la ligne
        NCol = .Cells(LigF, Columns.Count).End(xlToLeft).Offset(0, 1).Column
      Else
        ' Calculer la prochaine ligne vide
        LigF = .Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Row
        ' La colonne est la 1ère
        NCol = 1
      End If
      ' Copier coller les éléments
      ShtS.Range("A" & Lig).Resize(, 3).Copy Destination:=.Cells(LigF, NCol)
    Next Lig
  End With
End Sub

A+

Avant tout,

Je te remercie énormément de passer du temps sur mon problème !!!

Il y a encore des trucs qui ne colle pas j'avoue ne pas trop comprendre ton code donc pas simple pour que j’essaie de debugger tout seul, désolé

Pour la ligne 1 ça ok pas de problème tu as bien fais c'est moi qui ais viré la première ligne donc ça JE sais mais le reste !!!

Je remarque que j'ai omis de dire qu'il pouvait y avoir des cellules vide dans mon premier message mais elles doivent être considéré comme une cellule pleine évidement. j'ai corrigé l'image de mon premier message pour être plus clair.

Je regarde par une bidouille avec F5 sélection cellule vide

copier/coller un texte genre XXXXXXXXXX

puis une fois la macro faite, dans la Feuil2 rechercher/remplacer les XXXXXXXXXX par rien.

Rhaa je sais c'est bricole mais bon j'essai de me dérouiller

Mais c'est pas top top de mon coté

Humm nan ça semble pas si évident y a des décalages avec mon bricolage...

Merci

Re,

En général je ne reviens pas sur la demande initiale et le code que j'ai fait

Mais bon, tu es débutant je veux bien t'excuser pour cette fois

Essaye ce code

Sub Tri()
  Dim DLig As Long, Lig As Long, LigF As Long, NCol As Long
  Dim Ref As String, ShtS As Worksheet
  ' Définir la feuille source
  Set ShtS = Sheets("Liste")
  ' Dernière ligne de la feuille Source
  DLig = ShtS.Range("A" & Rows.Count).End(xlUp).Row
  ' Avec la feuille sur laquelle on veut travailler
  With Sheets("Feuil2")
    .Activate
    ' Pour chaque ligne
    For Lig = 2 To DLig
      Ref = ShtS.Range("A" & Lig).Value
      ' En cas d'erreur on continue
      On Error Resume Next
      ' Chercher la ligne correspondante
      LigF = 0
      LigF = .Range("A:A").Find(What:=Ref, LookIn:=xlValues, LookAt:=xlWhole, _
        SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Row
      ' Si la ligne est trouvée
      If LigF <> 0 Then
        ' Calculer la prochaine colonne de la ligne
        NCol = .Cells(LigF, Columns.Count).End(xlToLeft).Offset(0, 1).Column
        ' La nouvelle colonne doit être un multiple de 3
        NCol = IIf(NCol / 3 <> Int(NCol / 3), Round((NCol / 3) + 0.5) * 3, NCol) + 1
      Else
        ' Calculer la prochaine ligne vide
        LigF = .Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Row
        ' La colonne est la 1ère
        NCol = 1
      End If
      ' Copier coller les éléments
      ShtS.Range("A" & Lig).Resize(, 3).Copy Destination:=.Cells(LigF, NCol)
    Next Lig
  End With
End Sub

A+

Re,

Merci beaucoup pour ce que tu a fais.

Il y a encore un pti souci mais rien de bien grave, là cette fois je devrais m'en sortir

Saches que le fais que tu retouches ton code initial, va sans doute pas mal m'apporte je vais analyser les différences entre le premier et celui-ci et je vais essayer de comprendre tout ça.

J'avoue que j'ai pas l'habitude de voir la moitié des instructions que tu utilises alors j'ai pas mal de boulot

En regardant le code là, je me demande vraiment comment tu trouves ou plutôt vous tous, trouvez des trucs pareils !!! mais bravo !

Encore merci de m'avoir aidé.

Rechercher des sujets similaires à "mouvement"