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 :

Report de fonction d'une feuille aux autres


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 touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 533
    Par défaut Report de fonction d'une feuille aux autres
    Bonjour,
    Je suis toujours au niveau VBAExcel pour les nuls.
    Et pardon d'être aussi long.
    Je suis sous Excel 2000 (9.0.2812) et Windows XP Home avec SP2.
    J'ai fait une moulinette destinée à trier des données texte dans un ordre aléatoire. La fonction RAND est dans la cellule A1 de la feuille 1, les textes à trier dans la colonne B1 à Bn. Le tri aléatoire vise à placer, au hasard, l'un des textes en ligne 1 de la colonne.
    Le reste de la manip consiste à copier un à un ces textes sélectionnés au hasard sur la 2ème feuille du même classeur.
    Je constate que la fonction RAND et ses résultats vont polluer la 2ème feuille et perturbent la copie prévue sur cette feuille.
    Je ne comprend pas comment, en ayant sélectionné la 1ère feuille par son nom, la procédure se déroule en même temps dans la feuille 2, voire dans les suivantes. Le bout de code en question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ' installation de la formule aléatoire dans la colonne A de la feuille de départ
    Worksheets("feuille_syntagmes").Activate
    Worksheets("feuille_syntagmes").Range("A1").Select
        ActiveCell.FormulaR1C1 = "=INT(RAND()*20)"
            Range("A1").Copy
     
    For q = 1 To b - 1 'le compteur tournera jusqu'à la dernière ligne occupée....
     
        ActiveCell.Offset(1, 0).Activate       ' et collera la formule
        ActiveSheet.Paste                         '  tout le long de la colonne
    Next
    Range(Cells(1, 1), Cells(b, 1)).Select
    Calculate                               ' provoque au besoin la recalculation des                                    
                                                'nombre aléatoires
    Je sais qu'il existe un moyen plus simple de recopier ma formule dans une partie de la 1ère colonne mais je ne suis pas parvenu à la programmer. Laissons tomber pour le moment. Ce qui m'ahurit, c'est la contamination de la feuille 2 par ce qui se passe sur la feuille 1.
    merci pour tout élément de réponse.
    Cordialement
    Pierre
    (P.S: Si vous pensez que j'essaie d'imiter l'Oulipo, vous avez raison )

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim FL1 as Worksheet
            Set FL1 = Worksheets("feuille_syntagmes") 'instanciation de la feuille
            FL1.Range("A1").formula= "=INT(RAND()*20)" 'Insertion de la formule sur A1
            FL1.Range("A1").Copy destination:= Range("A2:A" & b-1) 'Copie/colle de A2 à A(b-1)
            Application.Calculate
    Teste déjà ça et dis-nous ce qui ne va pas

  3. #3
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 533
    Par défaut Report de fonction d'une feuille aux autres
    Ecoeurant. 4 lignes de code au lieu de 12, et ça marche !
    Bonjour quand même et merci.
    Petit souci: Le "RAND se recalcule à chaque clic. La ligne
    Application.Calculate
    pourrait paraître superflue mais j'avais remarqué que parfois
    le calcul ne se faisait pas, je n'ai pas pigé pourquoi un coup oui un coup non.
    Si quelqu'un peut m'éclairer.
    Encore merci. Après ça je pourrai cliquer sur Résolu
    Cordialement
    Pierre

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Petit souci: Le "RAND se recalcule à chaque clic.
    Où, ces clics ? Où se trouve ta macro et qu'est-ce qui la lance ?
    A+

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Par défaut
    à chaque recalcul les aléas() seront recalculés et toutes les cellules dépendantes modifiées

    il reste deux solutions

    soit inhiber le recalcul auto

    soit remplacer le rnd() par son résultat
    avec une macro de ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub auhasard()
    Dim v As Variant
    Dim d As Variant
    Dim f As Variant
    d = InputBox("nombre debut")
    f = InputBox("nombre fin")
    Randomize
    For Each v In Selection
    v.Value = Int((f - d + 1) * Rnd + d)
    Next v
    End Sub
    ou en faisant dépendre le calcul d'une cellule fixe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Function salea(mini As Long, maxi As Long, Optional racine As Double) As Double
    Static v As Double
    If Not IsMissing(racine) Then
    v = Int((maxi - mini + 1) * Rnd(-racine) + mini)
    salea = v
    Else
    v = Int((maxi - mini + 1) * Rnd(-v) + mini)
    salea = v
    End If

  6. #6
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 533
    Par défaut Report d'une fonction d'une feuille sur l'autre
    Bonjour,
    Je réponds pour l'instant à Ouskel'nor (pas encore eu le temps de digérer la réponse de Random (un nom prédestiné ).
    J'ai testé ton code au pas à pas détaillé et à chaque appui sur F8 la fonction se recalcule; je suppose que c'est pareil à l'exécution (c'était déjà le cas avec mon système rustique). Est-ce bien nécessaire ? Sais pas. Est-ce bien gênant ? Semble pas. Donc ma question était un peu oiseuse mais ce genre de gags m'inquiète comme un newbie .
    Cordialement
    Pierre

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/08/2013, 18h13
  2. Variable globale d'une feuille à l'autre
    Par gazavous dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 09/10/2008, 13h24
  3. Execution fonction dans une feuille
    Par Apranax dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 21/03/2008, 19h52
  4. Réponses: 10
    Dernier message: 02/02/2007, 16h00
  5. [VBA] Transmettre des données d'une feuille à l'autre
    Par Overflow64 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/12/2005, 09h58

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