probleme sur code recherche / suppression

VBA_première_fois

XLDnaute Junior
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 :eek:
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

merci :cool:
 

Etienne2323

XLDnaute Impliqué
Re : probleme sur code recherche / suppression

Salut,


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

Au plaisir,

Étienne
 

JNP

XLDnaute Barbatruc
Re : probleme sur code recherche / suppression

Bonsoir VBA... :),
Essaie avec ceci
Code:
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
Il manquait une référence au classeur :
Code:
[COLOR=black]Set c = wkbCible.Worksheets("Feuil1").Range("A2:A" & [COLOR=#ff0000]wkbCible.[/COLOR]Worksheets("Feuil1") _
  .Range("I65536").End(xlUp).Row).Find(wkbSource.Worksheets("Feuil1").Range("A" & n), LookIn:=xlValues, lookat:=xlWhole)[/COLOR]
mais je pense plutôt que c'était le Selection.Rows qui coinçait ;).
Bon courage :cool:
Ajout : Bonjour Etienne
 
Dernière édition:

VBA_première_fois

XLDnaute Junior
Re : probleme sur code recherche / suppression

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

une fois le nettoyage fini je vais mettre


MsgBox "le classeur est maintenant nettoyé"
 

Pièces jointes

  • CLASSEUR1.xls
    13.5 KB · Affichages: 44
  • CLASSEUR2.xls
    13.5 KB · Affichages: 45
  • CLASSEUR1.xls
    13.5 KB · Affichages: 44
  • CLASSEUR2.xls
    13.5 KB · Affichages: 48
  • CLASSEUR1.xls
    13.5 KB · Affichages: 54
  • CLASSEUR2.xls
    13.5 KB · Affichages: 36

Gorfael

XLDnaute Barbatruc
Re : probleme sur code recherche / suppression

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.
Code:
wkbCible.Worksheets("Feuil1").Rows(Selection.Rows).Delete
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+
 

VBA_première_fois

XLDnaute Junior
Re : probleme sur code recherche / suppression

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

Merci par avance :cool:
 

Statistiques des forums

Discussions
312 489
Messages
2 088 855
Membres
103 977
dernier inscrit
Hermet