Excel 2007: Chercher valeur d'1 cellule dans plusieurs feuilles

Résolu
Bonjour,

Je voudrai svp savoir comment avec VBA, faire une condition sur une chaîne de caractère, en cherchant dans toutes les feuilles du classeur et en cherchant après dans toutes les colonnes de la première ligne.
J'ai essayé plusieurs choses mais ça ne marche pas:
For Each ws In ActiveWorkbook.Worksheets
                 clom_num = ws.Range("A1").End(xlToRight).Column
                      For Chx = 1 To clom_num
                          If ws.Cells(1, Chx).Value = "Pick List Name" Then
                               clnm_name = ws.Cells(2, Chx).Address
                          End If
                      Next
                       With ws.Range("clnm_name:clnm_name").Validation
                         .Delete
                         .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                          xlBetween, Formula1:=Liste
                          .IgnoreBlank = True
                          .InCellDropdown = True
                        End With


Pourquoi ça me met l'erreur "La methode 'Range' de l'objet '_Worksheet' a échoué ?

SOS merci d'avance ^^

4 réponses

  1. Modérateur
    Bonjour,

    clnm_name étant une variable, il convient de ne pas la placer entre guillemets. Au lieu de
    "clnm_name:clnm_name"
    :
    clnm_name & ":" & clnm_name


    Sinon, plutôt que de faire colonne par colonne, tu pourrais utiliser la méthode find pour te renvoyer ton objet Range :

    Dim MyRange As Range
    For Each ws In ActiveWorkbook.Worksheets
       clom_num = ws.Range("A1").End(xlToRight).Column
       Set MyRange = ws.Range(Cells(1, 1), Cells(1, clom_num)).Cells.Find("Pick List Name")
       If Not MyRange Is Nothing Then
          'Ici on a trouvé "Pick List Name"
          MsgBox MyRange.Address
       Else
          'Ici on n'a pas trouvé
       End If
    Next

    Cordialement,
    Franck
    0
    1. Bonjour pijaku,
      Merci pour ta réponse, j'ai testé la méthode Find, mais ça me donne toujours la même erreur lors de l'exécution sur cette ligne :

      Set MyRange = ws.Range(Cells(1, 1), Cells(1, clom_num)).Cells.Find("Pick List Name")

      Erreur :La methode 'Range' de l'objet '_Worksheet' a échoué

      est ce que ça a rapport avec le "ws" ?
      0
      1. Modérateur
        Essayez ceci :

        Dim MyRange As Range, ws As Worksheet
        For Each ws In ActiveWorkbook.Worksheets
           With ws
              clom_num = .Range("A1").End(xlToRight).Column
              Set MyRange = .Range(.Cells(1, 1), .Cells(1, clom_num)).Cells.Find("Pick List Name")
              If Not MyRange Is Nothing Then
                 'Ici on a trouvé "Pick List Name"
                 MsgBox MyRange.Address
              Else
                 'Ici on n'a pas trouvé
              End If
           End With
        Next


        Cordialement,
        Franck
        0
        1. J'ai trouvé comment faire à l'aide de la méthode Find .. finalement hihi .. voila la réponse:

          For Each ws In ActiveWorkbook.Sheets
                  Set MyRange= ws.Rows(1).Find("Pick List Name", , xlValues, xlWhole)
                  If Not MyRange Is Nothing Then
                      With ws.Columns(MyRange.Column).Validation
                          .Delete
                          .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                           xlBetween, Formula1:=Liste
                          .InCellDropdown = True
                      End With
                  End If
              Next ws


          Merci pijaku :):)
          0
          1. Modérateur
            De rien...

            Alors, oui, mais...
            Dans ton cas,
            xlvalues
            et
            xlwhole
            ne me semblent pas indispensables...
            A ta place j'utiliserais le dernier code que je t'ai donné, --> ICI <--
            Pourquoi?
            Parce que lorsque tu utilises la méthode find, Excel "enregistre" certains de ces paramètres, et notamment LookIn et LookAt (Voir ==> ICI <==)
            Comme tu ne spécifies rien, les valeurs par défaut (qui sont
            xlValues
            et
            xlWhole
            ) te conviennent tout à fait... Cela t'évitera de te creuser la tête une éternité la prochaine fois que tu utilises Find et que cela ne fonctionne pas.......
            0
          2. Ah super, merci pour l'explication, je ne me suis même pas prise la peine de comprendre ce que c'etait xlValue et xlWhole..
            Merci encore et bonne journée :)
            0