Objet requis méthode Find boucle
Bonjour à tous,
Je débute en VBA et malgré tous les conseils avisés que j'ai pu trouver sur ce site, j'ai toujours un programme qui ne tourne pas
A l’exécution j'ai le message d'erreur 424 "Objet requis" qui s'affiche, concernant la ligne de fin de boucle...
Je ne peux pas communiquer les données mais je vous explique rapidement. Il y a deux tableaux avec des noms de société et des volumes associés, et j'essaye de retrancher au premier tableau les volumes doublons, ceux qu'on retrouve dans les deux tableaux (pour qu'un volume ne soit pas comptabilisé deux fois pour une même société).
Mon code est le suivant :
Sub Doublon()
' Macro2
' Retranche les doublons de volume présents dans NEG du tableau PROD
Dim num_lastrow_NEG As Integer
Dim num_lastrow_PROD As Integer
num_lastrow_NEG = Sheets("NEG").Range("NEG").Rows.Count
num_lastrow_PROD = Sheets("PROD").Range("PROD").Rows.Count
Sheets("NEG").Range("K2") = num_lastrow_NEG
Sheets("NEG").Range("K3") = num_lastrow_PROD
Dim i As Integer
Dim A As Variant
Dim B As Variant
Dim CB As Integer
Dim Premier As Variant
Dim Ad As Variant
For i = 1 To num_lastrow_NEG 'boucle qui parcourt le tableau NEG
Set A = Sheets("NEG").Range("NEG").Cells(i, 7) 'Nom de la société dans tableau NEG
Set B = Sheets("PROD").Range("PROD").Columns(3).Find(What:=A, LookIn:=xlValues, LookAt:=xlPart) 'recherche dudit nom dans le tableau PROD
If Not B Is Nothing Then
Premier = B.Address
Ad = B.Address
Do
CB = B.Column
If Sheets("PROD").Range("PROD").Cells(CB, 1) = Sheets("NEG").Range("NEG").Cells(i, 1) And _
Sheets("PROD").Range("PROD").Cells(CB, 2) = Sheets("NEG").Range("NEG").Cells(i, 2) Then 'deux autres données doivent correspondre entre les deux tableaux : celles des colonnes 1 et 2
Sheets("PROD").Range("PROD").Cells("CB", 7) = Sheets("PROD").Range("PROD").Cells("CB", 7) - Sheets("NEG").Range("NEG").Cells(i, 8) 'retranche le volume NEG au volume PROD
Exit Do
Else
B = Sheets("PROD").Range("PROD").Columns(3).FindNext(B) 'Si les conditions ne sont pas respectée, recherche à nouveau de A dans la colonne 3 du tableau PROD
Ad = B.Address
End If
Loop While Not B Is Nothing And Ad <> Premier 'Là est l'erreur "Objet requis"
End If
Next
End SubEst-ce que quelqu'un voit le problème ? Vous me sauveriez la vie
Je vous remercie !
Bonne journée,
Bonjour,
3 lignes plus haut : Set B =... serait mieux que B = ...
(B étant déclaré comme Variant au lieu de Range, B = ... fonctionne et prend la valeur de la cellule si trouvée...
A et B devraient être déclarés comme Range, et Ad et Premier comme String)
Il y a aussi d'autres interrogations :
CB est initialisée comme numéro de colonne (B.Column)
Elle est utilisée ligne suivante en position de numéro de ligne !? Peut-être est-ce voulu, mais cela mérite d'être signalé au cas où
d'autant plus que à la ligne qui suit, "CB" est mis ainsi, toujours en position de numéro de ligne !!!
Là je doute fort qu'une ligne numérotée "CB" puisse être trouvée !
Cordialement.
Merci MFerrand pour cette réponse !
Décidément beaucoup d'erreurs...
J'ai changé tout ça, ça marche nickel maintenant, merci beaucoup
Bonne journée !
Pas si résolu que ça en fait ! Le programme tourne certes, mais cela prend un temps fou, comme si les boucles tournaient plus longtemps qu'il ne le faut... Et puis cela ne traite pas correctement le tableau. Parfois, des doublons ne sont pas mis en évidences par la macro.
Pour la tester, j'ai coloré les cases "à traiter", c'est à dire les lignes sur lesquelles doivent s'effectuer le dédoublonnage.
Parfois, des cases ne sont pas colorés, donc pas traitées alors que l'on retrouve bien le nom de la société dans les deux tableaux (=doublon), et que les deux conditions sont respectées (année du contrat et couleur identiques sur les deux lignes concernées par le doublon de nom).
Voici le code modifié après les conseils de MFerrand avec le test "case colorée" :
Sub DoublonTOTAL()
'
' Macro18
' Retranche les doublons de volume présents dans NEG du tableau PROD
Dim num_lastrow_NEG As Integer
Dim num_lastrow_PROD As Integer
num_lastrow_NEG = Sheets("NEG").Range("NEG").Rows.Count
num_lastrow_PROD = Sheets("PROD").Range("PROD").Rows.Count
Sheets("NEG").Range("K2") = num_lastrow_NEG
Sheets("NEG").Range("K3") = num_lastrow_PROD
Dim i As Integer
Dim A As Range
Dim B As Range
Dim lB As Integer
Dim Premier As String
Dim Ad As String
For i = 1 To num_lastrow_NEG 'boucle qui parcourt le tableau négoce
Set A = Sheets("NEG").Range("NEG").Cells(i, 7)
Set B = Sheets("PROD").Range("PROD").Columns(3).Find(What:="*A*", LookIn:=xlValues, LookAt:=xlPart)
If Not B Is Nothing Then
Premier = B.Address
Ad = B.Address
Do
lB = B.Row
If Sheets("PROD").Range("PROD").Cells(lB, 1) = Sheets("NEG").Range("NEG").Cells(i, 1) And _
Sheets("PROD").Range("PROD").Cells(lB, 2) = Sheets("NEG").Range("NEG").Cells(i, 2) Then
Sheets("PROD").Range("PROD").Cells(lB, 7).Interior.ColorIndex = 6 'test couleur : colorée la case concernée par le doublon dans le tableau PROD
Sheets("NEG").Range("NEG").Cells(i, 7).Interior.ColorIndex = 7 'test couleur NEG
' code qui dans la version finale prendra la place du test couleur : Sheets("PROD").Range("PROD").Cells(lB, 7) = Sheets("PROD").Range("PROD").Cells(lB, 7) - Sheets("NEG").Range("NEG").Cells(i, 8)
Exit Do
Else
Set B = Sheets("PROD").Range("PROD").Columns(3).FindNext(B)
Ad = B.Address
End If
Loop While Not B Is Nothing And Ad <> Premier
End If
Next
End SubMerci d'avance de votre aide !
Bonsoir,
Je te rappelle que je n'ai fait qu'indiquer des sources réelles ou potentielles d'erreurs. Je n'ai rien proprosé, et je ne sais pas ce que doit faire ta macro !
Cordialement.