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 :

Récupérer une valeur de celulle qui est le résultat d'une fonction Excel sous VBA [XL-2019]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Data_Analyst
    Inscrit en
    Décembre 2020
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Data_Analyst

    Informations forums :
    Inscription : Décembre 2020
    Messages : 35
    Par défaut Récupérer une valeur de celulle qui est le résultat d'une fonction Excel sous VBA
    Bonjour les geeks,

    J'ai un petit problème car j'ai beau essayé plusieurs solution, aucune ne fonctionne.
    Dans une celulle Excel, j'ai une fonction SI(condition;vrai;faux)
    Cette fonction me renvoie un resultat que je veux copier dans une variable sous VBA:


    Dim MaVar
    MaVar = Worksheets("Nom de ma feuille").Cells(indexligne,indexcolonne).Value
    MsgBox(MaVar)

    Résultat : MaVar est vide !

    Même résultat avec MaVar = Worksheets("Nom de ma feuille").Range("Macellule").Value

    Quelqu'un peut-il m'aider svp, c'est vraiment important !

    Bien à vous !

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Bonjour, chez moi ça fonctionne sans problème. Pour test, en B1 j'ai mis une simple formule =SI(ESTVIDE(A1);"";A1) et une macro pour récupérer la valeur de B1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
    Dim MaVar As Variant
    MaVar = Worksheets("Feuil1").Range("B1").Value
    MsgBox (MaVar)
    End Sub
    Que ce soit .Range ou .Cells, les 2 fonctionnent, la macro affiche le contenu de B1.
    A part te tromper dans le nom de la feuille ou ne pas récupérer la bonne cellule, je vois pas d'où peut provenir le problème.

  3. #3
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 510
    Par défaut
    Bonjour,

    Excel peut être sournois, combien as-tu de classeurs ouvert quand tu fais le test ? Si plus d'un alors Worksheets("Nom de ma feuille").Cells(indexligne,indexcolonne).Value se réfère au classeur actif.

    Sinon, mettre un point d'arrêt sur la ligne
    MaVar = Worksheets("Nom de ma feuille").Cells(indexligne,indexcolonne).Value et contrôler la valeur d'indexligne et d'indexcolonne.

  4. #4
    Membre averti
    Homme Profil pro
    Data_Analyst
    Inscrit en
    Décembre 2020
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Data_Analyst

    Informations forums :
    Inscription : Décembre 2020
    Messages : 35
    Par défaut Merci pour vos réponses
    Bonjour,

    Du coup vu que ça fonctionne de votre coté, j'ai essayé dans un autre pc et par hasard, ça fonctionne aussi mais parce que dans mon autre pc, il m'a dit que la procédure est trop longue du coup j'ai effacé plein de ligne. Donc pour résumé, le problème était du à une procédure trop longue car en supprimant des lignes de code, ça fonctionne.

    Du coup, je me retrouve dans un autre problème, il faut que je créer une fonction qui devra être appeler dans un boutonclick() je m'explique :
    j'ai une feuille excel avec plein de champ que je dois saisir à la main. Une fois saisie, j'ai crée un bouton que lorsque je click dessus, il va stocker chaque champ dans 1 variable puis il va remplir une autre feuille excel a partir des valeurs contenu dans la variable. Sauf qu'il y a tellement de champs, que ma procédure ne veut plus marcher pour des champs ou la valeur est le resultat d'une fonction.
    Du coup, je souhaite créer une fonction qui prend en paramètre le nom de toutes les variables que je vais surement mettre dans une liste, puis parcourir avec une boucle pour remplir les cases de l'autre feuille une par une.
    Je ne sais pas si c'est clair pour vous mais en python je sais le faire sauf qu'en VBA, je ne sais pas !
    Quelqu'un à une idée svp ?

  5. #5
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 510
    Par défaut
    Bonjour,
    Pas trop compris, mais puisqu'il existe une fonction en Python j'aimerais bien la voir pour en savoir un peu plus.
    Sinon, au lieu de coller les valeurs dans une variable puis de les récupérer pour les mettre sur l'autre feuille pourquoi ne pas écrire directement les valeur de la première feuille vers la deuxième ?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 511
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 511
    Par défaut
    Citation Envoyé par qvn83 Voir le message
    Bonjour,

    Du coup vu que ça fonctionne de votre coté, j'ai essayé dans un autre pc et par hasard, ça fonctionne aussi mais parce que dans mon autre pc, il m'a dit que la procédure est trop longue du coup j'ai effacé plein de ligne. Donc pour résumé, le problème était du à une procédure trop longue car en supprimant des lignes de code, ça fonctionne.
    Il y a quelque chose qui vient d'allumer un énorme voyant rouge dans ce commentaire: il m'a dit que la procédure est trop longue
    N'y a t'il pas en premier lieu un problème avec ton code source ?
    Respectes-tu le SRP ? La Loi de Demeter ?
    Ne faudrait-il pas le refactoriser ?

  7. #7
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 510
    Par défaut
    Re,
    En VBA tu as la possibilité d'utiliser des fonctions ou des procédures, je te laisse le loisirs de regarder sur la toile la différence.
    Tu as aussi la possiblilité d'utiliser des paramètres dans les Procédures ou fonctions.
    Petit exemple cidessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Sub GetArrayValues(ByVal Values As Variant)
        Dim item As Variant
        For item = LBound(Values) To UBound(Values) Step 2
            Debug.Print Values(item); vbTab; Values(item + 1)
        Next item
    End Sub
     
    Public Sub TestArray()
        GetArrayValues VBA.Array("Index1", "Index1.1", Date, DateAdd("d", 10, Date))
    End Sub
    Ici on se sert d'un tableau en guise de paramètres (Values), Values est de type variant donc tu peux lui assigner ce que tu veux un type String, Object ou autre..
    Copie le code dans un module, met le curseur dans la procédure TestArray et appuie sur la touche F8 à plusieurs reprise pour faire du pas à pas.

  8. #8
    Membre averti
    Homme Profil pro
    Data_Analyst
    Inscrit en
    Décembre 2020
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Data_Analyst

    Informations forums :
    Inscription : Décembre 2020
    Messages : 35
    Par défaut @valtrase
    En python pour créer une fonction il suffit de la définir avec ses paramètres:
    def remplir_champ(param1,param2,...,paramx)
    'Code de la function'
    Ensuite pour la faire fonctionner, il faut taper son nom avec les valeurs que tu veux mettre en paramètre : remplir_champ("hdjdj","jfjdj",...)
    et en paramètre, je comptais mettre tous les champs dans une liste, puis faire une boucle pour parcourir chaque élément de la liste et récupérer la valeur pour le paramètre.
    En VBA ça doit être pareille pour la déclaration d'une procédure :
    Sub remplir_champ(Dim param1,Dim param2...)
    End Sub
    Sauf que pour l'appeler Ã* l'intérieur d'un bouton click puis attribuer le tout Ã* chaque case sur une feuille Excel, ça me semble trop compliqué.
    Du coup, j'ai crée deux bouton et j'ai divisé mon code en 2 parties.
    Et pourquoi je passe par des variables, c'est parce que les valeurs des champs de la feuille "xxx" changent constamment et moi je veux que les valeurs que je rentre dans l'autre feuille qui est un tableau correspondent ligne par ligne:
    ligne1: val1,val2,val3
    Ligne2: val11val22,val33
    ...
    Sachant que val1 et val11 sont dans une même cellule et changent en fonction d'une autre cellule ....
    Enfin bref, j'ai résolu mon problème.
    Merci Ã* vous

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

Discussions similaires

  1. [XL-2007] Ouvrir un fichier a partir d une cellule excel sous VBA
    Par Fandeliza dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/02/2017, 17h36
  2. [XL-2003] Vérifier le nom d'une feuille Excel sous VBA
    Par Virk59 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/08/2013, 20h51
  3. Formater le résultat d'une fonction perso sous VBA Excel
    Par miron_fds dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 07/06/2013, 15h07
  4. Intégration d'une fonction Excel dans VBA
    Par RéviAT dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/03/2008, 09h10
  5. Réponses: 2
    Dernier message: 22/02/2008, 10h54

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