VBA macro et fonction RECHECHEV

Résolu
mimi -  
 Marie -
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. Utilisateur anonyme
     
    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. tindette
       
      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. mimi
     
    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
  3. Utilisateur anonyme
     
    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
  4. Lupin
     
    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. Marie
       
      Bonjour
      je viens de voir votre réponse et j'aimerai savoir à quoi cela sert? merci d 'avance
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Lupin
     
    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. Mimi
       
      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. Michel_ja Messages postés 10 Statut Membre
       
      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
  7. Utilisateur anonyme
     
    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. tindette
       
      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
      1. tindette > tindette
         
        Le 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
      2. tindette > tindette
         
        J'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
  8. Utilisateur anonyme
     
    re:

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

    Bonne continuité

    Lupin
    0
    1. iseult
       
      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