Bogue dans ma macro!

CharlesSSQ

XLDnaute Junior
Bonjour,

Voic mam petite macro, lorsque je roule cette macro, le débogeur me dit " Next sans For"

quelqu'un peut me guider!?

Merci


Sub importation_guide()

Application.ScreenUpdating = False

DateTravail = Workbooks(WORKBOOK_PROCEDURE_GUIDE).Sheets("Feuil1").Cells(42, 3).Value

Application.Workbooks(DATA).Activate
Sheets(SHEET_TRAVAIL_DATA).Select

Set LD = Range("A1:A10000").Find(DateTravail, LookIn:=xlFormulas, LookAt:=xlWhole)
If Not LD Is Nothing Then
LigneDate = LD.Row
Else
MsgBox "La date choisie dans la procédure n'existe pas encore dans l'onglet FSJ ACTIF T." & Chr(10) & _
"Veuilez s'il-vous-plait modifier en conséquence. Merci !", vbOKOnly + vbExclamation, "Erreur dans le choix de la date"
Sheets("Feuil1").Cells(42, 3).Value = 1
End If

For i = 1 To 100

ticker(i) = Cells(4, i).Value
valeur(i) = Cells(LigneDate, i).Value
Next i

Application.Workbooks(WORKBOOK_GUIDE).Activate
Sheets(SHEET_TRAVAIL_GUIDE).Select

For i = 1 To 100
tickerrecherche = ticker(i)
Set Ligneticker = Range("A1:A10000").Find(tickerrecherche, LookIn:=xlValues, LookAt:=xlWhole)
If Not Ligneticker Is Nothing Then
Actif = Ligneticker.Row
Cells(Actif, 5) = valeur(i)
Next i

End Sub
 

Staple1600

XLDnaute Barbatruc
Re : Bogue dans ma macro!

Bonjour


Code:
For i = 1 To 100
    tickerrecherche = ticker(i)
   Set Ligneticker = Range("A1:A10000").Find(tickerrecherche, LookIn:=xlValues, LookAt:=xlWhole)
   If Not Ligneticker Is Nothing Then
    Actif = Ligneticker.Row
    Cells(Actif, 5) = valeur(i)
[COLOR=Red][B]End If 'ici ajout[/B][/COLOR]
Next i

EDITION:
est-ce que ton code ainsi modifié fonctionne ?
Code:
Sub importation_guide()
Dim WBK As workook: Set WBK = Workbooks(WORKBOOK_PROCEDURE_GUIDE)
Application.ScreenUpdating = False

DateTravail = WBK.Sheets("Feuil1 ").Cells(42, 3).Value

With Workbooks(DATA).Sheets(SHEET_TRAVAIL_DATA)
    Set LD = .Range("A1:A10000").Find(DateTravail, LookIn:=xlFormulas, LookAt:=xlWhole)
    If Not LD Is Nothing Then
        LigneDate = LD.Row
        Else
        MsgBox "La date choisie dans la procédure n'existe pas encore dans l'onglet FSJ ACTIF T." _
        & Chr(10) & "Veuilez s'il-vous-plait modifier en conséquence. Merci !", _
        vbOKOnly + vbExclamation, "Erreur dans le choix de la date"
        Sheets("Feuil1").Cells(42, 3).Value = 1
    End If
    For i = 1 To 100
        ticker(i) = .Cells(4, i).Value
        valeur(i) = .Cells(LigneDate, i).Value
    Next i
End With

With .Workbooks(WORKBOOK_GUIDE).Sheets(SHEET_TRAVAIL_GUIDE)
    For i = 1 To 100
    tickerrecherche = ticker(i)
    Set Ligneticker = _
            .Range("A1:A10000").Find(tickerrecherche, _
            LookIn:=xlValues, LookAt:=xlWhole)
        If Not Ligneticker Is Nothing Then
        Actif = Ligneticker.Row
        Cells(Actif, 5) = valeur(i)
        End If
    Next i
End With
End Sub
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Bogue dans ma macro!

Salut CharlesSSQ et le forum
Juste une retranscription de ta macro
Code:
Sub importation_guide()
Application.ScreenUpdating = False
DateTravail = Workbooks(WORKBOOK_PROCEDURE_GUIDE).Sheets("Feuil1 ").Cells(42, "C")
Workbooks(DATA).Activate
Sheets(SHEET_TRAVAIL_DATA).Activate
Set LD = Range("A1:A10000").Find(DateTravail, LookIn:=xlFormulas, LookAt:=xlWhole)
If Not LD Is Nothing Then
    LigneDate = LD.Row
