VBA macro et fonction RECHECHEV

Résolu
Bonjour à tous

j'utilise dans une macro la fonction RECHERCHEV ci-dessous
'=RECHERCHEV($G6;Feuil1!$A:$E;2;FAUX)
je renvoie la valeur de la colonne 2 du tableau feuille1 qui démarre en A et fini en E
MAIS ma colonne qui contient le valeur à renvoyer est variable (je dois renvoyer la colonne 3 ensuite
comment dire à ma macro que mon numéro de colonne est variable ?
J'ai essayé en déclarant une variable R par dim R as integer puis j'ai mis R à la place de 2 mais
cela ne marche pas
Merci pour votre aide à tous

mimi

7 réponses

  1. Bonjour,

    Je n'ai pas eu le temps de répondre. Le boulot, les études ...

    Ceci dit, j'ai regarder la syntaxe du code et je n'y trouve que 2 choses bizarres !

    1) Les variables [ i ] et [ j ] ne sont pas déclarés.

    2) Dans l'instruction [ Cells(L, C).Select ], les lettres [ L ] et [ C ] ne sont pas déclaré.

    Si tu veux tout sélectionner, l'instruction [ Cells.Select ] est suffisante.

    Voici ce que ça donne :

    Sub PlanningMarque()
    
    
        Dim Marque As String
        Dim Compteur As Double
        Dim Compteur2 As Double
        Dim Model As String
        Dim Segment As String
        Dim BodyType As String
        Dim Temps As String
        Dim i As Long, j As Long
    
        'Initiatlisation des variables
        Compteur = -3 'colonne Concatener
        Compteur2 = -2 'colonne Transfert
        Compteur3 = -5
        Compteur4 = -4
    
        For i = 5 To 40 'i = Lignes
            For j = 6 To 31 'j = Colonnes
    
                ' traitement des variables
                Marque = Cells(2, j).Value
                Temps = Cells(1, j).Value
                Segment = Cells(i, 1).Value
                BodyType = Cells(i, 2).Value
    
                Cells(i, j).Offset(i, Compteur).Select
                ActiveCell.FormulaR1C1 = "=CONCATENATE(Segment, BodyType, Marque, Temps)"
                Cells(i, j).Offset(i, Compteur2).Select
                ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-1],Tableau!R6C1:R213C13, 6, 'False')"
                Model = Cells(i, 4).Value
                Cells(i, j).Select
    
                If Cells(4, j) Is Empty Then
                    Cells(i, j).Select
                    ActiveCell.FormulaR1C1 = "=CONCATENATE(Model, BodyType, Marque, Temps)"
                ElseIf Cells(4, j) Is Not Empty Then
                    'Cells(L, C).Select
                    Cells.Select
                    ActiveCell.FormulaR1C1 = "=VLOOKUP(Model,Tableau!R6C1:R213C13, 6, 'False')"
                End If
    
            Next i
            Compteur = Compteur - 1
            Compteur2 = Compteur2 - 1
    
        Next j
    
    End Sub
    '
    


    Je ne travaille que très peu avec l'instruction [ ElseIf ], mais je crois que tu dois valider
    cette structure de contrôle, tu pourrais essayer comme ceci :

    If Cells(4, j) Is Empty Then
        Cells(i, j).Select
        ActiveCell.FormulaR1C1 = "=CONCATENATE(Model, BodyType, Marque, Temps)"
    Else
        If Cells(4, j) Is Not Empty Then
            'Cells(L, C).Select
            Cells.Select
            ActiveCell.FormulaR1C1 = "=VLOOKUP(Model,Tableau!R6C1:R213C13, 6, 'False')"
        End If
    End If
    '
    


    Et le second If imbriqué est implicite :

    If Cells(4, j) Is Empty Then
        Cells(i, j).Select
        ActiveCell.FormulaR1C1 = "=CONCATENATE(Model, BodyType, Marque, Temps)"
    Else
        'Cells(L, C).Select
        Cells.Select
        ActiveCell.FormulaR1C1 = "=VLOOKUP(Model,Tableau!R6C1:R213C13, 6, 'False')"
    End If
    '
    


    Lupin
    4
    1. Bonjour Lupin,

      Bonne année 2009!

      Je me permets d'écrire ici car j'ai un problème similaire, sauf que c'est le nom de l'onglet que je veux déclarer en variable pour la formule de recherche verticale et non le nom de colonne. J'avais commencé une macro, mais Excel a bien planté et ne veut plus ouvrir mon fichier.
      Quand je mets ma variable dans ma formule recherchev, lors de l'exécution, il faut que je cherche via l'explorateur qui s'ouvre le fichier et l'onglet concerné pour chaque case concernée.

      En gros j'utilisais la chose suivante pour une donnée contenue dans la case A2 et A4 de mon onglet menu:

      Dim nouveau = Worksheet
      Dim ancien = Worksheet
      nouveau = Sheets(Worksheets("Menu").Range("A2").Value)
      ancien = Sheets(Worksheets("Menu").Range("A4").Value)
      nouveau.Select

      A ce moment-là, nouveau.Name renvoie bien le nom de l'onglet désigné dans la case A2.
      Mais si je fais la chose suivante, cela ne marche pas. Pourquoi?

      ActiveCell.FormulaR1C1 = "=VLOOKUP(ancien!C:C[1],2,FALSE)"
      Range("A2").Select

      Peux-tu m'aider?
      Merci.
      0
  2. Merci beaucoup LUPIN mais j'ai une anomalie
    j'avais une erreur de compilation (référence de variable incorrecte dans NEXT) : j'ai remplacé boucle par R

    Maintenant la macro bloque sur la ligne
    ActiveCell.Offset(0, 0).Value = Formule
    Le message est "erreur d'exécution 1004" erreur définie par l'application ou par l'objet

    Encore merci pour votre aide une seconde fois
    Mimi

    Dim Formule As String
    Dim R As Integer

    For R = 2 To 4
    Formule = "=RECHERCHEV($g6;Feuil1!$A:$E;" & R & ";FAUX)"
    ActiveCell.Offset(0, 0).Value = Formule
    ActiveCell.Offset(1, 0).Select
    Next R
    1
    1. Bonjour Iseult,

      Le jardinnage est commencé et je délaisse mon pc pour ma spatule :-)
      néanmoins, je veux bien tenter de t'aider si je peux.

      Perso, je n'ai jamais vraiment tenter de lire un fichier sans l'ouvrir,
      j'ai vu des exemples sur ExceLabo sur une méthode pour lire des
      fichier sans les ouvrirs, mais pour ma part je considère qu'il y a
      quand même une ouverture indirect.

      Ceci dit, dépose le code que tu tente d'assembler et si ce n'est
      pas moi, peut-être qu'un d'autre pourra te guider :-)

      Lupin
      1
      1. Salut,

        '=RECHERCHEV($G6;Feuil1!$A:$E;2;FAUX)
        Dim Formule As String
        Dim R As Integer
        
        For R = 2 to 4
          Formule = "=RECHERCHEV($G6;Feuil1!$A:$E;" & R & ";FAUX) 
        "
          Activecell.offset(0,0).Value = Formule
          Activecell.offset(1,0).Select
        Next Boucle
        


        Lupin
        0
        1. Bonjour
          je viens de voir votre réponse et j'aimerai savoir à quoi cela sert? merci d 'avance
          0
      2. re :

        Sub Test()
            Dim Formule As String
            Dim R As Integer
            
            For R = 2 To 4
                Formule = "=VLOOKUP($G6,Feuil1!$A:$E," & R & ",FAUX)"
                ActiveCell.Offset(0, 0).Value = Formule
                ActiveCell.Offset(1, 0).Select
            Next R
            
        End Sub
        
        


        Lupin
        0
        1. Merci beaucoup LUPIN : la macro fonctionne correctement maintenant (j'ai mis FALSE à la place de FAUX car j'avais comme résultat #NOM?)

          For R = 2 To 4
          Formule = "=VLOOKUP($G6,Feuil1!$A:$E," & R & ",FALSE)"
          ActiveCell.Offset(0, 0).Value = Formule
          ActiveCell.Offset(1, 0).Select
          Next R

          Bonne soirée à tous

          Mimi
          0
        2. Bonjour Lupin, je me permet de t'écrire car j'ai un problème semblable. J'ai une macro avec une boucle For Next et j'ai une erreur "référence de variable de contrôle incorrect dans Next". Voici le code de la sub, j'espère que tu pourrais m'aider : MERCI D'AVANCE

          Sub PlanningMarque()

          Dim Marque As String
          Dim Compteur As Double
          Dim Compteur2 As Double
          Dim Model As String
          Dim Segment As String
          Dim BodyType As String
          Dim Temps As String

          'Initiatlisation des variables
          Compteur = -3 'colonne Concatener
          Compteur2 = -2 'colonne Transfert
          Compteur3 = -5
          Compteur4 = -4

          For i = 5 To 40 'i = Lignes
          For j = 6 To 31 'j = Colonnes

          ' traitement des variables
          Marque = Cells(2, j).Value
          Temps = Cells(1, j).Value
          Segment = Cells(i, 1).Value
          BodyType = Cells(i, 2).Value

          Cells(i, j).Offset(i, Compteur).Select
          ActiveCell.FormulaR1C1 = "=CONCATENATE(Segment, BodyType, Marque, Temps)"
          Cells(i, j).Offset(i, Compteur2).Select
          ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-1],Tableau!R6C1:R213C13, 6, 'False')"
          Model = Cells(i, 4).Value
          Cells(i, j).Select

          If Cells(4, j) Is Empty Then
          Cells(i, j).Select
          ActiveCell.FormulaR1C1 = "=CONCATENATE(Model, BodyType, Marque, Temps)"

          ElseIf Cells(4, j) Is Not Empty Then
          Cells(L, C).Select
          ActiveCell.FormulaR1C1 = "=VLOOKUP(Model,Tableau!R6C1:R213C13, 6, 'False')"

          End If

          Next i
          Compteur = Compteur - 1
          Compteur2 = Compteur2 - 1

          Next j

          End Sub
          0
      3. Bonjour tindette,

        ActiveCell.FormulaR1C1 = "=VLOOKUP(ancien!C:C[1],2,FALSE)"

        Dans cet instruction, le mot [ ancien ] représente une variable, mais
        celle-ci étant entre guillemets, elle n'est pas interprèté.

        Revenons d'abord à l'instruction :

        ancien = Sheets(Worksheets("Menu").Range("A4").Value)

        Ici [ ancien ] sous-entend de façon implicite [ ancien.Name ],
        je te recommande de toujours être explicite, moins d'erreur
        lors de la compilation.

        d'où l'instruction explicite s'écrit comme suit :

        ancien.Name = Sheets(Worksheets("Menu").Range("A4").Value)

        Maintenant pour l'insertion de la formule.

        ActiveCell.FormulaR1C1 = "=VLOOKUP(ancien!C:C[1],2,FALSE)"

        doit être décomposé ainsi :

        ActiveCell.FormulaR1C1 = "=VLOOKUP(" & ancien.Name & "!C:C[1],2,FALSE)"

        Pour ma part, lorsque je construit une formule par programmation, je la pousse
        d'abord dans un variable pour en voir le contenu et en vérifier la syntaxe avec
        le déboggeur.

        De plus je rencontre souvent ce type de manoeuvre pour insérer une formule
        en utilisant le propriété [ FormulaR1C1 ] au lieu de [ Value ].

        La propriété [ FormulaR1C1 ] est une propriété permettant de lire la formule
        dans une cellule plutôt que sa valeur.

        Option Explicit
        
        Sub Test()
        
            Dim Formule As String
            Dim Valeur As Variant
            
            ' Insertion de la formule
            Formule = "=SUM(A2:A5)"
            ActiveCell.Value = Formule
            
            'Maintenant si tu veux lire la valeur
            Valeur = ActiveCell.Value
            
            ' Et si tu veux lire la formule
            Formule = ""
            Formule = ActiveCell.FormulaR1C1
            
            
            MsgBox ActiveCell.Value
            MsgBox ActiveCell.FormulaR1C1
            
        End Sub
        '
        


        Mais attention, ce n'est pas une obligation de travailler de cette façon.

        Bonne année 2009

        Lupin
        0
        1. Merci, cela fonctionne, mais pas avec nouveau.Name et ancien.Name pour affecter le contenu de la cellule.

          Voici le programme (en plus mon fichier Excel qui avait planté a pu se rouvrir), je vois le résultat qui est cela attendu et derrière, le fichier Excel plante de nouveau et ferme Excel. Je ne sais pas si c'est bien normal.

          Sub Macro4()
          ' déclare les variables qui seront utilisées en nom d'onglet
          Dim nouveau As Worksheet
          Dim ancien As Worksheet
          Dim x As Object
          ' affecte les valeurs des cellules de l'onglet menu aux variables
          Set nouveau = Sheets(Worksheets("Menu").Range("A2").Value)
          Set ancien = Sheets(Worksheets("Menu").Range("A4").Value)
          ' affiche les noms des variables ainsi définies
          MsgBox nouveau.Name
          MsgBox ancien.Name
          'sélectionne le nouvel onglet créé
          nouveau.Select
          Range("B2").Select
          'tente de faire une recherche verticale en désignant l'onglet ancien
          '(à partir de la variable)
          ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-1]," & ancien.Name & "!C[-1]:C,2,FALSE)"
          ' colle la formule sur toute la colonne B jusqu'à la ligne 28000
          Selection.AutoFill Destination:=Range("B2:B28000"), Type:=xlFillDefault
          Range("B2:B28").Select
          ' sélectionne l'onglet ancien
          ancien.Select
          Range("B2").Select
          Set nouveau = Nothing
          Set ancien = Nothing
          End Sub
          0
        2. @tindetteLe plantage, j'ai trouvé, c'est à cause du 28000, ça mouline longtemps pour recalculer.
          En fait à la place de 28000, je voudrais mettre le N° de la dernière ligne contenant une valeur dans la colonne A, mais je ne sais pas comment faire. Je vais chercher. En attendant, je mets 5000, cela couvre tous mes cas de fichiers et rame moins.
          0
        3. @tindetteJ'ai trouvé !

          Voici le programme qui marche avec les commentaires! Merci pour ta réponse!

          Sub Macro4()
          ' déclare les variables qui seront utilisées en nom d'onglet
          Dim nouveau As Worksheet
          Dim ancien As Worksheet
          Dim DLigne As Variant
          ' affecte les valeurs des cellules de l'onglet menu aux variables
          Set nouveau = Sheets(Worksheets("Menu").Range("A2").Value)
          Set ancien = Sheets(Worksheets("Menu").Range("A4").Value)
          ' recherche et enregistre le N° de la dernière ligne de la colonne A
          DLigne = Range("A1").End(xlDown).Address
          DLigne = Range(DLigne).Row
          ' affiche les noms des variables ainsi définies
          MsgBox nouveau.Name
          MsgBox ancien.Name
          'sélectionne le nouvel onglet créé
          nouveau.Select
          Range("B2").Select
          'fait une recherche verticale du contenu de la colonne N-1 de cette ligne
          ' dans l'onglet ancien (à partir de la variable) et renvoie la colonne 2 de la zone sélectionnée
          ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-1]," & ancien.Name & "!C[-1]:C,2,FALSE)"
          ' colle la formule sur toute la colonne B jusqu'à la dernière ligne de la colonne A
          Selection.AutoFill Destination:=Range("B2:B" & DLigne), Type:=xlFillDefault
          Range("B2:B28").Select
          ' sélectionne l'onglet ancien
          ancien.Select
          Range("B2").Select
          Set nouveau = Nothing
          Set ancien = Nothing
          Set DLigne = Nothing
          End Sub
          0
      4. re:

        désolé j'avais omis l'instruction [ SET ] !

        Bonne continuité

        Lupin
        0
        1. Bonjour Lupin,

          Je vois que tu es bien calé sur le sujet.
          Ma question concerne la recherchev,
          en fait, j'aimerais faire un recherchev sur un fichier Excel sans l'ouvir.

          J'ai trouver les ligne pour aller chercher des données vers un fichier non ouvert (.csv exactement)
          de même j'ai trouver ton code pour le vlookup mais je n'arrvie pas à compiler les 2.
          J'avoue je ne suis vraiment pas une experte en VB.

          Pourrais tu m'aider si tu en as le temps.

          Merci d'avance

          Iseult
          0