IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

vlookup dans differents onglets [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Djromé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 172
    Par défaut vlookup dans differents onglets
    Salut les Kracks,

    Ci-dessous mon code qui me pose problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
     
    'Below a private sub which should work each time when we change something on column C
    'will go for check on sheet Specialfees for taking the special condition fees (if there are!)
    Dim accrng As Range
      If Not Intersect(Target, Columns(3)) Is Nothing Then
          Set accrng = ActiveCell
       accrng.Offset(0, 2).Select
        ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-2],Specialfees!C[-4]:C[6],4,FALSE)"
          If IsError(ActiveCell.Value) Then
          ActiveCell.Delete
          Else
          accrng.Offset(0, 1).Select
          End If
      Else
       End If
      End Sub
    En effet, je lui demande d'aller me chercher dans une autre feuille l'information correspondante en Cx et de me l'indiquer en colonne Ex (de la même ligne) et si il n'y a rien, de m'effacer la formule afin que la cellule en Ex reste vide!
    Auriez-vous la solutions?

    P.s. Ma variable accrng correspond à la cellule en colonne C(3) que l'utilisateur modifie!

  2. #2
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 189
    Billets dans le blog
    2
    Par défaut
    Bonjour djRomé,

    peut-être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell.FormulaR1C1 = "=IF(ISERROR(VLOOKUP(RC[-2],Specialfees!C[-4]:C[6],4,FALSE)),"""",VLOOKUP(RC[-2],Specialfees!C[-4]:C[6],4,FALSE))"

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut Djromé et le forum
    Petite remaque, juste en passant : on sait que tu as un problème, mais pour trouver lequel on doit jouer aux devinettes. Avec des chances de tomber juste, ou d'être complêtement à côté. Serait mieux, à mon sens, d'expliquer quel est réellement le problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim Accrng As Range
    If Not Intersect(Target, Columns(3)) Is Nothing Then
    'si la cellule modifiée appartient à la colonne 3 (C), alors
        Set Accrng = Target
        'fixer la variable Accrng
        Accrng.Offset(0, 2).FormulaR1C1 = "=VLOOKUP(RC[-2],Specialfees!C[-4]:C[6],4,FALSE)"
        'La formule de la colonne E devient : C6 modifiée =>
        'E6 : "=RECHERCHEV(C6;Specialfees!A:K;4;0)" => Valeur de D de la ligne contenant C6 en A
        If IsError(Accrng.Offset(0, 2)) Then
        'Si on ne trouve pas de valeur, alors
            Accrng.Offset(0, 2).Delete
            'On efface E6
            Accrng.Offset(0, 2).Select
            'On selectionne E6
        Else 'Sinon
            Accrng.Offset(0, 1).Select
            'On selectionne D6
        End If
    End If
    End Sub
    Ton code, un peu modifié => pour ce que j'en comprends, il fonctionne. Mais juste quelques remarques d'ordre général :
    - Target peut contenir une ou plusieurs cellules. Même si tu penses que tu n'entreras jamais dans ce cas, l'éliminer n'est jamais une mauvaise idée.
    - Tu ne te sers pas de la feuille (Sh) : Une modification en C de la feuille "Specialfees" lancera la macro, mais n'importe quelle feuille la lancera aussi.
    - J'ai horreur des select/selection/ActiveCell, donc dans ma macro, je les ai shootés. Mais comme je ne sais pas si c'est nécessaire, j'ai sélectionné les mêmes cellules que toi pour la sortie de macro. Mais est-ce bien indispensable ?
    - Tu agis sur le module ThisWorkBook. Attention aux interactions possibles avec les modules de feuilles (Macros Worksheet_Change entre autres).
    - Les instructions If, si elles ne comportent pas une suite d'instructions en cas de condition fausse, n'ont pas besoin du Else : il ne sert qu'à ouvrir la possibilité aux instructions, mais peut être omis.
    - Ta formule R1C1 contient des colonnes en relatif. Comme elles sont fixes, je conseillerais de les mettres en adressage absolu (C1:C11 ou $A:$K en local) : ça ne change rien, mais ça évite de se poser des questions, quand tu reprends le code, longtemps après.

    Pour résumer : comme je ne connais pas le problème, et que le code (seul)fonctionne, demande infos !!!
    A+

  4. #4
    Membre confirmé Avatar de Djromé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 172
    Par défaut
    Merci à vous pour votre aide,

    Gorfael, merci vraiment beaucoup pour les explications de chacun des évènements qui me permettent de mieux comprendre ce que je fais et d'éviter surtout de futures erreurs (bien que je sais qu'il y en aura encore!).
    Tu as bien perçu mon besoin bien que je n'étais pas assez explicite sur le problème, désolé!
    Je pense que mon Activecell perdait la main voilà pourquoi ma sélection arrivait sur la ligne suivante (pas sur la même, donc!).
    Maintenant le code marche bien et je t'en remercie ainsi qu'à tototiti2008 pour votre temps!

    Gorfael, tu m'as indiqué mon utilisation de THISWORKBOOK:
    - Tu agis sur le module ThisWorkBook. Attention aux interactions possibles avec les modules de feuilles (Macros Worksheet_Change entre autres).
    Cependant j'aurai bien aimé mettre le code sur la feuille1 mais comme je demande l'interaction d'un autre onglet (specialfees), j'ai souvent eu des blocages à ce sujet. Voilà pourquoi j'ai préféré mettre ces évènements sur THISWORKBOOK.
    Aurais-tu une autre solution me permettant d'éviter (comme tu me l'a bien fait remarqué!) que la macro se lance sur tous les autres onglets tout en me permettant de travailler sur deux feuilles?
    - Tu ne te sers pas de la feuille (Sh) : Une modification en C de la feuille "Specialfees" lancera la macro, mais n'importe quelle feuille la lancera aussi.
    D'avance merci

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut Djromé et le forum
    Cependant j'aurai bien aimé mettre le code sur la feuille1
    Le gros problème de l'utilisation des modules de classe feuille vient des Select ou ActiveCell : VBA ne les conçoit que si les objets font partie de la feuille liée. Dans le module de Feuil1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
    Sheets("Feuil2").Range("A1") = 3
    End Sub
    Sub test1()
    Sheets("Feuil2").Select
    Range("A1").Select
    ActiveCell = 3
    End Sub
    À condition que Feuil2 existe, tu exécutes la macro Test sans aucun problème. Par contre, Test1 te retourne systèmatiquement une erreur => C'est dû au fait que la feuille active n'est plus celle qui est liée au module. Donc, il faut supprimer les select/selection/activecell, et ta macro fonctionnera quelque soit le module, à quelques restrictions près (pour les tris, je crois qu'ils ne peuvent se faire que sur la feuille active).

    Pour ton cas, le code que j'ai donné peut fonctionner quelque soit le module sur lequel tu le mets. Mais ce ne sera plus Workbook_SheetChange. Tu peux le mettre dans Worksheet_Change par exemple, et il fonctionnera à chaque changement d'une cellule de C.

    Ou, si tu veux conserver Workbook_SheetChange, il faut que tu testes si la variable Sh correspond bien aux feuilles qui doivent lancer la macro. Un simple test suffit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If sh.name<>"Feuil1" and Sh.name<>"Feuil2" then exit sub
    si la feuille est différente de Feuil1 et de Feuil2, alors sortir de la macro. Ou, en incluant le code dans le test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If sh.name="Feuil1" or Sh.name="Feuil2" then 
        'le code
    end if
    Les codes étant extrêmement simples, je n'ai pas testé.
    Quand tu apprends VBA, à travers les macro "apprentissage", excel met bêtement le code des opérations que tu effectues. Mais quand tu commences à faire des codes plus complexes, utiliser les macros à lancement automatique, tu te rends vite compte qu'il faut supprimer les Select/Selection (acivecell) : ils t'empêchent d'utiliser d'autres feuilles, ils rendent moins lisible le code et ils le ralentissent sans aucun avantage.
    A+

  6. #6
    Membre confirmé Avatar de Djromé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 172
    Par défaut
    Encore merci,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Automation]Exporter vers Excel dans differents onglets
    Par Didier71 dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/04/2007, 07h24
  2. CListCtrl dans des onglets
    Par BaBeuH dans le forum MFC
    Réponses: 3
    Dernier message: 13/06/2005, 12h59
  3. [CSS] Affichage dans different navigateur
    Par Shakta dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 22/04/2005, 11h12
  4. Réponses: 3
    Dernier message: 27/10/2004, 14h43
  5. [LDAP] recherche dans differents container LDAP avec Java
    Par touinth dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 01/07/2004, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo