Vba : erreur formule

Bonjour,

Je souhaiterais trouver une cellule en cherchant sa ligne et sa colonne selon deux valeurs d'un tableau :

Dim c As Integer
Dim cherche As String
cherche = Feuil2.Range("B" & I).Value
c = Feuil5.Cells.Find(what:=cherche, LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlNext).Row
Dim b As Integer
cherche = UserForm2.TextBox69
b = Feuil5.Cells.Find(what:=cherche, LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlNext).Column
Feuil5.Range(b & c).Offset(0, 1) = Feuil5.Range(b & c).Offset(0, 1).Value + 1
Unload UserForm2
End Sub

Il me dit que la méthode range de l'objet worksheet a échoué... vous avez une idée ?
Configuration: Windows XP Internet Explorer 6.0

24 réponses

Résumé de la discussion

Cette discussion porte sur une macro Excel VBA qui cherche une cellule selon deux valeurs dans un tableau, puis incrémente une cellule voisine et traite l’erreur 'Range de l'objet Worksheet a échoué'. Plusieurs répondants suggèrent d’utiliser Cells(ligne, colonne) plutôt que Range(b & c), d’exploiter Cells trouvées par Find et d’employer End(xlUp) pour déduire la dernière ligne, afin d’éviter l’échec de Range et les valeurs inconnues. Des contributions détaillent une méthode utilisant une plage, CountIf puis Find, et l’incrémentation d’une cellule adjacente lorsque les valeurs existent, avec paramètres et gestion d’erreur. En pratique, les adoptants convergent vers une boucle For qui lit chaque ligne, récupère cherche_lig et cherche_col, puis met à jour une colonne ciblée dans la feuille secondaire.

