L'erreur classique 424 ^^

Résolu
Markoko Messages postés 7 Statut Membre -  
Markoko Messages postés 7 Statut Membre -
Bonjour à tous,

Cette erreur est assez présente sur le forum cependant je n'ai pas trouvé de réponses satisfaisantes, même en cherchant sur google, voilà tout ca pour dire que j'ai un niveau mediocre en VBA, surtout que c'est sûrement encore une erreur à la con, mais je ne vois pas laquelle ...

Mon code à pour but de classer des données pour chaque ligne dans un ordre dépendant de leur date (du plus proche au plus vieux). J'avais commencer à l'appliquer pour une seule ligne et maintenant à toutes les lignes par une boucle. Sauf que j'ai un problème d'erreur 424 à la ligne :

- Set myplage = .Range(.Cell(4, i), .Cell(7, i), .Cell(10, i))

Voici le code complet :

Sub new_ranking()

Dim Minimum As Date
Dim i As Integer
Dim FRemoval_1 As Integer
Dim FRemoval_2 As Integer
Dim FRemoval_3 As Integer



Set wb = ActiveWorkbook
Set f_report = wb.Worksheets("Forecast")
FRemoval_1 = 4
FRemoval_2 = 7
FRemoval_3 = 10

f_report.Activate


    'Rank#1
For i = 5 To 7

    Minimum = Application.Min(Cells(i, 4), Cells(i, 7), Cells(i, 10))
    
With Forecast
Set myplage = .Range(.Cell(4, i), .Cell(7, i), .Cell(10, i))
End With

    For Each Cell In myplage
        If Cell = Minimum Then
            MinimumAddress = Cell.Address
            Exit For
        End If
    Next Cell
    
    Range(MinimumAddress).Cut
        Sheets("Template").Select
        Range("D" & i).Select
        ActiveSheet.Paste
    Sheets("Forecast").Range(MinimumAddress).Offset(0, -2).Cut
        Sheets("Template").Select
        Range("B" & i).Select
        ActiveSheet.Paste
    Sheets("Forecast").Range(MinimumAddress).Offset(0, -1).Cut
        Sheets("Template").Select
        Range("C" & i).Select
        ActiveSheet.Paste
    f_report.Activate
    
  
    'Rank#2
    Minimum = Application.Min(Cells(i, 4), Cells(i, 7), Cells(i, 10))
    For Each Cell In myplage
        If Cell = Minimum Then
            MinimumAddress = Cell.Address
            Exit For
        End If
    Next Cell
    
    Range(MinimumAddress).Cut
        Sheets("Template").Select
        Range("G" & i).Select
        ActiveSheet.Paste
    Sheets("Forecast").Range(MinimumAddress).Offset(0, -2).Cut
        Sheets("Template").Select
        Range("E" & i).Select
        ActiveSheet.Paste
    Sheets("Forecast").Range(MinimumAddress).Offset(0, -1).Cut
        Sheets("Template").Select
        Range("F" & i).Select
        ActiveSheet.Paste
    f_report.Activate
    
    
    'Rank#3
    Minimum = Application.Min(Cells(i, 4), Cells(i, 7), Cells(i, 10))
    For Each Cell In myplage
        If Cell = Minimum Then
            MinimumAddress = Cell.Address
            Exit For
        End If
    Next Cell
    
    Range(MinimumAddress).Cut
        Sheets("Template").Select
        Range("J" & i).Select
        ActiveSheet.Paste
    Sheets("Forecast").Range(MinimumAddress).Offset(0, -2).Cut
        Sheets("Template").Select
        Range("H" & i).Select
        ActiveSheet.Paste
    Sheets("Forecast").Range(MinimumAddress).Offset(0, -1).Cut
        Sheets("Template").Select
        Range("I" & i).Select
        ActiveSheet.Paste
    f_report.Activate
Next

End Sub


Si vous préférez avoir le fichier pas de problèmes mais je ne sais pas comment le metre en pièce-jointe.

Merci beaucoup !

3 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    pourquoi
    on a
    Set f_report = wb.Worksheets("Forecast")

    With Forecast ?????
    Set myplage = .Range(.Cell(4, i), .Cell(7, i), .Cell(10, i))
    End With

    j'aurais plutôt écris ceci
    With f_report
    'Rank#1
    For i = 5 To 7
    Minimum = Application.Min(.Cells(i, 4), .Cells(i, 7), .Cells(i, 10))
    minimumadress = .Rows(i).Find(Minimum).Address

    ..... etc

    mais il y a beaucoup d'autres choses à revoir....
    1
    1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
       
      Bonjour Michel,

      «mais il y a beaucoup d'autres choses à revoir.... » Entièrement d'accord !!!


      @Markoko
      Commencer par la suppression de tous les Select ...

      Cordialement
      Patrice
      0
    2. Markoko Messages postés 7 Statut Membre
       
      Merci beaucoup, j'apporte les modifications et je vous tiens au courant.
      Mais les select j'en ai besoin, le code une fois qu'il a trouvé sur une ligne la plus petite date, il l'a copie sur autre feuille pour après la remettre sur la feuille forecast mais en 1ère position. Je pense que j'ai mal exprimer ce que je souhaite faire, voici un exemple :

      On a 25/05/2014 12/03/2014 08/08/2014
      On desire 12/03/2014 25/05/2014 08/08/2014
      0
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Re
      

      je n'avais pas pensé qu'il pouvait peut-^tre y avoir d'autres données dans les colonnes entre D et J mais je ne savais qu'il s'agissait de date (piège)

      Option Explicit
      '------
      Sub markoko()
      Dim Minimum As Double, Minimumadresse As String
      Dim Lig As Byte, Col As Byte
      Lig = 1
      With Sheets("forecast")
      Minimum = CDbl(.Cells(Lig, 4))
      Minimumadresse = .Cells(Lig, 4).Address
      For Col = 7 To 10 Step 3
      If Minimum > CDbl(.Cells(Lig, Col)) Then
      Minimum = CDbl(.Cells(Lig, Col))
      Minimumadresse = .Cells(Lig, Col).Address
      End If
      Next
      End With
      End Sub
      0
  2. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    Re,

    «Mais les select j'en ai besoin, ...» : Non pas dans ton cas !!!
    Et si tu les supprimes, le code n'en sera que plus simple, plus lisible et plus efficace.

    Par exemple tu peux remplacer toutes les lignes suivantes :
    Range(MinimumAddress).Cut
    Sheets("Template").Select
    Range("D" & i).Select
    ActiveSheet.Paste

    Par une seule (sans Select)

    f_report.Range(MinimumAddress).Cut Worksheets("Template").Range("D" & i)


    1
    1. Markoko Messages postés 7 Statut Membre
       
      effectivement c'est bien plus simple !!! Merci
      0
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    re,
    Si j'ai pigé, tu veux reproduire le tableau de forecaste dans template dans l'orde croissant des dates références (colonne 4,7,10)

    si oui
    sans select-selection copy ou cut-paste, grands mangeurs de RAM et de temps...

    tu débutes: il est important pour chacun d'activer "option explicit" et de déclarer les variables
    crois- moi, c'est plus qu'utile lorsque tu fais des essais : faute de frappe, mauvais choix de type etc, âneries que l'on sait tous très bien faire !

    de m^me , indenter le code permet une lecture plus facile (penser a la maintenance ou évolution par toi ou une autre personne: 80% du temps de vie de l'appli)

    Option Explicit
    '------
    Sub markoko()
    Dim Minimum As Double, Minimumadresse As String
    Dim Tri As Byte, Col As Byte
    Dim Tampon(2)
    Dim Lig As Byte, Debut As String

    Application.ScreenUpdating = False
    For Lig = 5 To 7
    With Sheets("forecast")
    For Tri = 1 To 3
    If .Cells(Lig, 4) <> "" Then
    Minimum = CDbl(.Cells(Lig, 4))
    Minimumadresse = .Cells(Lig, 4).Address
    End If
    For Col = 7 To 10 Step 3
    If .Cells(Lig, Col) <> "" Then
    If Minimum > CDbl(.Cells(Lig, Col)) Then
    Minimum = CDbl(.Cells(Lig, Col))
    Minimumadresse = .Cells(Lig, Col).Address
    End If
    End If
    Next Col
    Tampon(0) = .Range(Minimumadresse).Offset(0, -2)
    Tampon(1) = .Range(Minimumadresse).Offset(0, -1)
    Tampon(2) = .Range(Minimumadresse)
    .Range(Minimumadresse & ":" & Range(Minimumadresse).Offset(0, -2).Address) = ""

    With Sheets("template")
    Debut = Choose(Tri, "B", "E", "H")
    .Cells(Lig, Debut).Resize(1, 3) = Tampon
    End With
    Minimum = 99999
    Next Tri
    End With
    Next Lig
    Sheets("template").Activate
    End Sub

    Michel
    0
    1. Markoko Messages postés 7 Statut Membre
       
      C'est genial !!! Merci beaucoup ! Et à la fin du code il me reste plus qu'a ajouter un copier-coller pour récupérer les données triées sur le forecast. Je vous tiens au courant, en tout cas merci beaucoup car sans vous j'aurais encore un code un peu dégueu ^^ et en plus qui ne fonctionnerait pas bien.
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      bonjour,

      Et à la fin du code il me reste plus qu'a ajouter un copier-coller pour récupérer les données triées sur le forecast

      ??? Comprend pas... sauf erreur de ma part ,les données de forecast sont écrites dans template
      With Sheets("template")
      Debut = Choose(Tri, "B", "E", "H")
      .Cells(Lig, Debut).Resize(1, 3) = Tampon
      End With
      pour reporter des données, on évite au maximum d'utiliser "copier-coller"
      0
    3. Markoko Messages postés 7 Statut Membre
       
      C'est à dire que les données dans Forecast n'étaient pas encore triées, on utilise la feuille template pour les classer, puis après on les remets dans le forecast, comme ca on obtient une feuille forecast bien rangée.

      J'ai réussi à le faire par un copier-coller c'est ce qui m'est apparu comme étant le plus simple. Mais comment faire autrement ?

      Merci
      0
    4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Comme c'est des petits tableaux, c'est dpmmage mais laisse comme çà
      0
    5. Markoko Messages postés 7 Statut Membre
       
      en fait dans l'exemple que je vous ai montré c'est un petit tableau, mais en réalité c'est plus grand, il y a environ 400 lignes (du coup la variable Lig est une integer) et environ 16 dates à trier, mais ca fonctionne. Par-contre si on peut optimiser le "copier/coller" je serai intéressé de savoir comment :)
      0