Bonjour le forum merci par avance pour l'aide que vous m'apportez
ceci est une partie de mon code merci de me le corriger , si vous avez des remarque / suggestion n'hesitez pas
voila j'ai
2 classeurs : wkbSource et wkbCible
- il me prend les données de la colonne A de ma feuille ERREURS du classeur wkbSource
- il leS cherche dans la colonne A de maFeuil1 de mon classeur
- une fois trouver il me supprime toute la ligne
je crois que mon prebeme vient de la ligne en rouge
Code:
Set wkbSource = ThisWorkbook
For n = 2 To wkbSource.Worksheets("[COLOR="Magenta"]ERREURS[/COLOR]").Range("A65536").End(xlUp).Row
wkbCible.Activate
[COLOR="Red"]Set c = wkbCible.Worksheets("[COLOR="seagreen"]Feuil1[/COLOR]").Range("A2:A" & Worksheets("[COLOR="seagreen"]Feuil1[/COLOR]") _
.Range("I65536").End(xlUp).Row).Find(wkbSource.Worksheets("Feuil1").Range("A" & n), LookIn:=xlValues, lookat:=xlWhole)[/COLOR]
c.Select
If Not c Is Nothing Then
[COLOR="Blue"]wkbCible.Worksheets("[COLOR="seagreen"]Feuil1[/COLOR]").Rows(Selection.Rows).Delete[/COLOR]
End If
Next n
voici une première ébauche rapide. C'est certain que sans classeur pour pouvoir tester, c'est un peu plus compliqué. Voyez le résultat et dites-moi si tout fonctionne bien.
Code:
Sub Test()
Dim DerniereLigne_Source As Integer, DerniereLigne_Feuil1 As Integer, n As Integer, Ligne As Integer
Dim Valeur_recherche
Application.ScreenUpdating = False
Set wkbSource = ThisWorkbook
'Il faut setter ton wkbCible
'Set wkbCible = Autre classeur
DerniereLigne_Source = wkbSource.Worksheets("ERREURS").Range("A65536").End(xlUp).Row
DerniereLigne_Feuil1 = wkbCible.Worksheets("Feuil1").Range("I65536").End(xlUp).Row
For n = 2 To DerniereLigne_Source
wkbCible.Activate
Valeur_recherche = wkbSource.Worksheets("Feuil1").Range("A" & n)
Set c = wkbCible.Worksheets("Feuil1").Range("A2:A" & DerniereLigne_Feuil1).Find(Valeur_recherche, LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
Ligne = c.Row
wkbCible.Worksheets("Feuil1").Cells(Ligne, 1).EntireRow.Delete
Ligne = 0
Else
'Qu'est-ce qui se passe s'il ne trouve pas ???
'Vous devriez penser à un plan B au cas où la recherche ne trouve pas la valeur souhaitée
End If
Next n
End Sub
Set wkbSource = ThisWorkbook
For n = 2 To wkbSource.Worksheets("ERREURS").Range("A65536").End(xlUp).Row
wkbCible.Activate
With wkbCible.Worksheets("Feuil1")
Set c = .Range("A2:A" & .Range("I65536").End(xlUp).Row).Find(.Range("A" & n), LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
.Rows(c.Row).Delete
End With
End If
Next n
Etienne2323 merci pour ta reponse concernant le plan B dont tu m avais parlé , le but et de nettoyer la feuille1 des erreurs .
les erreurs se trouve dans lé feuille "ERREUR" du clssaur source
il fait une recherche dans toute la feuille1 si il trouve un ressemblence il supprime toute la ligne , si il trouve pas il passe à la ligne suivante tout simplement
Salut VBA_première_fois et le forum
Quel est le problème réel ? Tu n'en dis rien, tu ne donnes qu'un extrait de ton code, parce que tu supposes avoir trouvé la ligne en défaut, et tu espères un dépannage rapide ? Peu de chance que je trouve, alors quelques remarques
Code:
wkbCible.Activate '*************************
Set c = wkbCible.Worksheets("Feuil1").Range("A2:A" & Worksheets("Feuil1") _
.Range("I65536").End(xlUp).Row).Find(wkbSource.Worksheets("Feuil1").Range("A" & n), LookIn:=xlValues, lookat:=xlWhole)
c.Select '**********************
If Not c Is Nothing Then
wkbCible.Worksheets("Feuil1").Rows(Selection.Rows).Delete
tant que tu utiliseras des select/activate/selction dans tes codes, ne t'étonnes pas d'avoir des erreurs et des ralentissements.
Il faut rester cohérent : si tu actives un classeur, il faut activer aussi la feuille, pas espérer que ce soit la bonne qui est active.
Find : tu commences à la ligne 3 pour le premier passage : le paramètre after n'étant pas mentionné, il prend la valeur par défaut ; ActiveCell
Set C : si tu mentionnes les classeur/feuille pour range("A2:", pourquoi tu ne le mentionne pas pour la recherche du End ?
Il faut rester cohérent : soit tu le mentionnes systématiquement, soit pas du tout.
Code:
Set c = wkbCible.Worksheets("Feuil1").Range("A2:A" & wkbCible.Worksheets("Feuil1"). _
.Range("I65536").End(xlUp).Row).Find(wkbSource.Worksheets("Feuil1").Range("A" & n), LookIn:=xlValues, lookat:=xlWhole)
c.select : à quoi ça sert ? À rien : c ets une variable qui contient la cellule, et ça suffit à Excel.
Pas l'impression que que tu comprennes réellement ce que tu fais : Find ne te retourne qu'une seule cellule. même s'il a 50 réponses possibles.
Donc, en admettant que C soit A8 :
c.select : on sélectionne A8
(Selection.Rows) : comme ce n'est qu'une seule cellule, on compte le nombre de lignes et on arrive à 1 dans tous les cas. donc
Rows(Selection.Rows).delete revient à écrire supprimer la ligne 1
Pour un dépannage il faut toujours
- Donner la macro en entier : certaines erreurs découlent de variables qui sont initialisées ailleurs que dans un extrait. Si ces variables sont initialisées dans une autre macro, il faut aussi qu'on le sache.
- Donner le type de module où se situe la macro qui peut avoir une influence (le titre nous dit, si c'est une macro à lancement automatique, dans quel type de module elle est).
- Donner le fonctionnement attendu de la macro
- Donner une idée des données traitées
- Indiquer le problème rencontré : on n'est pas devin et certains problèmes sont introuvables, si on ne sait pas ce qu'on doit chercher, parce que même en faisant l'essai de la macro, on ne traite que quelques lignes, avec des données qui nous semblent correctes, et comme on essaie de faire coller ces données à la macro, certaines erreurs sont masquées.
A+
bonjour Gorfael merci bcp pour ton précieux aide
voici mon probleme en detail
le but :nettoyer un classeur comment : dans mon classeur1 j'ai une feuille avec le nom Erreur cette feuille contient des données fausses dans la cell I
toutes ces données fausses doivent etre supprimées de de la feuille1 de mon classeur 2
d'abord je commece par demander à l'utilisateur de choisir le classeur qu'il souhaite nettoyer
puis je commence le traitemment sur ce même classeur que je nome wkbcible
voici mon code complet :
il active le classeur qui contient mon USF
prend la colone I1, I2, I3, ..... In et les cherche une par une dans calsseur2/feuil1/coloneI , une fois trouvés il supprime toute la ligne voila
certe je suis debutant en Vba mais ce code represente mon maximum si tu peu m'aider
Code:
Private Sub CommandButton14_Click()
'On Error Resume Next
' Dim wkbSource As Workbook, wkbCible As Workbook, fichier As String
'Application.Workbooks.Open Application.GetOpenFilename()
'On Error Resume Next
Dim wkbSource As Workbook, wkbCible As Workbook, fichier As String
Dim ws As Worksheet, x&, i&, j&, k&, L&, a, nom As String
fichier = ThisWorkbook.Path
Set wkbSource = ThisWorkbook 'ThisWorkbook signifie le classeur de ma macro
Set FD = Application.FileDialog(msoFileDialogOpen)
With FD
fichier = ThisWorkbook.Path
.Title = "Choisissez le Fichier que Vous Souhaitez Mettre à Jour"
.InitialFileName = fichier & "\chemin\chemin\*"
.Filters.Clear
.Filters.Add "Fichier Excel", "*.xls"
.AllowMultiSelect = False
If .Show <> 0 Then
nom = .SelectedItems(1)
Else
MsgBox "Vous n'avez aucun fichier dans votre dossier", , "Manque de Fichier"
End If
End With
Set wkbCible = Workbooks.Open(nom) [COLOR="Red"]ceci represente le classeur que l'utilisateur a choisi[/COLOR]
Application.Workbooks(1).Activate
''''''''''''''''''''''''''''''''''''''''
Set wkbSource = ThisWorkbook 'ThisWorkbook signifie le classeur de ma macro
For n = 2 To wkbSource.Worksheets("erreur").Range("I65536").End(xlUp).Row
wkbCible.Activate
Set c = wkbCible.Worksheets("Feuil1").Range("I2:I" & Worksheets("Feuil1") _
.Range("I65536").End(xlUp).Row).Find(wkbSource.Worksheets("Feuil1").Range("I" & n), LookIn:=xlValues, lookat:=xlWhole)
c.Select
MsgBox "nom du classeuractif " & Selection & ActiveWorkbook.Name
If Not c Is Nothing Then
wkbCible.Worksheets("Feuil1").Rows(Selection.Rows).Delete
End If
Next n
End Sub