Bobot (l’IA à votre service)
  1. Après quelques suppressions cela fonctionne :

    Dim derlig As Integer, cherche_lig As String, cherche_col As String
    Dim lig_cibl As Integer, col_cibl As Byte
    Dim zone As Range

    derlig = Sheets("Archive Cessions").Range("B65536").End(xlUp).Row
    Application.ScreenUpdating = False

    With Sheets("Archive Cessions")
    cherche_lig = .Cells(derlig, 2)
    cherche_col = .Cells(derlig, 3)
    End With

    With Sheets("Statistiques")
    Set zone = .Range("A1:DN1467")
    If Application.CountIf(zone, cherche_lig) > 0 And Application.CountIf(zone, cherche_col) > 0 Then
    lig_cibl = zone.Find(cherche_lig, , , xlWhole).Row
    col_cibl = zone.Find(cherche_col, , , , xlWhole).Column
    .Cells(lig_cibl + 1, col_cibl) = .Cells(lig_cibl + 1, col_cibl) + 1
    Else
    MsgBox " valeur inconnue", vbCritical
    Exit Sub
    End If
    End With

    Michel, je me suis trompé dans l'envoi du lien et comme je vous l'ai déjà dit, j'ai vraiment apprécié votre aide et c'est grâce à votre proposition que je peux avancer, je vous remercie. Quand ca en marchait pas j'ai essayé de modifier quelques petits trucs pour voir... Ca ne sert à rien de s'énerver. En tout cas merci !
    0
    1. Contributeur
      le 3/2/10, 19:59H

      LES CELLS(LIGNE, COLONNE) ETAIENT INVERSEES EN CELLS(COLONNE,LIGNE) POURQUOI?

      pourtant dans le post 16
      derlig = Sheets("feuil1").Range("B65536").End(xlUp).Row
      Application.ScreenUpdating = False
      
      For cptr = 1 To derlig
              With Sheets("feuil1")
              cherche_lig = .Cells(cptr, 2)
              cherche_col = .Cells(cptr, 3)
              End With


      D'autre part tu commences en Ligne 2 ligne 1 tu as les étiquettes!!!!
      donc
      for cptr=2

      tu as plein d'autres .... (au choix) dans tes macros, mais vu ce que tu fais de ce qu'on te propose

      Je désactive le suivi de ce post
      0
      1. Bonjour,

        En fait, le changement de format n'a pas résolu le problème. Les données sont désormais identiques (l'essai par la fonction si le confirme...) mais je suis toujours bloqué par cet msg box("Valeur inconnue")... j'ai pas passé pas mal de temps dessus mais je ne trovue plus rien... je suis dans une impasse totale car c'est une feuille nécéssaire pour la suite... Je vous ai fait un résumé meilleur qu'hier avec les modification apportées... si quelqu'un trouvait la réponse je lui en serai infiniement reconnaissant...

        http://www.cijoint.fr/cjlink.php?file=cj201002/cijwHekuyv.xls
        0
        1. Contributeur
          re,

          Il m'a fallu Plus d'une demie-heure pour m'y retrouver dans ton classeur: rendre les feuilles, trouver l'usf concerné !...

          Tu as des divergences de types dans tes feuilles dates et agence
          pour les dates: en archives: dates en stat: texte
          pour l'agence en archives: texte en stat: nombre

          donc ca ne risque pas de marcher

          rappel= un "textbox" renvoie du texte utilise la conversion en integer (cint) ou (val)
          les dates étant en texte dans stats il faut transformer si possible la date dans archives en texte et au m^me format
          0
          1. Contributeur
            Bonjour,

            Met moi un extrait de classeur limité aux besoins de ton pb

            As tu essayé la maquette: je voulais savoir si c'était le principe que tu désirais...

            De toutes façons avec 4,9 Mo, fichier obèse, outre le temps d'ouverture, de sauvegarde, tu risques fort d'avoir des refus d'ouverture, de corruption... 95% de ce genre de problèmes viennent de ces fichiers obèses: 2 à 2,5Mo semble la limte. Pour ma part je ne dépasse jamais 1,5 mo et essaie toujours de rester sous 1Mo.

            Dans l'attente (absent cet aprem)
            0
            1. J'ai réussi à résumer mon fichier au strict nécéssaire. VOilà le lien :

              http://www.cijoint.fr/cjlink.php?file=cj201002/cijeps3eE2.xls
              0
          2. Contributeur
            Curieux...
            Ci joint ma maquette de travail
            https://www.cjoint.com/?cbstdQgEBw
            0
            1. Bonjour, Michel.

              Je vous remercie et je ne comprends pas, j'ai copié votre module en faisant les modifications nécéssaires et pourtant il me signale à chaque fois "valeur inconnue"...

              Si vous le souhaitez, je peux vous montrer mon fichier dans la globalité sachant que la procédure se trouve dans l'Userform2.

              http://www.cijoint.fr/cjlink.php?file=cj201002/cij2lSnYwc.xls

              Peut-être que ca sera plus facile pour vous avec une idée précise du fichier.

              Si vous n'avez pas le temps, merci tout de même pour le temps que vous m'avez déjà accordé.
              0
          3. Une fois remplacées les feuilles par leur nom, la formule fonctionne mais me donne chaque fois, la msgbox "valeur inconnue"...

            PS : Si vous me postez des réponses je ne pourrais pas vous répondre avant demain.
            0
            1. Contributeur
              comme promis,
              en me basant sur ton post 6

              Dim derlig As Integer, cherche_lig As String, cherche_col As String
              Dim lig_cibl As Integer, col_cibl As Byte
              Dim zone As Range
              
              derlig = Sheets("feuil1").Range("B65536").End(xlUp).Row
              Application.ScreenUpdating = False
              
              For cptr = 1 To derlig
                      With Sheets("feuil1")
                      cherche_lig = .Cells(cptr, 2)
                      cherche_col = .Cells(cptr, 3)
                      End With
              
                      With Sheets("feuil2")
                      Set zone = .Range("A1:DN1467")
                      If Application.CountIf(zone, cherche_lig) > 0 And Application.CountIf(zone, cherche_col) > 0 Then
                          lig_cibl = zone.Find(cherche_lig, , , xlWhole).Row
                          col_cibl = zone.Find(cherche_col, , , , xlWhole).Column
                          .Cells(lig_cibl, col_cibl + 1) = .Cells(lig_cibl, col_cibl + 1) + 1
                      Else
                          MsgBox " valeur inconnue", vbCritical
                          Exit Sub
                      End If
                     End With
              Next
              
              MsgBox "opération terminée"
              0
              1. Si vous voulez une idée de là où j'en suis, même si Michel disait que ça le deservait :

                Dim MaLigne As Variant
                MaLigne = Range("A1").End(xlDown).Row
                Dim c As Integer
                Dim cherche As String
                cherche = Feuil2.Range("B" & MaLigne).Value
                c = Feuil5.Cells.Find(what:=cherche, LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlNext).Row
                Dim b As Integer
                cherche = Feuil2.Range("C" & MaLigne).Value
                b = Feuil5.Cells.Find(what:=cherche, LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlNext).Column
                Dim e As Integer
                e = c + 1
                Sheets("Statistiques").Cells(b & e) = Sheets("Statistiques").Cells(b & e).Value + 1

                Il n'y aucun bug avec cette formule mais il n'y a pas de plus 1 non plus dans le tableau "statistiques"...
                0
                1. Contributeur
                  Bonjour,
                  Feuil2.Range("A" & K) => ceci est correct, Range accepte comme parametre une adresse de plage
                  Range(b & e) => ceci nest pas correct, si tu veux spécifier un numéro de ligne et de colonne, il te faut utiliser cells(ligne, colonne) : Feuil5.Range(b & c) devient Feuil5.cells(c, b)
                  ensuite y' pas mal de choses que je ne comprends pas dans ton code :
                  - While Feuil2.Range("A" & K) <> ""
                  K = K
                  => ça c'est tres étrange
                  - ensuite tu dis : "trouver dans une liste feuillle 2, la dernière ligne du tableau et de se servir de deux données de cette ligne pour remplir un tableau Feuille5"
                  => si c'est pour trouver la derniere ligne, pourquoi utiliser la methode find (en plus tu utilises Row et Column là ou tu pourrais utiliser .address) ?
                  Peux stp stp ré-expliquer ce que tu cherches à faire ?
                  0
                  1. Je vais essayer d'expliquer simplement :

                    En fait grâce à un Userform, je remplie une liste d'objet (Feuil2). La formule qui pose problème, sert en fait, à se servir de la dernière ligne ajoutée pour remplir un tableau statistique.

                    je me sers du numéro de l'unité et de la date à laquelle elle a été enregistré (supposé ("B" & K) et ("C" & K) pour retrouver la bonne case dans le tableau "statistiques" (feuille5) dont les colonnes sont triés par agences et les lignes par date.

                    Je ne sais pas si c'est clair. Je vais essayer de me servir de vos conseils pour le rendre enfin efficace.
                    0
                2. Contributeur
                  ok merci. fait pas chaud dehors avec le mistral!

                  yte donne une proposition dans une heure maxi
                  0
                  1. Alors pour les lignes de la colonne A de la feuille 2, c'est environ 300. pour la feuille 5, la zone du tableau est (A1:DN1467).
                    0
                    1. Contributeur
                      je facilite la tâche de ceux qui s'y connaissent un peu plus que moi.
                      Hélas, ca fait l'effet inverse...

                      combien de lignes (environ) à parcourir dans la colonne A de la feuille 2 ?
                      As tu besoin de mobiliser toute la feuille 5 (cells) ou qu'elles sont les limites de la zone (par Ex A3:AA3456) ?

                      suivant ces données, la méthode peut-être complètement différente .

                      Je reviens en fin d'après midi.
                      0
                      1. Oh ne vous enervez pas, je n'exprimais aucun reproche, seulement la détresse dans laquelle je suis ;) Je multiplie les messages car il me semble que j'avance un peu et que donc je facilite la tâche de ceux qui s'y connaissent un peu plus que moi.

                        Je vous remercie de votre aide !
                        0
                        1. Contributeur
                          Tu nous laisse le temps d'arriver, oui?
                          on n'est pas des machines, N. d. D.
                          on est aussi bénévoles...
                          0
                          1. Personne a une petite idée... j'en ai vraiment besoin... Qu'est-ce qui pourrait clocher dans cette ligne alors que b et e sont bien identifié par vba (quand je passe dessus avec ma souris les bonnes valeurs s'affichent). Le problème seraient donc dans la formule... comment ajouter 1 a une valeur donnée ?

                            Sheets("Feuil5").Range(b & e) = Sheets("Feuil5").Range(b & e).Value + 1
                            0
                            1. J'ai un peu avancé, cela fonctionne jusqu'à la ligne:

                              Feuil5.Range(b & c).Offset(0, 1) = Feuil5.Range(b & c).Offset(0, 1).Value + 1

                              Private Sub CommandButton3_Click()
                              Dim K As Integer
                              K = 1
                              While Feuil2.Range("A" & K) <> ""
                              K = K
                              Dim c As Integer
                              Dim cherche As String
                              cherche = Feuil2.Range("B" & K).Value
                              c = Feuil5.Cells.Find(what:=cherche, LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlNext).Row
                              Dim b As Integer
                              cherche = Feuil2.Range("C" & K).Value
                              b = Feuil5.Cells.Find(what:=cherche, LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlNext).Column
                              Feuil5.Range(b & c).Offset(0, 1) = Feuil5.Range(b & c).Offset(0, 1).Value + 1
                              Wend
                              With Sheets(2).Cells
                              Selection.AutoFilter Field:=1
                              End With
                              Feuil4.Visible = True
                              Feuil2.Visible = False
                              End Sub
                              0
                              1. J'ai un peu modifié la formule qui bloque au niveau de "cherche = Sheets("Feuil2").Range("B" & K).Value". l'erreur 9 me dit que l'indice n'appartient pas à la sélection.
                                Ce que je souhaite faire pour vous expliquer, c'est trouver dans une liste feuillle 2, la dernière ligne du tableau et de se servir de deux données de cette ligne pour remplir un tableau Feuille5.

                                Private Sub CommandButton3_Click()
                                Dim K As Integer
                                K = 1
                                While Feuil2.Range("A" & K) <> ""
                                K = 1 - 1
                                Dim c As Integer
                                Dim cherche As String
                                cherche = Sheets("Feuil2").Range("B" & K).Value
                                c = Sheets("Feuil5").Cells.Find(what:=cherche, LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlNext).Row
                                Dim b As Integer
                                cherche = Sheets("Feuil2").Range("C" & K).Value
                                b = Sheets("Feuil5").Cells.Find(what:=cherche, LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlNext).Column
                                Sheets("Feuil5").Range(b & c).Offset(0, 1) = Feuil5.Range(b & c).Offset(0, 1).Value + 1
                                Wend
                                0
                                • 1
                                • 2