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 :

Traduire INDIRECT dans VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 116
    Points : 67
    Points
    67
    Par défaut Traduire INDIRECT dans VBA
    Bonjour
    je souhaiterais traduire la fonction INDIRECT en code VBA.
    Dans la colonne A3:A de la feuille nommée Liste je récupère le nom de toutes les autres feuilles (environ 300)
    La ligne (plage) B2:BB contient la référence des cellules à renvoyer.
    j'ai la fonction =INDIRECT("'"&$A3&"'!"&B$2) aux intersections colonne-ligne.
    lors de nouvelles feuilles ou de valeurs à renvoyer il faut glisser la formule d'où les risques d'erreurs

    j'ai essayé ce code je bloque sur la deuxième partie
    merci

    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
    22
    23
    24
    25
    Sub liste()
    'Récupération du nom des feuilles dans la colonne A
    Dim ws As Worksheet
    Set ws = Worksheets("Liste")
    
    Dim nb As Byte
    nb = Worksheets.Count - 1
    
    Dim last_row As Long
    last_row = ws.Range("A65000").End(xlUp).Row
    
    ws.Range("A2:A" & last_row).Clear
    
      For i = 9 To nb
       On Error GoTo 0
         ws.Cells(i - 6, 1) = Worksheets(i + 1).Name
    
      Next i
    
    'Récupération des valeurs. comme INDIRECT
      
    For j = 2 To 40 
        ws.Cells(j, 3).Value = sheets("'"&a3&"'"!"&a12"").value
      Next
    End Sub

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 385
    Points : 661
    Points
    661
    Par défaut
    Bonjour counterbob,

    Je ne vois pas trop où est ton problème... Ta formule fonctionne très bien, même quand tu la tires.

    Pourquoi vouloir passer par VBA ?

    Peux-tu nous en dire plus stp ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 116
    Points : 67
    Points
    67
    Par défaut
    Bonjour,
    ce classeur est en réseau et les utilisateurs ne connaissent pas vraiment les fonctions.
    et lorsque l'on veut récupérer des données en rajoutant une référence de cellule dans la ligne 2 on oublie de tirer la formule.
    de plus le classeur fait 3Mo et je pensais que limiter les valeurs des cellules limiterais la taille du classeur.
    environ 6000 cellules contiennent la formule.

    merci

    J'ai réalisé ce code , ça fonctionne bien, un peu lent à mettre à jour mais ça va

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Sub liste()
     
    'Récupération des noms de feuilles
    Dim ws As Worksheet
    Set ws = Worksheets("Liste")
     
    Dim nb As Byte
    nb = Worksheets.Count - 1
     
    Dim last_row As Long
    last_row = ws.Range("A65000").End(xlUp).Row
     
    ws.Range("A2:A" & last_row).Clear
     
    For i = 9 To nb
        On Error GoTo 0
        ws.Cells(i - 6, 1) = Worksheets(i + 1).Name
     
    Next i
     
     
    'Création de la formule et copie dans la plage B3:BB100
    Range("B3").Select
        ActiveCell.FormulaR1C1 = "=IF(ISERROR(INDIRECT(""'""&RC1&""'!""&R2C)),"""",INDIRECT(""'""&RC1&""'!""&R2C))"
        Range("B3").Select
        selection.AutoFill Destination:=Range("B3:bb3"), Type:=xlFillDefault
        Range("B3:BB3").Select
        selection.AutoFill Destination:=Range("B3:bb100"), Type:=xlFillDefault
        Range("B3:BB100").Select
        ActiveWindow.SmallScroll Down:=-93
        Range("B3").Select
     
    End Sub

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 960
    Points : 28 970
    Points
    28 970
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    C'est lent notamment parce-que tu utilises la méthode Select et la propriété Selection
    La méthode AutoFill n'est pas indispensable, tu peux parfaitement écrire une formule directement dans plusieurs cellules.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     With ThisWorkbook.Worksheets("db")
     .Range("S2:S10000").Formula = "=M2*L2"
     End With
    Une autre raison de sa lenteur peut provenir de la fonction INDIRECT elle-même qui est une formule volatile. Cela signifie qu'elle se recalcule chaque fois que l'on modifie une valeur quelconque, de n'importe quelle feuille de n'importe quel classeur ouvert.

  5. #5
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    eh oui Philippe, que je salue, j'avais préparé ce code, à tester
    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
    .....
    For i = 9 To nb
      On Error GoTo 0 'ça c'est ton problème, pour moi pas d'intérêt
      ws.Cells(i - 6, 1) = Worksheets(i + 1).Name
     
    Next i
     
     
    'Création de la formule et copie dans la plage B3:BB100
     
    Range("B3:BB100").FormulaR1C1 = "=IF(ISERROR(INDIRECT(""'""&RC1&""'!""&R2C)),"""",INDIRECT(""'""&RC1&""'!""&R2C))"
    'ci-dessous,pour faire quoi ? mais c'est ton problème
    ActiveWindow.SmallScroll Down:=-93
    Range("B3").Select
    .....

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 116
    Points : 67
    Points
    67
    Par défaut
    J'ai réduit le code
    effectivement c'est plus clair, la mise à jour prend 10s
    merci Philippe, merci Dom

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

Discussions similaires

  1. liste indirecte dans une boucle VBA
    Par visa76 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/06/2013, 21h51
  2. Traitement d'erreur dans VBA
    Par charleshbo dans le forum VBA Access
    Réponses: 9
    Dernier message: 10/02/2006, 14h03
  3. Utilisation d'un résultat de requete dans VBA
    Par marie10 dans le forum Access
    Réponses: 3
    Dernier message: 30/01/2006, 10h29
  4. appel module dans vba
    Par scully2501 dans le forum Access
    Réponses: 3
    Dernier message: 14/09/2005, 16h37
  5. Réponses: 3
    Dernier message: 22/10/2004, 12h04

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