Après 3 heures de prise de tête, je vous soumets un problème déjà évoqué plusieurs fois ici mais dont je n'arrive pas à me dépêtrer !
Le code est celui de la feuille 2.
Le second code de la même feuille fonctionne.
Ce que j'essaie de faire, est de trouver une correspondance de la feuille 3 sur la 2, via Application.Match.
J'ai refait des codes des dizaines de fois, il ne ressemble donc plus à ce que c'était il y a une heure; mais qui était plus simple et me renvoyait Variable de Bloc With Non Défini.
Tel qu'il est écrit maintenant, le code ne génère plus d'erreur mais ne renvoie simplement rien.
Sub çamenerve()
Dim cel As Range
For Each cel In Feuil1.Range("a3:a10")
If cel.Offset(0, 4) < Date Then
MsgBox (cel)
cel.Offset(0, 1) = "Ok"
cel.Offset(0, 5) = "ça c'est fait !"
End If
Next
End Sub
'----------------------------------------
Sub Remplir_Feuille()
Dim plage As Range
Dim cel As Range
Dim Clicel 'Ecrire ainsi, vu qu'elle correspond à une fonction
'et non à une cellule
Set plage = Feuil3.Range("C2: C" & Range("C65000").End(xlUp).Row)
'If cel Is Nothing Then
'Exit Sub
'End If
For Each cel In plage
For i = 2 To cel.Count
Clicel = Application.Match(i, plage, 0)
MsgBox (Clicel)
Range("D8") = Clicel
i = i + 1
Next i
Next
End Sub
Sub fr()
'J'ai vu que c'est ici le problème.
'A quoi correspond Range("c8") et à qu'elle feuille ???
Dim cel As Range
Dim Clicel
cel = Range("c8")
Clicel = Application.Match(cel, Feuil3.Range("c2:c10"), 0)
Range("D8") = Clicel
End Sub
Que veux tu dire par là ? S'agit il de l'ordre d'écriture ?
Car c'est la seule modification que tu aies faite à cette macro je crois.
Par ailleurs, elle ne fonctionne pas davantage maintenant.
Lone-wolf à dit:
'J'ai vu que c'est ici le problème.
'A quoi correspond Range("c8") et à qu'elle feuille ???
Il n'y avait pas de problème ici justement.
Range C8 est celui de la feuille 2.
Donc chercher la ligne équivalente en feuille 3
Ta macro modifiée me génère maintenant la même erreur que celle que j'avais.
A terme mon souhait est de remplir un tableau en fonction des données trouvées dans la feuille 3.
Si mes explications ne sont pas suffisantes, je joindrai un autre fichier.
Merci
For Each cel In plage
For i = 2 To cel.Count
Clicel = Application.Match(i, plage, 0)
...
pour chaque élément Cel de la plage plage de la feuille 3 on essai de faire une boucle de 2 à Cel.count; mais Cel étant une seule cellule, Cel.count = 1. il n'y a pas d'erreur mais on ne passe jamais dans la boucle.
Et, si toutefois on passait dans la boucle, l'instruction Clicel = Application.Match(i, plage, 0) ne trouverait jamais rien puisque qu'on cherche dans plage (ne contenant que des lettres) une valeur donnée par la variable i ne contenant que des nombres.
A aucun moment on essaye de chercher dans la feuille 3 ( plage) les éléments de la feuille 2.
On pourrait définir une autre plage contenant les éléments de la feuille 2, et, pour chaque élément d'une plage 'Matcher' tous les éléments de l'autre ...
On pourrait aussi utiliser des tableaux (au sens array ) si les plages étaient très grandes, pour gagner en vitesse de traitement.
Paf, merci. J'ai cru comprendre ce que tu me disais. Mais cru seulement.
J'ai essayé ce code :
VB:
Sub Remplir_Feuille_Ancien()
Dim plage As Range
Set plage = Feuil3.Range("C2: C" & Range("C65000").End(xlUp).Row)
Dim cel As Range
Dim Clicel As Range
Dim playa As Range
Set playa = Feuil2.Range("C2: C" & Range("C65000").End(xlUp).Row)
For Each cel In playa
Clicel = Application.Match(cel, plage, 0)
MsgBox (Clicel)
Range("D8") = Clicel
Next cel
End Sub
Mais j'obtiens toujours l'erreur :
Erreur d'exécution 91
Variable objet ou variable de bloc With non définie.
L'erreur se situe à la ligne : Clicel = Application.Match(cel, plage, 0)
Est ce une erreur d'écriture ici, ou faut il que je modifie autre chose ?
D'après ce que j'ai compris (j'éspère?!). Et comme ceci?
Code à modifier bienentendu, et les autres macro c'est mieux qu'elles soient dans le module.
Code:
With Sheets(3).Range("c2:c1000")
Set cel = .Find(valeur à rechercher, ,xlValues)
If Not cel Is Nothing Then
MsgBox cel.offset(0, 0).Value
Sheets(2).Range("D8") = cel.offset(0, 1).Value
End If
End With
Application.Match renvoie la position de l'élément trouvé dans la plage , donc un nombre et non pas un range.
En modifiant Dim Clicel As Range en Dim Clicel As Integer, l'erreur disparait !
une version:
Code:
Sub Remplir_Feuille_Ancien()
Dim plage As Range, cel As Range, playa As Range, Clicel As Integer
Set plage = Feuil3.Range("C1: C" & Feuil3.Range("C65000").End(xlUp).Row)
Set playa = Feuil2.Range("C1: C" & Feuil2.Range("C65000").End(xlUp).Row)
For Each cel In playa
Clicel = Application.Match(cel, plage, 0)
If Clicel > 0 Then
MsgBox cel & " trouvé en position : " & Clicel
Else
MsgBox cel & " Non trouvé "
End If
Range("D8") = Clicel ' à revoir ?
Next
End Sub
Quant à Range("D8") = Clicel donne l'information de la position trouvée (sans savoir quel élément) mais écrasée par la recherche suivante !
Sub Remplir()
Dim plage As Range, cel As Range, playa As Range, Clicel As Integer
Set plage = Feuil3.Range("C1: C" & Feuil3.Range("C65000").End(xlUp).Row)
Set playa = Feuil2.Range("C1: C" & Feuil2.Range("C65000").End(xlUp).Row)
For Each cel In playa
Clicel = Application.Match(cel, plage, 0)
If Clicel > 0 Then
MsgBox Clicel
cel.Offset(0, 1) = Clicel
Else
MsgBox cel & " Non trouvé "
End If
Next
End Sub
Sub Remplir()
Dim x As Integer, cel As Range
With Sheets(3).Range("c1:c1000")
Set cel = .Find(Sheets(2).Range("g2"), , xlValues)
If Not cel Is Nothing Then
With Feuil2
x = .Range("d65000").End(xlUp).Row
MsgBox " " & cel.Offset(0, 0), , "CALVUS"
x = cel.Offset(0, 1)
.Cells(x, 4) = cel.Offset(0, 1)
End With
End If
End With
End Sub
Private Sub CommandButton2_Click()
Dim R As Range, L As Long
[F:F].Clear
For Each R In Range("C1", [C6000].End(xlUp))
If IsError(Application.Match(R, Feuil3.[C:C], 0)) Then
R(1, 4) = "oups"
Else
R(1, 4) = Application.Match(R, Feuil3.[C:C], 0)
End If
Next
End Sub
Private Sub CommandButton1_Click()
Dim C As Range, R As Range
[D:D].Clear
For Each C In Range("C1", [C6000].End(xlUp))
Set R = Feuil3.[C:C].Find(C, , , 1)
If R Is Nothing Then C(1, 2) = "Oups" Else C(1, 2) = R.Row
Next
End Sub
Je viens de rentrer et trouve vos multiples réponses. Je vous en remercie grandement.
Je voudrais vous présenter certaines excuses, car je me suis aperçu en lisant vos propositions que ma demande n'était pas claire, et que j'ai pu vous faire perdre du temps.
C'était évidemment involontaire, car habitué aux formules et à procéder pas à pas, je n'avais pas à ce point saisi que l'écriture d'un code pouvait tant varier quant à l'objectif.
Avec les formules, on peut les imbriquer relativement facilement, et il m’apparaît qu'il n'en est pas de même pour le Vba.
Et comme je souhaite progresser, lorsque je bute sur un point et que je m'adresse au forum, c'est sans la perspective que le résultat escompté va dépendre du code in fine.
Comme par ailleurs je n'attends pas de solutions clé en main, je suis probablement (inconsciemment) réticent à exposer tout le problème d'un seul coup, au risque d'avoir à appliquer la solution sans essayer de la trouver par moi même.
J'avais commencé l'établissement d'un fichier vraiment représentatif de ma demande, mais n'ai pas eu le temps de le poster.
Vraiment désolé si vous avez eu l'impression de chercher inutilement.
Mais ce n'était pas inutile car j'apprends beaucoup en essayant de décoder les codes que vous m'avez transmis.
Du coup, c'est le code de Si que j'ai réussi à adapter à ce que je souhaitais. Je transmets le fichier modifié.
Paf, ton code fonctionne évidemment mais je n'ai pas réussi à l'adapter. Merci
Double Zéro, il en est de même. Merci
Lone wolf, également, mais en plus, ça génère des erreurs même sans le toucher. Merci
Si, exactement ce que je voulas. MerSi
Code de Si modifié :
VB:
Private Sub CommandButton2_Click()
Dim R As Range, L As Long
[F:F].Clear
For Each R In Range("C1", [C6000].End(xlUp))
If Not IsError(Application.Match(R, Feuil3.[C:C], 0)) Then
R(1, 4) = Application.Index(Feuil3.[B:F], Application.Match(R, Feuil3.[C:C], 0), 3)
R(1, 5) = Application.Index(Feuil3.[B:F], Application.Match(R, Feuil3.[C:C], 0), 4)
R(1, 6) = Application.Index(Feuil3.[B:F], Application.Match(R, Feuil3.[C:C], 0), 5)
R(1, 3) = Application.Index(Feuil3.[B:F], Application.Match(R, Feuil3.[C:C], 0), 1)
End If
Next
End Sub
Private Sub CommandButton1_Click()
Dim C As Range, R As Range
[E:H].Clear 'comme pour l'autre
For Each C In Range("C1", [C6000].End(xlUp))
Set R = Feuil3.[C:C].Find(C, , , 1)
If Not R Is Nothing Then
C(1, 3) = R(1, 0): C(1, 4).Resize(, 3) = R(1, 2).Resize(, 3).Value
end if
Next
End Sub