Else
    MsgBox "La date choisie dans la procédure n'existe pas encore dans l'onglet FSJ ACTIF T." & Chr(10) & _
    "Veuilez s'il-vous-plait modifier en conséquence. Merci !", vbOKOnly + vbExclamation, "Erreur dans le choix de la date"
    Sheets("Feuil1").Cells(42, 3) = 1
End If
For i = 1 To 100
    ticker(i) = Cells(4, i)
    valeur(i) = Cells(LigneDate, i)
Next i
Workbooks(WORKBOOK_GUIDE).Activate
Sheets(SHEET_TRAVAIL_GUIDE).Activate
For i = 1 To 100
    tickerrecherche = ticker(i)
    Set Ligneticker = Range("A1:A10000").Find(tickerrecherche, LookIn:=xlValues, LookAt:=xlWhole)
    If Not Ligneticker Is Nothing Then
        Actif = Ligneticker.Row
        Cells(Actif, 5) = valeur(i)
    End If
Next i
End Sub
Mais ça ne résoudra tes problèmes de bugs. :D
Première recherche : si on trouve, on donne une valeur à LigneDate et si on trouve pas ? Pas sûr que "Cells(LigneDate, i)" (Cells(0, i) soit très apprécié par Excel
Faire 2 boucles est déjà une perte de temps, mais de 1 à 100, alors qu'on parcoure 10000 lignes me semblent assez bizarre, mais si la première boucle comporte 1 seul enregistrement, faire 99 fois la boucle pour rien...

Pour moi, cette macro pourrait être améliorée, soit en redéfinissant la limite des tableaux Ticker() et valeur() avec un Redim Preserve, soit en ne faisant qu'une boucle de recherche, avec écriture de la bonne valeur directement.
A+
 

Etienne2323

XLDnaute Impliqué
Re : Bogue dans ma macro!

Salut Charles,
essaie ceci. J'ai mis des petites notes dans le code. Les réponses précédentes sont très pertinentes quant à l'efficacité du code. Quand tu fais la recherche, ton range de recherche va de 1 à 10000. Tu pourrais donc faire une recherche initialement pour déterminer la dernière ligne que tu utilises réellement et conserver cette valeur dans une variable pour ensuite insérer cette variable à la place du 10000. Bref, regarde ça tranquillement en espérant que ça te donne un coup de main. Bonne continuité !

Étienne

Code:
Sub Importation_guide()


'Note 1 : Déclare les variables que tu utilises. Cela rendra ton code plus efficace et plus rapide.
Dim LD As Variant, LigneTicker As Variant
Dim DateTravail As Date
Dim LigneDate As Long, LigneActif As Long

Application.ScreenUpdating = False

'Note 2 : Ici tu as un espace après Feuil1. C'est voulu ?
'Note 3 : Tu pourrais mettre le nom de la feuille en constante comme les autres variables de référence
DateTravail = Workbooks(WORKBOOK_PROCEDURE_GUIDE).Sheets("Feuil1 ").Cells(42, 3).Value


Workbooks(Data).Activate
Sheets(SHEET_TRAVAIL_DATA).Select

Set LD = Range("A1:A10000").Find(DateTravail, LookIn:=xlFormulas, LookAt:=xlWhole)
If Not LD Is Nothing Then
    LigneDate = LD.Row
Else
    MsgBox "La date choisie dans la procédure n'existe pas encore dans l'onglet FSJ ACTIF T." & Chr(10) & _
    "Veuilez s'il-vous-plait modifier en conséquence. Merci !", vbOKOnly + vbExclamation, "Erreur dans le choix de la date"
'Note 4 : Plutot que de mettre une date valide dans la cellule, tu la remplace par 1, donc la prochaine fois
'que tu voudras tester ta macro, il faudra penser à remettre une date dans ta cellule C42
    Sheets("Feuil1").Cells(42, 3).Value = 1
End If

'Tu peux réaliser ton opération en ne faisant qu'une seule boucle plutôt que 2. Sur une boucle de 100 itérations,
'ça ne change pas grand chose.
For i = 1 To 100
    Workbooks(Data).Activate
    Sheets(SHEET_TRAVAIL_DATA).Select
    
    Ticker(i) = Cells(4, i).Value
    Valeur(i) = Cells(LigneDate, i).Value

    Workbooks(WORKBOOK_GUIDE).Activate
    Sheets(SHEET_TRAVAIL_GUIDE).Select
    
    TickerRecherche = Ticker(i)

    Set LigneTicker = Range("A1:A10000").Find(TickerRecherche, LookIn:=xlValues, LookAt:=xlWhole)
    If Not LigneTicker Is Nothing Then
        LigneActif = LigneTicker.Row
    Else
        MsgBox "Le ticker recherché n'existe pas." & Chr(10) & _
        "Veuilez s'il-vous-plait modifier en conséquence. Merci !", vbOKOnly + vbExclamation, "Erreur dans la saisie de ticker"
    End If
    
    Cells(LigneActif, 5) = Valeur(i)
Next i

End Sub
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Bogue dans ma macro!

Salut Etienne2323 et le forum
Petites critiques sur ta macros :
Code:
Sub Importation_guide()
'Note 1 : Déclare les variables que tu utilises.
'Oui, mais les déclarer TOUTES est mieux --------------
Dim LD, LigneTicker 'la valeur par défaut est variant
Dim DateTravail As Date
Dim LigneDate As Long, LigneActif As Long
Application.ScreenUpdating = False
DateTravail = Workbooks(WORKBOOK_PROCEDURE_GUIDE).Sheets("Feuil1 ").Cells(42, 3).Value
'WORKBOOK_PROCEDURE_GUIDE : qu'est-ce que c'est ? là, ça ne peut être qu'une variable string.
'mais comme elle n'est pas initialisée dans le code, ça suppose une variable globale et
'pas assez d'informations fournies pour faire un code efficace --------------------
Workbooks(Data).Activate
Sheets(SHEET_TRAVAIL_DATA).Select
'même remarques que ci-dessus : Data ? SHEET_TRAVAIL_DATA ?
'le fait de selectionner peut aussi engendrer des problèmes suivant la localisation de la macro
Set LD = Range("A1:A10000").Find(DateTravail, LookIn:=xlFormulas, LookAt:=xlWhole)
If Not LD Is Nothing Then
    LigneDate = LD.Row
Else
    MsgBox "La date choisie dans la procédure n'existe pas encore dans l'onglet FSJ ACTIF T." & Chr(10) & _
    "Veuilez s'il-vous-plait modifier en conséquence. Merci !", vbOKOnly + vbExclamation, "Erreur dans le choix de la date"
    Sheets("Feuil1").Cells(42, 3).Value = 1
End If
'Comme je l'ai dis, pas assez d'infos sur l'algo de la macro.
'de plus, en cas de date non trouvée, [Data].'SHEET_TRAVAIL_DATA'C42=1 (ne pas tenir compte de la syntaxe)
'mais DateTravail reste la même ainsi que LigneDate qui reste à zéro, sans que la macro s'arrête
For i = 1 To 100
'pourquoi ne pas avoir déclaré i ?
    Workbooks(Data).Activate
    Sheets(SHEET_TRAVAIL_DATA).Select
    'même remarque que précédemment
    Ticker(i) = Cells(4, i).Value
    Valeur(i) = Cells(LigneDate, i).Value
    'On a 2 tableaux non déclarés, alors qu'on a 100 données
    Workbooks(WORKBOOK_GUIDE).Activate
    Sheets(SHEET_TRAVAIL_GUIDE).Select
    'même remarque que ci-dessus
    TickerRecherche = Ticker(i)
    'Quel est le but de ce transfert dans une nouvelle variable ?
    Set LigneTicker = Range("A1:A10000").Find(TickerRecherche, LookIn:=xlValues, LookAt:=xlWhole)
    If Not LigneTicker Is Nothing Then
        LigneActif = LigneTicker.Row
    Else
        MsgBox "Le ticker recherché n'existe pas." & Chr(10) & _
        "Veuilez s'il-vous-plait modifier en conséquence. Merci !", vbOKOnly + vbExclamation, "Erreur dans la saisie de ticker"
    End If
    '"if not" alors qu'on utilise Else. pourquoi ne pas supprimer le Not et inversé les traitements Vrai/Faux ?
    'Pareil, on prévient que ça va merder, mais on ne fait rien et on continue la macro
    Cells(LigneActif, 5) = Valeur(i)
    'Comme je ne sais pas ce qu'on attend, je prie pour qu'il y ait au moins une première ligne
Next i
End Sub
Mais j'avoue ne pas avoir tenté d'en faire une, jugeant que je n'avais pas assez d'infos. Ce qui fait que je n'ai pas fait d'erreur :D.

En étant plus sérieux, comme ce que je crois comprendre du but de la macro est une recopie d'un classeur sur un autre, je les mettrais en variable (ou au moins un).
Maiss pour faire une macro, il faut à mon sens :
Un but : ce que doit faire la macro et on ne l'a pas
des données : noms des classeurs, feuilles, adresses de plages et on ne les a pas non plus.
L'organisation de ses données n'est pas connue, elle non plus.
Donc, personnellement, je ne pense pas être capable d'en faire une qui tienne la route avec les infos fournies. Mais je suis peut-être trop timoré.
A+
 

Etienne2323

XLDnaute Impliqué
Re : Bogue dans ma macro!

Salut à tous, Charles, Gorfael, le forum,
en tenant compte de vos commentaires Gorfael, j'ai tenté de modifier un peu le code que j'ai proposé de manière à ce qu'il soit plus près de la réalité. Dites-moi ce que vous en pensez.
Aussi, Charles, il serait bien que tu nous enligne dans la bonne direction !

Cordialement,

Étienne

Code:
Dim Valeur(1 To 100) As Variant 'Pour créer les tablo
Dim Ticker(1 To 100) As Variant

Sub Importation_guide()

Dim LD, LigneTicker 'la valeur par défaut est variant --> Je ne le savais pas. Merci de l'info ;)
Dim DateTravail As Date
Dim LigneDate As Long, LigneActif As Long, i As Long
Dim WORKBOOK_PROCEDURE_GUIDE As String, SHEET_TRAVAIL_DATA As String, DATA As String

