L'erreur classique 424 ^^

Résolu/Fermé
Markoko Messages postés 7 Date d'inscription mercredi 9 juillet 2014 Statut Membre Dernière intervention 18 juillet 2014 - Modifié par pijaku le 17/07/2014 à 09:20
Markoko Messages postés 7 Date d'inscription mercredi 9 juillet 2014 Statut Membre Dernière intervention 18 juillet 2014 - 18 juil. 2014 à 09:07
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

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
15 juil. 2014 à 14:41
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
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
15 juil. 2014 à 15:14
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
Markoko Messages postés 7 Date d'inscription mercredi 9 juillet 2014 Statut Membre Dernière intervention 18 juillet 2014
Modifié par Markoko le 15/07/2014 à 15:42
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 15/07/2014 à 17:02
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
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
15 juil. 2014 à 18:43
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
Markoko Messages postés 7 Date d'inscription mercredi 9 juillet 2014 Statut Membre Dernière intervention 18 juillet 2014
16 juil. 2014 à 17:13
effectivement c'est bien plus simple !!! Merci
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 15/07/2014 à 21:10
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
Markoko Messages postés 7 Date d'inscription mercredi 9 juillet 2014 Statut Membre Dernière intervention 18 juillet 2014
17 juil. 2014 à 10:32
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
17 juil. 2014 à 11:37
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
Markoko Messages postés 7 Date d'inscription mercredi 9 juillet 2014 Statut Membre Dernière intervention 18 juillet 2014
17 juil. 2014 à 12:02
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
17 juil. 2014 à 13:51
Comme c'est des petits tableaux, c'est dpmmage mais laisse comme çà
0
Markoko Messages postés 7 Date d'inscription mercredi 9 juillet 2014 Statut Membre Dernière intervention 18 juillet 2014
17 juil. 2014 à 13:55
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