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 :

Extraire la plage d'une formule


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Billets dans le blog
    17
    Par défaut Extraire la plage d'une formule
    Bonjour,

    Dans mon projet j'ouvre des classeurs , je recupere une formule donné par l'utilisateur. Pour l'instant je recupere la formule je la colle dans le classeur que j'ai ouvert et je recupere la valeur ( le resultat).
    J'aimerais ne pas ouvrir le classeur (très lourd d'ouvrir tous ces classeurs et des fois m'affiche des erreurs)
    Je souhaiterais donc à partir de la formule renseignée par l'utilisateur, remplacer les plages définies dans la formule et les ramplacer par des adresses en absolue, afin de recuperer la valeurs sans ouvrir le classeur
    j'aimerais un peu d'aide sur l'elaboration d'une fonction, ou des idées optimisées pour construire une fonction qui à partir d'une formule excel (exemple : recherchev(K9;E39:E233;2;Faux) ou autre), va extraire les plage E39:E233 et K9, pour ensuite la remplacer par mon adresse absolue & ma plage.


    Si vous l'avez deja fait je suis preneur, sinon juste des idées d'algo (pas forcement en vba, juste des critères ), c'est pas franchement evident etant donné que c'est quand même assez large.

    Je peux determiner si c'est un nombre ou une lettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Function IsLetter(ByVal character As String) As Boolean
        IsLetter = UCase$(character) <> LCase$(character)
    End Function
    et Isnumeric

    Manque plus qu'une bonne idée pour identifier une plage de facon optimale

    Merci d'avance

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par tamtam64 Voir le message
    J'aimerais ne pas ouvrir le classeur (très lourd d'ouvrir tous ces classeurs et des fois m'affiche des erreurs)
    A part en allant piocher directement sur des secteurs disque (chose que je n'ai vu qu'à une époque où les disquettes faisaient 360 ko), on ne peut lire (et, à fortiori, écrire) des données dans un fichier qu'en l'ayant ouvert sous une forme ou une autre.

    j'aimerais un peu d'aide sur l'elaboration d'une fonction, ou des idées optimisées pour construire une fonction qui à partir d'une formule excel (exemple : recherchev(K9;E39:E233;2;Faux) ou autre), va extraire les plage E39:E233 et K9, pour ensuite la remplacer par mon adresse absolue & ma plage.
    En supposant qu'il n'y a qu'une seule fonction (s'il y a des fonctions imbriquées, ça devient plus compliqué).
    Tu commences par virer tout ce qu'il y a jusqu'à la première parenthèse puis par virer la dernière parenthèse, pour ne garder que les paramètres.

    Avec un Splite, tu tronçonnes l'ensemble en prenant comme séparateur ";".

    Ensuite, tu n'a plus qu'à analyser chaque éléments caractère par caractère avec Mid() pour vérifier si le paramètre est constitué de lettres suivis de chiffres.
    Pense aussi à vérifier la présence d'un ":" pour les plages.

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    essaie avec un regex
    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
    Sub test()
    Dim formule As String
    formule = Cells(11, 1).Formula
     MsgBox formule
         With CreateObject("VBScript.RegExp"):
            .Global = True: .IgnoreCase = True: .Pattern = "([A-Z]{1,2})+(\d{1,10})+[^\w]+([A-Z]{1,2})+(\d{1,10})"
            Set matchs = .Execute(formule)
            MsgBox matchs.Count
             If matchs.Count > 0 Then
                result = matchs(0)
     
                  End If
        End With
        MsgBox result
    End Sub
    explication sur le pattern
    ([A-Z]{1,2}) veut dire 1 ou 2 lettres

    (\d{1,10}) veut dire de 1 a 10 chiffres

    [^\w] veut dire un caractere particulier en l'occurrence ici le ":"

    et rebelote pour la cellule de fin de la plage qui suit le ":"( les memes que les deux premiers )

    voili voilou

    bien entendu si tu veux la 2d adress de plage dans la formule c'est result = matchs(1) puis 2 pour la 3eme etc.....

    en gros le paterne identifie les suite de caractères representant une suite de : 1 ou plusieur letttres + 1 ou plusieur chiffres + le signe particulier(":") +1 ou plusieur lettres +1 ou plusieurs chiffre sans connaitre la chaine rechercher juste l'accabit
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Billets dans le blog
    17
    Par défaut Merci
    Salut Patrick,

    Je viens de tester, c'est une formidable solution, cependant si je teste =recherchev(V8;A8:Z21;2;Faux)
    il me trouve V8 et A8 et non V8 et A8:Z21
    je vais jouer sur le match alors
    Je pense que si je travaille le truc avec ton astuce je vais pouvoir reussir mon objectif merci beaucoup pour ce code

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    t'inquiet je l'ai fait pour toi

    voila la bonne formule pour trouver tes deux données

    la cellules de reference puis la plage de recherche

    j'ai fait le test avec ceci

    en cellule A12 j'ai mis
    =RECHERCHEV(C1;A1:A9;1;0)
    et voila le code
    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
    Sub test()
    Dim formule As String
    formule = Cells(12, 1).Formula
     MsgBox formule
         With CreateObject("VBScript.RegExp"):
            .Global = True: .IgnoreCase = True:
            'patern1 pour la cellule de reference
            .Pattern = "([A-Z]{1,2})+(\d{1,10}),"
           Set matchs = .Execute(formule)
              MsgBox matchs.Count
              If matchs.Count > 0 Then cellulereference = matchs(0)
             'patern2 pour la plage de recherche
            .Pattern = "([A-Z]{1,2})+(\d{1,10}):([A-Z]{1,2})+(\d{1,10})"
            Set matchs = .Execute(formule)
            MsgBox matchs.Count
             If matchs.Count > 0 Then plageaddress = matchs(0)
     
     
        End With
        MsgBox "cellule de  reference " & cellulereference & vbCrLf & "plage " & plageaddress
    End Sub
    Nom : Capture.JPG
