Bloc with non défini

Calvus

XLDnaute Barbatruc
Bonjour le forum,

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.

Merci
 

Pièces jointes

  • Bloc With.xlsm
    18.4 KB · Affichages: 60

Lone-wolf

XLDnaute Barbatruc
Re : Bloc with non défini

Bonjour Calvus

J'ai apporté quelques modifs aux codes.


Code:
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


A+ :cool:
 
Dernière édition:

Calvus

XLDnaute Barbatruc
Re : Bloc with non défini

Bonjour Lone-Wolf, le forum,

Lone-wolf à dit:
Ecrire ainsi, vu qu'elle correspond à une fonction
'et non à une cellule

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
 

Paf

XLDnaute Barbatruc
Re : Bloc with non défini

Bonjour Calvus, Lone-wolf,

trouver une correspondance de la feuille 3 sur la 2, via Application.Match.

avec ce code:
Code:
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.

A+
 

Calvus

XLDnaute Barbatruc
Re : Bloc with non défini

Re, bonjour Paf,

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 ?

Merci
 

Lone-wolf

XLDnaute Barbatruc
Re : Bloc with non défini

Bonjour Paf, Calvus

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


A+ :cool:
 
Dernière édition:

Paf

XLDnaute Barbatruc
Re : Bloc with non défini

Re,

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)

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 !

A+
 

Lone-wolf

XLDnaute Barbatruc
Re : Bloc with non défini

Un petite modification de la macro de Paf

Code:
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


A+ :cool:
 

Lone-wolf

XLDnaute Barbatruc
Re : Bloc with non défini

Une autre proposition


Code:
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


A+ :cool:
 
Dernière édition:

Si...

XLDnaute Barbatruc
Re : Bloc with non défini

Salut

du Match au Find (avec ton beau bouton :D:D)

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 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
 

Pièces jointes

  • Match Find.xlsm
    47.2 KB · Affichages: 50

Calvus

XLDnaute Barbatruc
Re : Bloc with non défini

Bonsoir à tous, Lone-wolf, Paf, Doudle Zéro, Si,

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

Merci et bonne soirée.
A bientôt
 

Pièces jointes

  • Match Find Par Si.xlsm
    46.7 KB · Affichages: 53

Si...

XLDnaute Barbatruc
Re : Bloc with non défini

Re

avec Find, cela pourrait être
Code:
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
 

Discussions similaires

Réponses
4
Affichages
197

Statistiques des forums

Discussions
312 115
Messages
2 085 455
Membres
102 891
dernier inscrit
cocowild