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 :

[VBA-E] Range("C30").Value = 7 fait tout buguer


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Par défaut [VBA-E] Range("C30").Value = 7 fait tout buguer
    salut tout le monde
    dite, j'ai un petit pb sur excel
    j'ai fait un programme avec vba que voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Option Explicit 
     
    Public Function b(flow As Double, flow_loss As Double) 
     
    Dim n As Double 
    n = flow - flow_loss 
    b = n 
    Range("C30").Value = 7 
    End Function
    puis dans la feuille excel,
    dans la cellule B34 est ecrit : =b(5;3) il apparait #VALUE! au lieu
    de -2
    par contre, si j'enlève la ligne Range("C30").Value = 7 il
    apparait le bon resultat : -2

    je ne comprend vraiment pas pourquoi
    (C30 n'est pas la cellule qui contient la fonction...)
    avez vous des idées ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonsoir

    Une fonction vba utilisée dans une feuille de calcul ne peut pas modifier le contenu d'une cellule.

    Cette interdiction est nécessaire pour permettre à Excel de recalculer les cellules sans interférences
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Par défaut
    pourtant, la ligne problematique marche à l'intérieur d'une procédure,
    ex qui marche ci dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub b() 
    Range("C30").Value = 7 
    End Sub
    c'est pour ca que ca me parait bizzard

    (de plus, j'ai d'autres exemples ou excel interfère:

    A1 = 3
    A2 = 2
    A3 = Sum(A1+A2)

    j'ai fait une macro qui dit :
    A1=A3 jusqu'à ce que A3>100

    dans cette exemple, excel interfere avec VBA et ca marche tres bien...)

    merci de ta reponse

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    A l'intérieur d'une procédure, c'est normal qu'elle fonctionne, et c'est heureux

    Mais j'ai dit que cela ne pouvait pas fonctionner à l'intérieur d'une fonction utilisée dans une feuille de calcul
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Par défaut
    ok, j'explique entièrement mon problème en espérant qu'il y a une autre solution dans laquelle vous pouvez m'aiguiller

    je dois realiser une boucle je pense

    je pars d'un nombre que j'invente (ex : 4)

    apres beaucoup de calcul dans la feuille excel (que je ne peux pas ecrir en vba) j'obtient un resultat approximatif à partir de ce nombre.

    pour affiner ce resultat approximatif, j'aimerais que ce resultat approximatif refasse le meme chemin de calcul que le premier nombre que j'avais inventé (4), c'est-à-dire que j'aimerais copier ce resultat approximatif, puis le collé à la place du nombre 4...pour obtenir un second resultat plus precis

    ce second resultat plus precis, j'aimerais qu'il fasse aussi le meme chemin que le nombre 4 (ainsi que le resultat approximatif)...ce qui me donnerais à troisième résultat encore plus précis...

    etc...

    et j'aimerais donc faire des copier-collé de résultats pour le remettre en variable de départ comme expliqué précédemment jusqu'à ce que le resultat ne change pas beaucoup si il refait le chemin...

    j'ai crée cette fonctions simple qui ne marche pas, mais j'arrive à contourner ce problème, je pourrais resoudre un plus grand...:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Function b(flow As Double, flow_loss As Double)
    Dim n As Double
    n = flow - flow_loss
    b = n
    Range("C34").Value = n
    End Function
    j'ai besoin d'une fonction pour qu'elle soit toujours vrai sans avoir rien à taper (pas d'une procédure)
    j'ai besoin de repasser par les resultats de la feuille excel car ceux-ci sont obtenus dans un tableau et que que je sais pas traduire en vba

    voila ! j'espere avoir été un peu plus clair cette fois ci

  6. #6
    Expert confirmé
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Par défaut
    Hello,

    comme le dit Pierre, ce code ne peut pas être appelé par une FONCTION, mais par une PROCEDURE.

    A ta place je ferais un bouton, qui lance la procédure n fois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim i as Long, j as Long
     
    i = InputBox("Entrez le nombre d'itérations")
    For j = 1 to i
     ' code d'appel de ta sub
    Next j

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Par défaut
    mais je ne veux pas de bouton

    car une autre vba genere un tableau comme suit :
    A1 = 1 B1=1 C1...D1...
    A2 = 1+A1 B2=1+A1
    A3 = f(A2) B3=f(B2)

    la fonction doit donc etre calculé à tout instant

    je fait je veux contourner une reference circulaire qui s'arretait quand la solution ne change plus

    je pose la question sur un autre forum et personne trouve...
    il doit bien il y avoir un moyen non ?
    j'ai essayé de lancé une procédure à l'interieur d'une fonction, mais non...

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Tu ne couperas pas à une procédure...

    Ce que tu peux faire, c'est utiliser une procédure événementielle à la modification d'une cellule, procédure dans laquelle tu peux boucler et qui peut appeler ta fonction, mais ce sera la procédure qui modifiera C34

    Vois-tu une piste dans ce que je te propose?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Par défaut
    je crois que t'a raison, je peux pas y couper
    je vais faire comme tu me dis , une procedure evenementielle

    je pense que je devrais y arriver

    je veux vous remercier, Pierre (je viens de comprendre ta signature...) et Cafeine

    les gens comme vous font d'internet un tres beau monde

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 567
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 567
    Par défaut
    bonjour
    si j'ai bien compris ton probleme
    tu entre une aproximation de ton resultat, disons 4 le tableau excel sort une réponse disons 3.5, et tu veux réentre 3.5 en entrée de tableau pour en ressortir une précision suplementaire et recommencer.
    utilise plutot une evenementielle quand calculate plutot que quand change, et comme c'est une boucle, tu devrais prévoir une précision maximale pour la stopper.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_Calculate() 
     n = flow - flow_loss
    b = n
    if flow - flow_loss>0.0001 then Range("C34").Value = n
    end sub
    cette boucle fonctionne, mais a mon avis tu devrais plutot utiliser le solveur, il est quanq meme la pour ça. et es tu sur qu'on ne puisse pas, 1 soit mettre ton tableau en vba, 2 soit modifier le tableau?
    de plus a mon avis ton calcul ne te mene a rien si a 4 tu obtiens 3.5 a 3.5 tu obtiendra 3.5 - x, a 3.5 -x tu obtiendras 3.5-x -y, et au final tu obtiens un nombre proche du 0.0001 de la precision que tu a entrée. je pense plutot que ton 4 est un nombre que tu entre pour arriver a résultat que tu connais déja genre (simpliste, je sais)
    3x = 15, je rentre 4 ça fais 12, je rentre 4.5 ça fait 13.5, je rentre 5 ça marche
    dans ces conditions, et si je me trompe pas, apprend a utiliser le solveur et tu auras directement ton résultat sans modifier ton tableau ni faire de macro

Discussions similaires

  1. Echappement de quote dans input/value
    Par pc.bertineau dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 10/09/2007, 14h27

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