Affichages : 487
Taille : 83,1 Ko

    MAIS ENTRES NOUS IL TE SERAIT TELLEMENT PLUS SIMPLE DE REECRIRE LA FORMULE TOUT SIMPLEMENT SURTOUT QU ELLE EST SIMPLE
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Billets dans le blog
    17
    Par défaut Merci
    Bonjour,

    En fait, je donne à l'utilisateur la possibilité de rentrer une formule de recherche ou de calcul dans une cellule. C'est une sorte de feuille de parametrage qui permet à l'utilisateur de recuperer la valeur d'une celulle en particulier dans un report .

    Cette valeur est dans une cellule, mais aussi peut etre recherché ou même etre un calcul
    ex
    =(SOMME.SI($D$5:$D$10000;"PEL";$G$5:$G$10000))
    ou
    =SOMME(B12;B11)

    Ceci dans un but de simplicité pour l'utilisateur, il peut à peu pres tout faire en terme de calcul à la condition que l'info soit dans le même onglet. Dans la feuille de parametrage se trouve le nom du classeur et le nom de la feuille ( c'est pour ca qu'il n'est pas necessaire de l'indiquer dans la formule)

    Ainsi je me retrouve avec des formules quelconque, ou je souhaite pouvoir remplacer chaque plage par son lien en absolue de facoàn a ne pas ouvrir le classeur.

    Je le fait pour juste une celulle avec la fonction ExecuteExcel4Macro mais pour le calcul c'est plus fastidieux.

    Si cela est trop compliqué, je reverais à la baisse cette liberté de fonction dans mon projet, mais si cela est possible effectivement je tente
    Je vais tester ton code et je te remercie bcp pour cette formidable solution.
    L'idee etant de ne pas ouvrir un classeur pour gagner du temps , mais pour autant pas en perdre avec une fonction trop compliqué qui ne ferait au final pas gagner de temps

    Merci

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

Discussions similaires

  1. Référence à une plage dans une formule de validation
    Par canard338 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/03/2016, 20h54
  2. [Toutes versions] Extraire un chiffre d'une formule simplement
    Par vatsyayana dans le forum Excel
    Réponses: 11
    Dernier message: 29/01/2015, 19h41
  3. Réponses: 5
    Dernier message: 15/07/2013, 12h12
  4. Extraire des lignes avec une formule
    Par maxxxime dans le forum Excel
    Réponses: 9
    Dernier message: 15/06/2010, 17h05
  5. modifier la plage d application d une formule
    Par Huubb dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/10/2006, 14h31

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