'Citer les variables et les valeurs qu'elles devraient prendre
WORKBOOK_PROCEDURE_GUIDE = "Nom du classeur"
SHEET_TRAVAIL_DATA = "Nom de la feuille"
DATA = "Nom d'un autre classeur"

Application.ScreenUpdating = False

'Je changerais le Feuil1 ici pour le mettre également dans une variable
DateTravail = Workbooks(WORKBOOK_PROCEDURE_GUIDE).Sheets("Feuil1 ").Cells(42, 3).Value

Workbooks(DATA).Activate
Sheets(SHEET_TRAVAIL_DATA).Select
Set LD = Range("A1:A10000").Find(DateTravail, LookIn:=xlFormulas, LookAt:=xlWhole)
If Not LD Is Nothing Then
    LigneDate = LD.Row
Else
    MsgBox "La date choisie dans la procédure n'existe pas encore dans l'onglet FSJ ACTIF T." & Chr(10) & _
    "Veuilez s'il-vous-plait modifier en conséquence. Merci !", vbOKOnly + vbExclamation, "Erreur dans le choix de la date"
    Exit Sub 'Je demanderais directement de sortir de la macro si la date entrée n'est pas valide.
End If

For i = 1 To 100
    Workbooks(DATA).Activate
    Sheets(SHEET_TRAVAIL_DATA).Select
    Ticker(i) = Cells(4, i).Value
    Valeur(i) = Cells(LigneDate, i).Value
    
    Workbooks(WORKBOOK_GUIDE).Activate
    Sheets(SHEET_TRAVAIL_GUIDE).Select
    Set LigneTicker = Range("A1:A10000").Find(Ticker(i), LookIn:=xlValues, LookAt:=xlWhole)
    If Not LigneTicker Is Nothing Then
        LigneActif = LigneTicker.Row
    Else
        MsgBox "Le ticker recherché n'existe pas." & Chr(10) & _
        "Veuilez s'il-vous-plait modifier en conséquence. Merci !", vbOKOnly + vbExclamation, "Erreur dans la saisie de ticker"
        Exit Sub 'Même opération que plus haut.
        'On pourrait également faire une sorte de Goto pour juste passer au prochain ticker plutot que de sortir
        'de la macro.
    End If
    'ICI, je ne suis pas certain de savoir comment il faudrait procéder pour remplir votre proposition.
    '"if not" alors qu'on utilise Else. pourquoi ne pas supprimer le Not et inversé les traitements Vrai/Faux ?
    Cells(LigneActif, 5) = Valeur(i)
Next i

End Sub
 

Statistiques des forums

Discussions
312 216
Messages
2 086 351
Membres
103 195
dernier inscrit
martel.jg